Merge tag 'timers-urgent-2022-04-17' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull timer fixes from Thomas Gleixner:
"A small set of fixes for the timers core:

- Fix the warning condition in __run_timers() which does not take
into account that a CPU base (especially the deferrable base) never
has a timer armed on it and therefore the next_expiry value can
become stale.

- Replace a WARN_ON() in the NOHZ code with a WARN_ON_ONCE() to
prevent endless spam in dmesg.

- Remove the double star from a comment which is not meant to be in
kernel-doc format"

* tag 'timers-urgent-2022-04-17' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
tick/sched: Fix non-kernel-doc comment
tick/nohz: Use WARN_ON_ONCE() to prevent console saturation
timers: Fix warning condition in __run_timers()

Changed files
+10 -7
kernel
+3 -3
kernel/time/tick-sched.c
··· 188 188 */ 189 189 if (unlikely(tick_do_timer_cpu == TICK_DO_TIMER_NONE)) { 190 190 #ifdef CONFIG_NO_HZ_FULL 191 - WARN_ON(tick_nohz_full_running); 191 + WARN_ON_ONCE(tick_nohz_full_running); 192 192 #endif 193 193 tick_do_timer_cpu = cpu; 194 194 } ··· 1538 1538 } 1539 1539 #endif 1540 1540 1541 - /** 1541 + /* 1542 1542 * Async notification about clocksource changes 1543 1543 */ 1544 1544 void tick_clock_notify(void) ··· 1559 1559 set_bit(0, &ts->check_clocks); 1560 1560 } 1561 1561 1562 - /** 1562 + /* 1563 1563 * Check, if a change happened, which makes oneshot possible. 1564 1564 * 1565 1565 * Called cyclic from the hrtimer softirq (driven by the timer
+7 -4
kernel/time/timer.c
··· 1722 1722 time_after_eq(jiffies, base->next_expiry)) { 1723 1723 levels = collect_expired_timers(base, heads); 1724 1724 /* 1725 - * The only possible reason for not finding any expired 1726 - * timer at this clk is that all matching timers have been 1727 - * dequeued. 1725 + * The two possible reasons for not finding any expired 1726 + * timer at this clk are that all matching timers have been 1727 + * dequeued or no timer has been queued since 1728 + * base::next_expiry was set to base::clk + 1729 + * NEXT_TIMER_MAX_DELTA. 1728 1730 */ 1729 - WARN_ON_ONCE(!levels && !base->next_expiry_recalc); 1731 + WARN_ON_ONCE(!levels && !base->next_expiry_recalc 1732 + && base->timers_pending); 1730 1733 base->clk++; 1731 1734 base->next_expiry = __next_timer_interrupt(base); 1732 1735