diff options
author | Matias Elo <matias.elo@nokia.com> | 2018-10-02 14:13:35 +0300 |
---|---|---|
committer | Maxim Uvarov <maxim.uvarov@linaro.org> | 2018-10-24 17:22:33 +0300 |
commit | 83e9a6c3896d2d8a949a7bece565bae7dfd1d967 (patch) | |
tree | c15aa059a36affb2dbd674a4cdab4c196b1e2a02 /platform | |
parent | 8dc48817b06a5a303cf2b778eda68cc3627dd625 (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')
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 }; |