aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2018-10-17 15:34:53 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2018-10-24 17:22:44 +0300
commitcc91c95216ca80d17c638c07659873ecf24f25e6 (patch)
treedcb19b52b02037e1e8b8f0b22f6035c1c4522010 /platform
parent4aa40267ae25e6ee021c8ce067bae649db2d0d8d (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.c10
-rw-r--r--platform/linux-generic/odp_queue_scalable.c12
-rw-r--r--platform/linux-generic/odp_timer.c6
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]);