diff options
-rw-r--r-- | platform/linux-dpdk/odp_queue_basic.c | 47 | ||||
-rw-r--r-- | platform/linux-dpdk/odp_timer.c | 18 |
2 files changed, 16 insertions, 49 deletions
diff --git a/platform/linux-dpdk/odp_queue_basic.c b/platform/linux-dpdk/odp_queue_basic.c index 3ddca8ed4..1f86c945e 100644 --- a/platform/linux-dpdk/odp_queue_basic.c +++ b/platform/linux-dpdk/odp_queue_basic.c @@ -28,6 +28,7 @@ #include <odp_libconfig_internal.h> #include <odp_timer_internal.h> #include <odp/api/plat/queue_inline_types.h> +#include <odp_global_data.h> #define NUM_INTERNAL_QUEUES 64 @@ -537,44 +538,6 @@ static int error_enqueue_multi(odp_queue_t handle, return -1; } -static int timer_queue_deq_multi(odp_queue_t handle, - odp_buffer_hdr_t *buf_hdr[], int num) -{ - timer_run(); - - return _plain_queue_deq_multi(handle, buf_hdr, num); -} - -static odp_buffer_hdr_t *timer_queue_deq(odp_queue_t handle) -{ - odp_buffer_hdr_t *buf_hdr = NULL; - int ret; - - timer_run(); - - ret = _plain_queue_deq_multi(handle, &buf_hdr, 1); - - if (ret == 1) - return buf_hdr; - else - return NULL; -} - -/* Enable timer polling on dequeue call */ -void queue_enable_timer_poll(odp_queue_t queue); - -void queue_enable_timer_poll(odp_queue_t handle) -{ - queue_entry_t *queue = qentry_from_handle(handle); - - LOCK(queue); - - queue->s.dequeue = timer_queue_deq; - queue->s.dequeue_multi = timer_queue_deq_multi; - - UNLOCK(queue); -} - static odp_buffer_hdr_t *error_dequeue(odp_queue_t handle) { ODP_ERR("Dequeue not supported (0x%" PRIx64 ")\n", @@ -966,6 +929,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; @@ -977,6 +944,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-dpdk/odp_timer.c b/platform/linux-dpdk/odp_timer.c index 78b206404..1a5ec2495 100644 --- a/platform/linux-dpdk/odp_timer.c +++ b/platform/linux-dpdk/odp_timer.c @@ -13,8 +13,9 @@ #include <odp/api/timer.h> #include <odp/api/plat/queue_inlines.h> -#include <odp_init_internal.h> #include <odp_debug_internal.h> +#include <odp_init_internal.h> +#include <odp_queue_if.h> #include <odp_ring_internal.h> #include <odp_timer_internal.h> @@ -25,9 +26,6 @@ * - Remove "struct timer_pool_s" */ -/* TODO: Add this to queue interface. Sets a queue to poll timer on dequeue */ -void queue_enable_timer_poll(odp_queue_t queue); - /* Timer states */ #define NOT_TICKING 0 #define EXPIRED 1 @@ -357,10 +355,8 @@ odp_timer_t odp_timer_alloc(odp_timer_pool_t tp, timer->queue = queue; timer->tmo_event = ODP_EVENT_INVALID; - /* Enable timer polling from dequeue operation. Scheduler polls timer - * by default. */ - if (odp_queue_type(queue) == ODP_QUEUE_TYPE_PLAIN) - queue_enable_timer_poll(queue); + /* Add timer to queue */ + queue_fn->timer_add(queue); odp_ticketlock_lock(&timer_pool->lock); @@ -400,10 +396,10 @@ retry: ev = ODP_EVENT_INVALID; } - odp_ticketlock_unlock(&timer->lock); + /* Remove timer from queue */ + queue_fn->timer_rem(timer->queue); - /* TODO: disable timer polling from queue. Needs better queue <-> timer - * interface. */ + odp_ticketlock_unlock(&timer->lock); odp_ticketlock_lock(&timer_pool->lock); |