[RFC PATCH 03/49] sched: Move CPUHP_AP_SCHED_STARTING to post stop_machine()

From: Frederic Weisbecker

Date: Mon Oct 19 2026 - 09:09:35 EST


Between CPUHP_TEARDOWN_CPU and CPUHP_AP_OFFLINE, stop_machine executes
all the teardown callbacks while stopping all CPUs in the system. This
doesn't mix-up well with running RT or isolated tasks.

In order to transition smoothly from global stop_machine to finer
grained synchronization between teardown callbacks and the other CPUs,
a new stop machine post function has been introduced to be executed
after the main one with IRQs still disabled while other CPUs can exit
stop_machine().

- The nohz_full remote tick can be shutdown safely while it runs
concurrently.

- Updating the RQ clock shouldn't be a problem while offline with other
CPUs around.

- Since it is seen offline, no task can be queued to it remotely.

- dl server stop is sychronized with rq lock. hrtimer_try_to_cancel()
can become racy but then if it fires, it will just early return.

- calc_load_migrate() just folds local load to the global accumulation

- update_max_interval() only depends on the number of online CPUs, which
is stable at this stage.

- hrtick_clear() deals with a strictly local timer

- sched_core_cpu_dying() doesn't race with anything

Move this teardown callback to post stop_machine() accordingly.

Signed-off-by: Frederic Weisbecker <frederic@xxxxxxxxxx>
---
kernel/cpu.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/kernel/cpu.c b/kernel/cpu.c
index da07c804ff53..4f3f0ae36893 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -1275,7 +1275,7 @@ void clear_tasks_mm_cpumask(int cpu)
static int take_cpu_down(void *_param)
{
struct cpuhp_cpu_state *st = this_cpu_ptr(&cpuhp_state);
- enum cpuhp_state target = max((int)st->target, CPUHP_AP_CACHECTRL_STARTING);
+ enum cpuhp_state target = max((int)st->target, CPUHP_AP_SCHED_STARTING);
int err, cpu = smp_processor_id();

/* Ensure this CPU doesn't handle any more interrupts. */
@@ -1303,8 +1303,7 @@ static int take_cpu_down_post(void *_param)
enum cpuhp_state target = max((int)st->target, CPUHP_AP_OFFLINE);
int cpu = smp_processor_id();

- WARN_ON(st->state != CPUHP_AP_CACHECTRL_STARTING);
-
+ WARN_ON(st->state != CPUHP_AP_SCHED_STARTING);
/*
* Invoke the former CPU_DYING callbacks. DYING must not fail!
*/
--
2.53.0