[PATCH 01/14] sched/idle: Handle offlining first in idle loop

Rafael J. Wysocki rafael at kernel.org
Wed Apr 1 00:59:56 AEDT 2026


On Tue, Mar 31, 2026 at 3:16 PM Frederic Weisbecker <frederic at kernel.org> wrote:
>
> Offline handling happens from within the inner idle loop,
> after the beginning of dyntick cputime accounting, nohz idle
> load balancing and TIF_NEED_RESCHED polling.
>
> This is not necessary and even buggy because:
>
> * There is no dyntick handling to do. And calling tick_nohz_idle_enter()
>   messes up with the struct tick_sched reset that was performed on
>   tick_sched_timer_dying().
>
> * There is no nohz idle balancing to do.
>
> * Polling on TIF_RESCHED is irrelevant at this stage, there are no more
>   tasks allowed to run.
>
> * No need to check if need_resched() before offline handling since
>   stop_machine is done and all per-cpu kthread should be done with
>   their job.
>
> Therefore move the offline handling at the beginning of the idle loop.
> This will also ease the idle cputime unification later by not elapsing
> idle time while offline through the call to:
>
>         tick_nohz_idle_enter() -> tick_nohz_start_idle()
>
> Signed-off-by: Frederic Weisbecker <frederic at kernel.org>
> Reviewed-by: Shrikanth Hegde <sshegde at linux.ibm.com>
> Tested-by: Shrikanth Hegde <sshegde at linux.ibm.com>

No issues found, so

Reviewed-by: Rafael J. Wysocki (Intel) <rafael at kernel.org>

> ---
>  kernel/sched/idle.c | 13 ++++++++-----
>  1 file changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c
> index 3681b6ad9276..521a076d8845 100644
> --- a/kernel/sched/idle.c
> +++ b/kernel/sched/idle.c
> @@ -260,6 +260,14 @@ static void do_idle(void)
>  {
>         int cpu = smp_processor_id();
>
> +       if (cpu_is_offline(cpu)) {
> +               local_irq_disable();
> +               /* All per-CPU kernel threads should be done by now. */
> +               WARN_ON_ONCE(need_resched());
> +               cpuhp_report_idle_dead();
> +               arch_cpu_idle_dead();
> +       }
> +
>         /*
>          * Check if we need to update blocked load
>          */
> @@ -311,11 +319,6 @@ static void do_idle(void)
>                  */
>                 local_irq_disable();
>
> -               if (cpu_is_offline(cpu)) {
> -                       cpuhp_report_idle_dead();
> -                       arch_cpu_idle_dead();
> -               }
> -
>                 arch_cpu_idle_enter();
>                 rcu_nocb_flush_deferred_wakeup();
>
> --
> 2.53.0
>


More information about the Linuxppc-dev mailing list