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

Shrikanth Hegde sshegde at linux.ibm.com
Thu Feb 19 05:22:26 AEDT 2026



On 2/6/26 7:52 PM, Frederic Weisbecker 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>


Makes sense to call it outside the loop.
Once you report idle is dead, there is nothing to do that CPU.

Reviewed-by: Shrikanth Hegde<sshegde at linux.ibm.com>


> ---
>   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 c174afe1dd17..51764cbec6f3 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();
>   



More information about the Linuxppc-dev mailing list