mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
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:
parent
d0de3a7319
commit
643b640256
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user