summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBradley Morgan <include@grrlz.net>2026-06-19 16:37:17 +0000
committerThomas Gleixner <tglx@kernel.org>2026-06-21 20:44:00 +0200
commit673db10729fb121ea1b16fe57791a0cb9eac1eb5 (patch)
treea60daf1d1cfe8eedb23711cb38aa7404272e583d
parentc94291914b200e10c72cef23c8e4c67eb4fdbcd9 (diff)
downloadlwn-673db10729fb121ea1b16fe57791a0cb9eac1eb5.tar.gz
lwn-673db10729fb121ea1b16fe57791a0cb9eac1eb5.zip
cpu: hotplug: Preserve per instance callback errors
cpuhp_invoke_callback() unwinds earlier callbacks for the same hotplug state when one instance fails. The rollback path currently reuses ret, so a successful rollback can hide the original error and make the failed transition look successful. Keep the rollback result separate from the original error. Fixes: 724a86881d03 ("smp/hotplug: Callback vs state-machine consistency") Signed-off-by: Bradley Morgan <include@grrlz.net> Signed-off-by: Thomas Gleixner <tglx@kernel.org> Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20260619163719.12103-1-include@grrlz.net
-rw-r--r--kernel/cpu.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/kernel/cpu.c b/kernel/cpu.c
index 8df2d773fe3b..3ed24c711e3f 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -175,7 +175,7 @@ static int cpuhp_invoke_callback(unsigned int cpu, enum cpuhp_state state,
struct cpuhp_step *step = cpuhp_get_step(state);
int (*cbm)(unsigned int cpu, struct hlist_node *node);
int (*cb)(unsigned int cpu);
- int ret, cnt;
+ int ret, cnt, rollback_ret;
if (st->fail == state) {
st->fail = CPUHP_INVALID;
@@ -239,12 +239,12 @@ err:
break;
trace_cpuhp_multi_enter(cpu, st->target, state, cbm, node);
- ret = cbm(cpu, node);
- trace_cpuhp_exit(cpu, st->state, state, ret);
+ rollback_ret = cbm(cpu, node);
+ trace_cpuhp_exit(cpu, st->state, state, rollback_ret);
/*
* Rollback must not fail,
*/
- WARN_ON_ONCE(ret);
+ WARN_ON_ONCE(rollback_ret);
}
return ret;
}