aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--platform/linux-dpdk/odp_queue_basic.c47
-rw-r--r--platform/linux-dpdk/odp_timer.c18
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);