aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJere Leppänen <jere.leppanen@nokia.com>2023-03-14 11:29:42 +0200
committerMatias Elo <matias.elo@nokia.com>2024-02-01 16:35:10 +0200
commit22c7067de77ff0ad39c01cd2525547eb3a9e6772 (patch)
tree9d197a1cf556107b9f503f457d1b062e219f3d24
parent90dd758b73034ac12caf29e7ddab4ad6d3cbbbaa (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.h6
-rw-r--r--platform/linux-generic/odp_timer.c16
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);
}
}