Re: [PATCH] tick/nohz: Requeue kicks flushed outside hardirq context

From: Frederic Weisbecker

Date: Thu Oct 22 2026 - 10:43:40 EST


Le Sat, Oct 17, 2026 at 08:59:00PM +0800, Peng Wang a écrit :
> A remote nohz kick can be flushed from task context after idle exit
> has checked tick dependencies. If polling suppressed the IPI, the empty
> callback is consumed without an IRQ exit to reevaluate the tick. A newly
> set dependency can then leave the non-idle tick stopped until another
> interrupt arrives.
>
> Requeue the work locally when it runs outside hardirq context on an
> online CPU. This raises the IRQ needed for the existing tick reevaluation
> path. Skip offline CPUs whose pending work is being drained during
> teardown.
>
> Fixes: 4b44a21dd640 ("irq_work, smp: Allow irq_work on call_single_queue")
> Fixes: a5183862e76f ("tick/nohz: Conditionally restart tick on idle exit")
> Co-developed-by: He Rongguang <herongguang@xxxxxxxxxxxxxxxxx>
> Signed-off-by: He Rongguang <herongguang@xxxxxxxxxxxxxxxxx>
> Signed-off-by: Peng Wang <peng_wang@xxxxxxxxxxxxxxxxx>
> ---
> kernel/time/tick-sched.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
> index 6c3fea386713..87e2a7a87526 100644
> --- a/kernel/time/tick-sched.c
> +++ b/kernel/time/tick-sched.c
> @@ -402,7 +402,12 @@ static bool can_stop_full_tick(int cpu, struct tick_sched *ts)
>
> static void nohz_full_kick_func(struct irq_work *work)
> {
> - /* Empty, the tick restart happens on tick_nohz_irq_exit() */
> + /*
> + * Remote irq_work may be flushed from task context. Force an IRQ
> + * exit to reevaluate the tick unless this CPU is going offline.
> + */
> + if (!in_hardirq() && cpu_online(smp_processor_id()))
> + irq_work_queue(work);

Good catch but instead of requeuing, why not restarting the tick directly from
here instead of from IRQ exit?

Thanks.

> }
>
> static DEFINE_PER_CPU(struct irq_work, nohz_full_kick_work) =
>
> base-commit: 70dd4ee72eb2d5793c62e71c14e3aba78e5a4e56
> --
> 2.47.0
>

--
Frederic Weisbecker
SUSE Labs