Fix CPU hotplug callbacks to disable interrupts on UP kernels.
Signed-off-by: Ingo Molnar <mingo@kernel.org> -----BEGIN PGP SIGNATURE----- iQJFBAABCgAvFiEEBpT5eoXrXCwVQwEKEnMQ0APhK1gFAmk74mgRHG1pbmdvQGtl cm5lbC5vcmcACgkQEnMQ0APhK1jS2g/+NPDw1R7yAPHlTaZO6CduYSENXzTOjmG3 BxdWERuta3Z78CNJZ5mtbrL1mBccG29oN+EZFGrKbDuxrR6SoglWUr1x1pYJRDyp h0DvBfzewXcVwOCiBQpqVzuQIzPqsF1IfdDP6eIGnkhnSAEi6ObIZeAbzBzZRovD dccU5e0LAIffTmAyKFYIqD4Fu90bzwJ3dAE1b0tP4mnm+jFGitdd8vb8mowiftOk Lij8hsy8bg2A5VThIlKow0ya4uc6Bb3ZGj6aiMHoGMPbB2pu3o8bNH/K9d1MsKIe AdZ6Y8mFriYYk3GEI3aWaoRkEXCZFX2IcOUS++yqvrOb88iJpW7jujgRIRvX0Px4 5xgHomQwW9XQKJgNYU/xLgpQSvBH4IzGDX5Uf8oU+hqcjYJBJjy21Dk9JGJymjv/ /jTq11Bd9xqzyv9W2Ysg2CfOA29+jGe8XlZU9ucOKE1bz09D+8R+H8X/LZtldjMa Xbr+7HG9AD13gLJW+PfRQbJR5CwoCvh9dPMzWtFLykxBYT/mQK5gs4OQDaG+JFsz 8ov+F28O1KBCtcK+v2M/2mQlo51y6RI/t5cw1sVSosgORjHPIVpPjbbTGi0r4MKw PHBGdw0mb1dgsXMRNnCNwvfxZP/S1TnmbIkaT4THC0PqJHOloyrsVbXGD1u6F9In Gaodcvn7MbA= =jbkd -----END PGP SIGNATURE----- Merge tag 'smp-urgent-2025-12-12' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull CPU hotplug fix from Ingo Molnar: - Fix CPU hotplug callbacks to disable interrupts on UP kernels * tag 'smp-urgent-2025-12-12' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: cpu: Make atomic hotplug callbacks run with interrupts disabled on UPmaster
commit
4a298a43f5
25
kernel/cpu.c
25
kernel/cpu.c
|
|
@ -249,6 +249,14 @@ err:
|
|||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* The former STARTING/DYING states, ran with IRQs disabled and must not fail.
|
||||
*/
|
||||
static bool cpuhp_is_atomic_state(enum cpuhp_state state)
|
||||
{
|
||||
return CPUHP_AP_IDLE_DEAD <= state && state < CPUHP_AP_ONLINE;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static bool cpuhp_is_ap_state(enum cpuhp_state state)
|
||||
{
|
||||
|
|
@ -271,14 +279,6 @@ static inline void complete_ap_thread(struct cpuhp_cpu_state *st, bool bringup)
|
|||
complete(done);
|
||||
}
|
||||
|
||||
/*
|
||||
* The former STARTING/DYING states, ran with IRQs disabled and must not fail.
|
||||
*/
|
||||
static bool cpuhp_is_atomic_state(enum cpuhp_state state)
|
||||
{
|
||||
return CPUHP_AP_IDLE_DEAD <= state && state < CPUHP_AP_ONLINE;
|
||||
}
|
||||
|
||||
/* Synchronization state management */
|
||||
enum cpuhp_sync_state {
|
||||
SYNC_STATE_DEAD,
|
||||
|
|
@ -2364,7 +2364,14 @@ static int cpuhp_issue_call(int cpu, enum cpuhp_state state, bool bringup,
|
|||
else
|
||||
ret = cpuhp_invoke_callback(cpu, state, bringup, node, NULL);
|
||||
#else
|
||||
ret = cpuhp_invoke_callback(cpu, state, bringup, node, NULL);
|
||||
if (cpuhp_is_atomic_state(state)) {
|
||||
guard(irqsave)();
|
||||
ret = cpuhp_invoke_callback(cpu, state, bringup, node, NULL);
|
||||
/* STARTING/DYING must not fail! */
|
||||
WARN_ON_ONCE(ret);
|
||||
} else {
|
||||
ret = cpuhp_invoke_callback(cpu, state, bringup, node, NULL);
|
||||
}
|
||||
#endif
|
||||
BUG_ON(ret && !bringup);
|
||||
return ret;
|
||||
|
|
|
|||
Loading…
Reference in New Issue