[tip: smp/urgent] cpu: hotplug: Preserve per instance callback errors

From: tip-bot2 for Bradley Morgan

Date: Sun Jun 21 2026 - 14:47:00 EST


The following commit has been merged into the smp/urgent branch of tip:

Commit-ID: 673db10729fb121ea1b16fe57791a0cb9eac1eb5
Gitweb: https://git.kernel.org/tip/673db10729fb121ea1b16fe57791a0cb9eac1eb5
Author: Bradley Morgan <include@xxxxxxxxx>
AuthorDate: Fri, 19 Jun 2026 16:37:17
Committer: Thomas Gleixner <tglx@xxxxxxxxxx>
CommitterDate: Sun, 21 Jun 2026 20:44:00 +02:00

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@xxxxxxxxx>
Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxx>
Cc: stable@xxxxxxxxxxxxxxx
Link: https://patch.msgid.link/20260619163719.12103-1-include@xxxxxxxxx
---
kernel/cpu.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/kernel/cpu.c b/kernel/cpu.c
index 8df2d77..3ed24c7 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;
}