diff options
author | Matias Elo <matias.elo@nokia.com> | 2018-10-17 15:34:53 +0300 |
---|---|---|
committer | Maxim Uvarov <maxim.uvarov@linaro.org> | 2018-10-24 17:22:44 +0300 |
commit | cc91c95216ca80d17c638c07659873ecf24f25e6 (patch) | |
tree | dcb19b52b02037e1e8b8f0b22f6035c1c4522010 /platform | |
parent | 4aa40267ae25e6ee021c8ce067bae649db2d0d8d (diff) |
linux-gen: timer: run inline timers during queue dequeue operations
Process inline timers (if enabled) during odp_queue_deq() and
odp_queue_deq_multi() calls. This fixes inline timers not working if
odp_schedule() or odp_schedule_multi() was never called.
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/odp_queue_basic.c | 10 | ||||
-rw-r--r-- | platform/linux-generic/odp_queue_scalable.c | 12 | ||||
-rw-r--r-- | platform/linux-generic/odp_timer.c | 6 |
3 files changed, 28 insertions, 0 deletions
diff --git a/platform/linux-generic/odp_queue_basic.c b/platform/linux-generic/odp_queue_basic.c index 73a5536d8..4e23fb53b 100644 --- a/platform/linux-generic/odp_queue_basic.c +++ b/platform/linux-generic/odp_queue_basic.c @@ -16,6 +16,7 @@ #include <odp_pool_internal.h> #include <odp_init_internal.h> #include <odp_shm_internal.h> +#include <odp_timer_internal.h> #include <odp/api/shared_memory.h> #include <odp/api/schedule.h> #include <odp_schedule_if.h> @@ -28,6 +29,7 @@ #include <odp/api/traffic_mngr.h> #include <odp_libconfig_internal.h> #include <odp/api/plat/queue_inline_types.h> +#include <odp_global_data.h> #define NUM_INTERNAL_QUEUES 64 @@ -976,6 +978,10 @@ static int queue_api_deq_multi(odp_queue_t handle, odp_event_t ev[], int num) { queue_entry_t *queue = qentry_from_handle(handle); + if (odp_global_rw->inline_timers && + odp_atomic_load_u64(&queue->s.num_timers)) + timer_run(); + if (num > QUEUE_MULTI_MAX) num = QUEUE_MULTI_MAX; @@ -987,6 +993,10 @@ static odp_event_t queue_api_deq(odp_queue_t handle) { queue_entry_t *queue = qentry_from_handle(handle); + if (odp_global_rw->inline_timers && + odp_atomic_load_u64(&queue->s.num_timers)) + timer_run(); + return (odp_event_t)queue->s.dequeue(handle); } diff --git a/platform/linux-generic/odp_queue_scalable.c b/platform/linux-generic/odp_queue_scalable.c index 6ec7f14b7..3acfc0841 100644 --- a/platform/linux-generic/odp_queue_scalable.c +++ b/platform/linux-generic/odp_queue_scalable.c @@ -24,9 +24,11 @@ #include <odp_pool_internal.h> #include <odp_queue_scalable_internal.h> #include <odp_schedule_if.h> +#include <odp_timer_internal.h> #include <odp_ishm_internal.h> #include <odp_ishmpool_internal.h> #include <odp/api/plat/queue_inline_types.h> +#include <odp_global_data.h> #include <string.h> #include <inttypes.h> @@ -845,6 +847,11 @@ static int queue_deq_multi(odp_queue_t handle, odp_event_t ev[], int num) num = QUEUE_MULTI_MAX; queue = qentry_from_ext(handle); + + if (odp_global_rw->inline_timers && + odp_atomic_load_u64(&queue->s.num_timers)) + timer_run(); + return queue->s.dequeue_multi(handle, (odp_buffer_hdr_t **)ev, num); } @@ -853,6 +860,11 @@ static odp_event_t queue_deq(odp_queue_t handle) queue_entry_t *queue; queue = qentry_from_ext(handle); + + if (odp_global_rw->inline_timers && + odp_atomic_load_u64(&queue->s.num_timers)) + timer_run(); + return (odp_event_t)queue->s.dequeue(handle); } diff --git a/platform/linux-generic/odp_timer.c b/platform/linux-generic/odp_timer.c index 507226580..a22617559 100644 --- a/platform/linux-generic/odp_timer.c +++ b/platform/linux-generic/odp_timer.c @@ -55,6 +55,7 @@ #include <odp/api/time.h> #include <odp/api/plat/time_inlines.h> #include <odp/api/timer.h> +#include <odp_queue_if.h> #include <odp_timer_internal.h> #include <odp/api/plat/queue_inlines.h> #include <odp_global_data.h> @@ -442,6 +443,8 @@ static inline odp_timer_t timer_alloc(timer_pool_t *tp, tp->num_alloc, _ODP_MEMMODEL_RLS); hdl = tp_idx_to_handle(tp, idx); + /* Add timer to queue */ + queue_fn->timer_add(queue); } else { __odp_errno = ENFILE; /* Reusing file table overflow */ hdl = ODP_TIMER_INVALID; @@ -461,6 +464,9 @@ static inline odp_buffer_t timer_free(timer_pool_t *tp, uint32_t idx) * grab any timeout buffer */ odp_buffer_t old_buf = timer_set_unused(tp, idx); + /* Remove timer from queue */ + queue_fn->timer_rem(tim->queue); + /* Destroy timer */ timer_fini(tim, &tp->tick_buf[idx]); |