Skip to content

Commit 0236aaf

Browse files
Frederic WeisbeckerThomas Gleixner
authored andcommitted
sched/idle: Handle offlining first in idle loop
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@kernel.org> Signed-off-by: Thomas Gleixner <tglx@kernel.org> Tested-by: Shrikanth Hegde <sshegde@linux.ibm.com> Reviewed-by: Rafael J. Wysocki (Intel) <rafael@kernel.org> Reviewed-by: Shrikanth Hegde <sshegde@linux.ibm.com> Link: https://patch.msgid.link/20260508131647.43868-3-frederic@kernel.org
1 parent 86db408 commit 0236aaf

1 file changed

Lines changed: 8 additions & 5 deletions

File tree

kernel/sched/idle.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,14 @@ static void do_idle(void)
280280
int cpu = smp_processor_id();
281281
bool got_tick = false;
282282

283+
if (cpu_is_offline(cpu)) {
284+
local_irq_disable();
285+
/* All per-CPU kernel threads should be done by now. */
286+
WARN_ON_ONCE(need_resched());
287+
cpuhp_report_idle_dead();
288+
arch_cpu_idle_dead();
289+
}
290+
283291
/*
284292
* Check if we need to update blocked load
285293
*/
@@ -331,11 +339,6 @@ static void do_idle(void)
331339
*/
332340
local_irq_disable();
333341

334-
if (cpu_is_offline(cpu)) {
335-
cpuhp_report_idle_dead();
336-
arch_cpu_idle_dead();
337-
}
338-
339342
arch_cpu_idle_enter();
340343
rcu_nocb_flush_deferred_wakeup();
341344

0 commit comments

Comments
 (0)