diff options
| author | Bradley Morgan <include@grrlz.net> | 2026-06-19 16:37:17 +0000 |
|---|---|---|
| committer | Thomas Gleixner <tglx@kernel.org> | 2026-06-21 20:44:00 +0200 |
| commit | 673db10729fb121ea1b16fe57791a0cb9eac1eb5 (patch) | |
| tree | a60daf1d1cfe8eedb23711cb38aa7404272e583d /kernel | |
| parent | c94291914b200e10c72cef23c8e4c67eb4fdbcd9 (diff) | |
| download | lwn-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
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cpu.c | 8 |
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; } |
