[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