mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +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: 724a86881d ("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
This commit is contained in:
parent
c94291914b
commit
673db10729
|
|
@ -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 @@ static int cpuhp_invoke_callback(unsigned int cpu, enum cpuhp_state state,
|
|||
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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user