arm_mpam: Release the mon_sel lock on mpam_save_mbwu_state() errors

mpam_save_mbwu_state() takes the mon_sel lock at the top of each loop
iteration, but the four error paths that return after failed
MPAMF_MON_SEL register accesses do so without releasing it.

Take the lock with the conditional mon_sel_lock guard class instead,
so all exit paths release it.

Fixes: a3a94c13c4 ("arm_mpam: propagate MSC access errors for state saving function")
Signed-off-by: Ping Li <leeonion.muyu@gmail.com>
Reviewed-by: Ben Horgan <ben.horgan@arm.com>
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
Ping Li 2026-10-20 19:48:07 +08:00 committed by Catalin Marinas
parent d0de3a7319
commit 643b640256

View File

@ -2037,8 +2037,10 @@ static int mpam_save_mbwu_state(void *arg)
struct mpam_class *class = ris->vmsc->comp->class;
for (i = 0; i < ris->props.num_mbwu_mon; i++) {
if (WARN_ON_ONCE(!mpam_mon_sel_lock(msc)))
return -EIO;
ACQUIRE(mon_sel_lock, guard)(msc);
ret = ACQUIRE_ERR(mon_sel_lock, &guard);
if (ret)
return ret;
mbwu_state = &ris->mbwu_state[i];
cfg = &mbwu_state->cfg;
@ -2061,10 +2063,8 @@ static int mpam_save_mbwu_state(void *arg)
cfg->partid = FIELD_GET(MSMON_CFG_x_FLT_PARTID, cur_flt);
mbwu_state->enabled = FIELD_GET(MSMON_CFG_x_CTL_EN, cur_ctl);
if (!mbwu_state->enabled) {
mpam_mon_sel_unlock(msc);
if (!mbwu_state->enabled)
continue;
}
val = 0;
mbwu_arg = (struct mon_read) {
@ -2088,8 +2088,6 @@ static int mpam_save_mbwu_state(void *arg)
ret = mpam_write_monsel_reg(msc, CFG_MBWU_CTL, 0);
if (ret)
return ret;
mpam_mon_sel_unlock(msc);
}
return 0;