diff options
author | Jere Leppänen <jere.leppanen@nokia.com> | 2023-03-14 11:29:42 +0200 |
---|---|---|
committer | Matias Elo <matias.elo@nokia.com> | 2024-02-01 16:35:10 +0200 |
commit | 22c7067de77ff0ad39c01cd2525547eb3a9e6772 (patch) | |
tree | 9d197a1cf556107b9f503f457d1b062e219f3d24 | |
parent | 90dd758b73034ac12caf29e7ddab4ad6d3cbbbaa (diff) |
linux-gen: timer: allow forcing a scan in _odp_timer_run_inline()
Allow forcing a timer scan in timer_run() / _odp_timer_run_inline() by
providing a special parameter value TIMER_SCAN_FORCE.
Signed-off-by: Jere Leppänen <jere.leppanen@nokia.com>
Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com>
-rw-r--r-- | platform/linux-generic/include/odp_timer_internal.h | 6 | ||||
-rw-r--r-- | platform/linux-generic/odp_timer.c | 16 |
2 files changed, 17 insertions, 5 deletions
diff --git a/platform/linux-generic/include/odp_timer_internal.h b/platform/linux-generic/include/odp_timer_internal.h index 9c9852de9..38192d917 100644 --- a/platform/linux-generic/include/odp_timer_internal.h +++ b/platform/linux-generic/include/odp_timer_internal.h @@ -22,6 +22,12 @@ #include <odp_global_data.h> #include <odp_pool_internal.h> +/* + * Use as the argument to timer_run() to force a scan and to ignore rate + * limit. + */ +#define TIMER_SCAN_FORCE INT32_MAX + /** * Internal Timeout header */ diff --git a/platform/linux-generic/odp_timer.c b/platform/linux-generic/odp_timer.c index 0b582e18b..c8ea31078 100644 --- a/platform/linux-generic/odp_timer.c +++ b/platform/linux-generic/odp_timer.c @@ -794,7 +794,7 @@ static inline uint64_t timer_pool_scan(timer_pool_t *tp, uint64_t tick) * Inline timer processing *****************************************************************************/ -static inline uint64_t timer_pool_scan_inline(int num, odp_time_t now) +static inline uint64_t timer_pool_scan_inline(int num, odp_time_t now, int force) { timer_pool_t *tp; uint64_t new_tick, old_tick, ticks_to_next_expire, nsec, min = UINT64_MAX; @@ -823,7 +823,7 @@ static inline uint64_t timer_pool_scan_inline(int num, odp_time_t now) old_tick = odp_atomic_load_u64(&tp->cur_tick); diff = new_tick - old_tick; - if (diff < 1) + if (diff < 1 && !force) continue; if (odp_atomic_cas_u64(&tp->cur_tick, &old_tick, new_tick)) { @@ -850,7 +850,8 @@ uint64_t _odp_timer_run_inline(int dec) { odp_time_t now; int num = timer_global->highest_tp_idx + 1; - int poll_interval = timer_global->poll_interval; + int force = (dec == TIMER_SCAN_FORCE); + int poll_interval = force ? 0 : timer_global->poll_interval; if (num == 0) return UINT64_MAX; @@ -875,18 +876,23 @@ uint64_t _odp_timer_run_inline(int dec) timer_local.last_run = now; } + if (force) { + timer_local.run_cnt = poll_interval; + timer_local.last_run = now; + } + /* Check the timer pools. */ if (CONFIG_TIMER_PROFILE_INLINE) { odp_time_t t1 = odp_time_local_strict(); - uint64_t ret = timer_pool_scan_inline(num, now); + uint64_t ret = timer_pool_scan_inline(num, now, force); odp_time_t t2 = odp_time_local_strict(); timer_local.prof_nsec += odp_time_diff_ns(t2, t1); timer_local.prof_rounds++; return ret; } else { - return timer_pool_scan_inline(num, now); + return timer_pool_scan_inline(num, now, force); } } |