aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic/odp_timer.c
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2018-11-13 13:01:26 +0200
committerMaxim Uvarov <maxim.uvarov@linaro.org>2018-11-16 21:57:54 +0300
commit0dcbdecc871783b5669dc9cb8cf68b7f4d7ffb76 (patch)
tree4da214a7c6a20e2b5429056c5a41bf4b12b497e2 /platform/linux-generic/odp_timer.c
parentd89f772686dba6b331515be41aeefe345a207575 (diff)
linux-gen: timer: enable inline timer implementation using config file
Add configure option 'timer.inline' for enabling inline timer implementation. 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/linux-generic/odp_timer.c')
-rw-r--r--platform/linux-generic/odp_timer.c39
1 files changed, 16 insertions, 23 deletions
diff --git a/platform/linux-generic/odp_timer.c b/platform/linux-generic/odp_timer.c
index 84da57742..fcda6e396 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_libconfig_internal.h>
#include <odp_queue_if.h>
#include <odp_timer_internal.h>
#include <odp/api/plat/queue_inlines.h>
@@ -217,7 +218,7 @@ typedef struct timer_global_t {
/* Multiple locks per cache line! */
_odp_atomic_flag_t ODP_ALIGNED_CACHE locks[NUM_LOCKS];
#endif
-
+ odp_bool_t use_inline_timers;
} timer_global_t;
static timer_global_t *timer_global;
@@ -339,22 +340,8 @@ static odp_timer_pool_t timer_pool_new(const char *name,
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;
- }
+ if (timer_global->num_timer_pools == 1)
+ odp_global_rw->inline_timers = timer_global->use_inline_timers;
odp_ticketlock_unlock(&timer_global->lock);
if (!odp_global_rw->inline_timers) {
@@ -1333,7 +1320,8 @@ 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;
+ const char *conf_str;
+ int val = 0;
shm = odp_shm_reserve("_odp_timer", sizeof(timer_global_t),
ODP_CACHE_LINE_SIZE, 0);
@@ -1358,16 +1346,21 @@ int odp_timer_init_global(const odp_init_t *params)
#else
ODP_DBG("Using lock-less timer implementation\n");
#endif
+ conf_str = "timer.inline";
+ if (!_odp_libconfig_lookup_int(conf_str, &val)) {
+ ODP_ERR("Config option '%s' not found.\n", conf_str);
+ odp_shm_free(shm);
+ return -1;
+ }
+ timer_global->use_inline_timers = val;
- if (params)
- inline_timers =
- !params->not_used.feat.schedule &&
- !params->not_used.feat.timer;
+ if (params && params->not_used.feat.timer)
+ timer_global->use_inline_timers = false;
timer_global->time_per_ratelimit_period =
odp_time_global_from_ns(timer_global->min_res_ns / 2);
- if (!inline_timers) {
+ if (!timer_global->use_inline_timers) {
timer_res_init();
block_sigalarm();
}