This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "".
The branch, master has been updated via cc91c95216ca80d17c638c07659873ecf24f25e6 (commit) via 4aa40267ae25e6ee021c8ce067bae649db2d0d8d (commit) via 83e9a6c3896d2d8a949a7bece565bae7dfd1d967 (commit) from 8dc48817b06a5a303cf2b778eda68cc3627dd625 (commit)
Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below.
- Log ----------------------------------------------------------------- commit cc91c95216ca80d17c638c07659873ecf24f25e6 Author: Matias Elo matias.elo@nokia.com Date: Wed Oct 17 15:34:53 2018 +0300
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
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]);
commit 4aa40267ae25e6ee021c8ce067bae649db2d0d8d Author: Matias Elo matias.elo@nokia.com Date: Wed Oct 17 13:29:42 2018 +0300
linux-gen: timer: reduce inline timer overhead
Reduce inline timer overhead by not polling timers until at least one timer pool has been created.
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
diff --git a/platform/linux-generic/include/odp_global_data.h b/platform/linux-generic/include/odp_global_data.h index f1be1502c..a12d12973 100644 --- a/platform/linux-generic/include/odp_global_data.h +++ b/platform/linux-generic/include/odp_global_data.h @@ -40,6 +40,7 @@ typedef struct { /* Read-only global data. Members should not be modified after global init * to enable process more support. */ struct odp_global_data_ro_t { + odp_init_t init_param; /* directory for odp mmaped files */ char *shm_dir; /* overload default with env */ @@ -69,6 +70,7 @@ struct odp_global_data_rw_t { pthread_t inotify_thread; int inotify_pcapng_is_running; odp_bool_t dpdk_initialized; + odp_bool_t inline_timers; };
extern struct odp_global_data_ro_t odp_global_ro; diff --git a/platform/linux-generic/include/odp_timer_internal.h b/platform/linux-generic/include/odp_timer_internal.h index 8dda9e6ff..02ba92e0d 100644 --- a/platform/linux-generic/include/odp_timer_internal.h +++ b/platform/linux-generic/include/odp_timer_internal.h @@ -19,6 +19,7 @@ #include <odp_buffer_internal.h> #include <odp_pool_internal.h> #include <odp/api/timer.h> +#include <odp_global_data.h>
/* Minimum number of scheduling rounds between checking timer pools. */ #define CONFIG_TIMER_RUN_RATELIMIT_ROUNDS 1 @@ -38,22 +39,12 @@ typedef struct { odp_timer_t timer; } odp_timeout_hdr_t;
-/* - * Whether to run timer pool processing 'inline' (on worker cores) or in - * background threads (thread-per-timerpool). - * - * If the application will use both scheduler and timer this flag is set - * to true, otherwise false. This application conveys this information via - * the 'not_used' bits in odp_init_t which are passed to odp_global_init(). - */ -extern odp_bool_t inline_timers; - unsigned _timer_run(void);
/* Static inline wrapper to minimize modification of schedulers. */ static inline unsigned timer_run(void) { - return inline_timers ? _timer_run() : 0; + return odp_global_rw->inline_timers ? _timer_run() : 0; }
#endif diff --git a/platform/linux-generic/odp_init.c b/platform/linux-generic/odp_init.c index dca06641a..0f7e0df28 100644 --- a/platform/linux-generic/odp_init.c +++ b/platform/linux-generic/odp_init.c @@ -268,6 +268,8 @@ int odp_init_global(odp_instance_t *instance, odp_global_ro.abort_fn = odp_override_abort;
if (params != NULL) { + odp_global_ro.init_param = *params; + if (params->log_fn != NULL) odp_global_ro.log_fn = params->log_fn; if (params->abort_fn != NULL) diff --git a/platform/linux-generic/odp_timer.c b/platform/linux-generic/odp_timer.c index eeb863530..507226580 100644 --- a/platform/linux-generic/odp_timer.c +++ b/platform/linux-generic/odp_timer.c @@ -68,8 +68,6 @@ * for checking the freshness of received timeouts */ #define TMO_INACTIVE ((uint64_t)0x8000000000000000)
-odp_bool_t inline_timers = false; - /****************************************************************************** * Mutual exclusion in the absence of CAS16 *****************************************************************************/ @@ -333,8 +331,26 @@ static odp_timer_pool_t timer_pool_new(const char *name, odp_spinlock_init(&tp->lock); odp_ticketlock_lock(&timer_global->lock); timer_global->timer_pool[tp_idx] = tp; + + if (timer_global->num_timer_pools == 1) { + odp_bool_t inline_tim; + + /* + * Whether to run timer pool processing 'inline' (on worker + * cores) or in background threads (thread-per-timerpool). + * + * If the application will use scheduler this flag is set to + * true, otherwise false. This application conveys this + * information via the 'not_used' bits in odp_init_t which are + * passed to odp_global_init(). + */ + inline_tim = !odp_global_ro.init_param.not_used.feat.schedule; + + odp_global_rw->inline_timers = inline_tim; + } + odp_ticketlock_unlock(&timer_global->lock); - if (!inline_timers) { + if (!odp_global_rw->inline_timers) { if (tp->param.clk_src == ODP_CLOCK_CPU) itimer_init(tp); } @@ -368,7 +384,7 @@ static void odp_timer_pool_del(timer_pool_t *tp)
odp_spinlock_lock(&tp->lock);
- if (!inline_timers) { + if (!odp_global_rw->inline_timers) { /* Stop POSIX itimer signals */ if (tp->param.clk_src == ODP_CLOCK_CPU) itimer_fini(tp); @@ -390,6 +406,11 @@ static void odp_timer_pool_del(timer_pool_t *tp) timer_global->timer_pool[tp->tp_idx] = NULL; timer_global->timer_pool_used[tp->tp_idx] = 0; timer_global->num_timer_pools--; + + /* Disable inline timer polling */ + if (timer_global->num_timer_pools == 0) + odp_global_rw->inline_timers = false; + odp_ticketlock_unlock(&timer_global->lock);
rc = odp_shm_free(shm); @@ -1093,6 +1114,11 @@ int odp_timer_capability(odp_timer_clk_src_t clk_src, odp_timer_pool_t odp_timer_pool_create(const char *name, const odp_timer_pool_param_t *param) { + if (odp_global_ro.init_param.not_used.feat.timer) { + ODP_ERR("Trying to use disabled ODP feature.\n"); + return ODP_TIMER_POOL_INVALID; + } + if (param->res_ns < timer_global->highest_res_ns) { __odp_errno = EINVAL; return ODP_TIMER_POOL_INVALID; @@ -1295,6 +1321,7 @@ void odp_timeout_free(odp_timeout_t tmo) int odp_timer_init_global(const odp_init_t *params) { odp_shm_t shm; + odp_bool_t inline_timers = false;
shm = odp_shm_reserve("_odp_timer", sizeof(timer_global_t), ODP_CACHE_LINE_SIZE, 0);
commit 83e9a6c3896d2d8a949a7bece565bae7dfd1d967 Author: Matias Elo matias.elo@nokia.com Date: Tue Oct 2 14:13:35 2018 +0300
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
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 };
-----------------------------------------------------------------------
Summary of changes: platform/linux-generic/include/odp_global_data.h | 2 ++ .../include/odp_queue_basic_internal.h | 1 + platform/linux-generic/include/odp_queue_if.h | 4 +++ .../include/odp_queue_scalable_internal.h | 1 + .../linux-generic/include/odp_timer_internal.h | 13 ++----- platform/linux-generic/odp_init.c | 2 ++ platform/linux-generic/odp_queue_basic.c | 29 ++++++++++++++- platform/linux-generic/odp_queue_scalable.c | 32 ++++++++++++++++- platform/linux-generic/odp_timer.c | 41 +++++++++++++++++++--- 9 files changed, 108 insertions(+), 17 deletions(-)
hooks/post-receive