aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2018-10-02 14:13:35 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2018-10-24 17:22:33 +0300
commit83e9a6c3896d2d8a949a7bece565bae7dfd1d967 (patch)
treec15aa059a36affb2dbd674a4cdab4c196b1e2a02 /platform
parent8dc48817b06a5a303cf2b778eda68cc3627dd625 (diff)
linux-gen: queue: add internal interface for adding/removing inline timers
Add internal queue interface functions queue_timer_add_fn_t and queue_timer_rem_fn_t for adding/removing inline timers. Signed-off-by: Matias Elo <matias.elo@nokia.com> Reviewed-by: Bill Fischofer <bill.fischofer@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'platform')
-rw-r--r--platform/linux-generic/include/odp_queue_basic_internal.h1
-rw-r--r--platform/linux-generic/include/odp_queue_if.h4
-rw-r--r--platform/linux-generic/include/odp_queue_scalable_internal.h1
-rw-r--r--platform/linux-generic/odp_queue_basic.c19
-rw-r--r--platform/linux-generic/odp_queue_scalable.c20
5 files changed, 43 insertions, 2 deletions
diff --git a/platform/linux-generic/include/odp_queue_basic_internal.h b/platform/linux-generic/include/odp_queue_basic_internal.h
index 41ca424c7..c8ed978ce 100644
--- a/platform/linux-generic/include/odp_queue_basic_internal.h
+++ b/platform/linux-generic/include/odp_queue_basic_internal.h
@@ -54,6 +54,7 @@ struct queue_entry_s {
ring_spsc_t ring_spsc;
};
+ odp_atomic_u64_t num_timers;
int status;
queue_deq_multi_fn_t orig_dequeue_multi;
diff --git a/platform/linux-generic/include/odp_queue_if.h b/platform/linux-generic/include/odp_queue_if.h
index 6ec7e24c2..5fe28dac1 100644
--- a/platform/linux-generic/include/odp_queue_if.h
+++ b/platform/linux-generic/include/odp_queue_if.h
@@ -39,6 +39,8 @@ typedef void (*queue_set_enq_deq_fn_t)(odp_queue_t queue,
queue_enq_multi_fn_t enq_multi,
queue_deq_fn_t deq,
queue_deq_multi_fn_t deq_multi);
+typedef void (*queue_timer_add_fn_t)(odp_queue_t queue);
+typedef void (*queue_timer_rem_fn_t)(odp_queue_t queue);
/* Queue functions towards other internal components */
typedef struct {
@@ -51,6 +53,8 @@ typedef struct {
queue_get_pktin_fn_t get_pktin;
queue_set_pktin_fn_t set_pktin;
queue_set_enq_deq_fn_t set_enq_deq_fn;
+ queue_timer_add_fn_t timer_add;
+ queue_timer_rem_fn_t timer_rem;
/* Original queue dequeue multi function (before override). May be used
* by an overriding dequeue function. */
diff --git a/platform/linux-generic/include/odp_queue_scalable_internal.h b/platform/linux-generic/include/odp_queue_scalable_internal.h
index 05932a36a..3c582076c 100644
--- a/platform/linux-generic/include/odp_queue_scalable_internal.h
+++ b/platform/linux-generic/include/odp_queue_scalable_internal.h
@@ -35,6 +35,7 @@ struct queue_entry_s {
sched_elem_t sched_elem;
odp_ticketlock_t ODP_ALIGNED_CACHE lock;
+ odp_atomic_u64_t num_timers;
int status;
queue_enq_fn_t ODP_ALIGNED_CACHE enqueue;
diff --git a/platform/linux-generic/odp_queue_basic.c b/platform/linux-generic/odp_queue_basic.c
index ccd97da1e..73a5536d8 100644
--- a/platform/linux-generic/odp_queue_basic.c
+++ b/platform/linux-generic/odp_queue_basic.c
@@ -806,6 +806,7 @@ static int queue_init(queue_entry_t *queue, const char *name,
queue->s.param.deq_mode = ODP_QUEUE_OP_DISABLED;
queue->s.type = queue_type;
+ odp_atomic_init_u64(&queue->s.num_timers, 0);
queue->s.pktin = PKTIN_INVALID;
queue->s.pktout = PKTOUT_INVALID;
@@ -949,6 +950,20 @@ static int queue_api_enq_multi(odp_queue_t handle,
(odp_buffer_hdr_t **)(uintptr_t)ev, num);
}
+static void queue_timer_add(odp_queue_t handle)
+{
+ queue_entry_t *queue = qentry_from_handle(handle);
+
+ odp_atomic_inc_u64(&queue->s.num_timers);
+}
+
+static void queue_timer_rem(odp_queue_t handle)
+{
+ queue_entry_t *queue = qentry_from_handle(handle);
+
+ odp_atomic_dec_u64(&queue->s.num_timers);
+}
+
static int queue_api_enq(odp_queue_t handle, odp_event_t ev)
{
queue_entry_t *queue = qentry_from_handle(handle);
@@ -1007,5 +1022,7 @@ queue_fn_t queue_basic_fn = {
.get_pktin = queue_get_pktin,
.set_pktin = queue_set_pktin,
.set_enq_deq_fn = queue_set_enq_deq_func,
- .orig_deq_multi = queue_orig_multi
+ .orig_deq_multi = queue_orig_multi,
+ .timer_add = queue_timer_add,
+ .timer_rem = queue_timer_rem
};
diff --git a/platform/linux-generic/odp_queue_scalable.c b/platform/linux-generic/odp_queue_scalable.c
index b7ff2195f..6ec7f14b7 100644
--- a/platform/linux-generic/odp_queue_scalable.c
+++ b/platform/linux-generic/odp_queue_scalable.c
@@ -124,6 +124,8 @@ static int queue_init(queue_entry_t *queue, const char *name,
ring[ring_idx] = NULL;
queue->s.type = queue->s.param.type;
+ odp_atomic_init_u64(&queue->s.num_timers, 0);
+
queue->s.enqueue = _queue_enq;
queue->s.dequeue = _queue_deq;
queue->s.enqueue_multi = _queue_enq_multi;
@@ -958,6 +960,20 @@ static int queue_orig_multi(odp_queue_t handle,
buf_hdr, num);
}
+static void queue_timer_add(odp_queue_t handle)
+{
+ queue_entry_t *queue = qentry_from_ext(handle);
+
+ odp_atomic_inc_u64(&queue->s.num_timers);
+}
+
+static void queue_timer_rem(odp_queue_t handle)
+{
+ queue_entry_t *queue = qentry_from_ext(handle);
+
+ odp_atomic_dec_u64(&queue->s.num_timers);
+}
+
/* API functions */
_odp_queue_api_fn_t queue_scalable_api = {
.queue_create = queue_create,
@@ -990,5 +1006,7 @@ queue_fn_t queue_scalable_fn = {
.get_pktin = queue_get_pktin,
.set_pktin = queue_set_pktin,
.set_enq_deq_fn = queue_set_enq_deq_func,
- .orig_deq_multi = queue_orig_multi
+ .orig_deq_multi = queue_orig_multi,
+ .timer_add = queue_timer_add,
+ .timer_rem = queue_timer_rem
};