We need to efficiently check whether a timer base has no pending events. So introduce a new variable in struct timer_base to do so. Signed-off-by: Nicolas Saenz Julienne <nsaenzju@xxxxxxxxxx> --- kernel/time/timer.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/kernel/time/timer.c b/kernel/time/timer.c index 4f7602724f9a..2d7d68296a3b 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -201,6 +201,7 @@ struct timer_base { #ifdef CONFIG_PREEMPT_RT spinlock_t expiry_lock; atomic_t timer_waiters; + bool pending; #endif unsigned long clk; unsigned long next_expiry; @@ -596,6 +597,9 @@ static void enqueue_timer(struct timer_base *base, struct timer_list *timer, */ base->next_expiry = bucket_expiry; base->next_expiry_recalc = false; +#ifdef CONFIG_PREEMPT_RT + base->pending = true; +#endif trigger_dyntick_cpu(base, timer); } } @@ -1598,6 +1602,9 @@ static unsigned long __next_timer_interrupt(struct timer_base *base) } base->next_expiry_recalc = false; +#ifdef CONFIG_PREEMPT_RT + base->pending = (next != base->clk + NEXT_TIMER_MAX_DELTA); +#endif return next; } @@ -1966,6 +1973,9 @@ int timers_prepare_cpu(unsigned int cpu) base->clk = jiffies; base->next_expiry = base->clk + NEXT_TIMER_MAX_DELTA; base->is_idle = false; +#ifdef CONFIG_PREEMPT_RT + base->pending = false; +#endif } return 0; } -- 2.31.1