Re: [PATCH v3 07/16] arm_mpam: __ris_msmon_read(): get rid of nrdy special handling
From: Ben Horgan
Date: Mon Jul 20 2026 - 13:10:07 EST
Hi Andre,
On 7/20/26 16:58, Andre Przywara wrote:
> Hi Ben,
>
> thanks for having a look!
>
> On 7/15/26 15:39, Ben Horgan wrote:
>> Hi Andre,
>>
>> On 7/10/26 15:45, Andre Przywara wrote:
>>> Although so far MSC accesses couldn't fail, there is one special
>>> condition that would create an error: when the MBWU counter wouldn't be
>>> able to read a stable value, we were setting bit 63 to mark this value
>>> as unstable, and return this as an error later.
>>> Now since the functions can return a proper error value, we can get rid of
>>> this kludge and use the return value directly.
>>>
>>> Remove the "nrdy" error flag variable, and assign -EBUSY to "ret" to handle
>>> this case.
>>
>> I don't think we want this patch. The h/w can still return (as much as it ever could) and so we
>> still need to handle it even if we are no longer augmenting its meaning in software to also indicate
>> an unstable 64 bit value.
>
> Mmh, not sure I understand your concern: to me it looks like nrdy is some kind of error flag, that
> we used in absence of a proper error return value. Now we have "int ret;", so can use that directly?
> But to me it looks like nothing really changes, or did I miss something?
>
> I have no really strong opinion of this patch, it was more an pportunity to consolidate the crude
> error handling in this function. I am happy to drop it, if you like, maybe we can revisit this later.
What I was trying to say is that mpam_msc_read_mbwu_l() could previously return a value with bit 63,
MSMON__L_NRDY set in two cases, one set by s/w and one set by h/w. Either when it reads that
directly from the hardware or when it is set in the function to indicate an unstable value. The h/w
case is the same for 31 bit counters too except in that case the h/w sets bit 31, MSMON_NRDY. Using
'ret' to directly return -EBUSY for the s/w case where a stable value is not reached for 44 or 63
bit counters doesn't mean that the h/w case won't happen.
Thanks,
Ben
>
> Cheers,
> Andre
>
>>
>> Thanks,
>>
>> Ben
>>
>>>
>>> Signed-off-by: Andre Przywara <andre.przywara@xxxxxxx>
>>> ---
>>> drivers/resctrl/mpam_devices.c | 38 +++++++++++++++-------------------
>>> 1 file changed, 17 insertions(+), 21 deletions(-)
>>>
>>> diff --git a/drivers/resctrl/mpam_devices.c b/drivers/resctrl/mpam_devices.c
>>> index 84a8715464be..530ac0fe97b5 100644
>>> --- a/drivers/resctrl/mpam_devices.c
>>> +++ b/drivers/resctrl/mpam_devices.c
>>> @@ -1306,7 +1306,6 @@ static void __ris_msmon_read(void *arg)
>>> u64 now;
>>> int ret;
>>> u32 now32;
>>> - bool nrdy = false;
>>> bool config_mismatch;
>>> bool overflow = false;
>>> struct mon_read *m = arg;
>>> @@ -1371,14 +1370,18 @@ static void __ris_msmon_read(void *arg)
>>> switch (m->type) {
>>> case mpam_feat_msmon_csu:
>>> ret = mpam_read_monsel_reg(msc, CSU, &now32);
>>> + if (!ret) {
>>> + if ((now32 & MSMON___NRDY))
>>> + ret = -EBUSY;
>>> +
>>> + if (mpam_has_quirk(IGNORE_CSU_NRDY, msc) &&
>>> + m->waited_timeout)
>>> + ret = 0;
>>> + }
>>> if (ret)
>>> goto out_unlock;
>>> - nrdy = now32 & MSMON___NRDY;
>>> - now = FIELD_GET(MSMON___VALUE, now32);
>>> -
>>> - if (mpam_has_quirk(IGNORE_CSU_NRDY, msc) && m->waited_timeout)
>>> - nrdy = false;
>>> + now = FIELD_GET(MSMON___VALUE, now32);
>>> break;
>>> case mpam_feat_msmon_mbwu_31counter:
>>> case mpam_feat_msmon_mbwu_44counter:
>>> @@ -1394,9 +1397,11 @@ static void __ris_msmon_read(void *arg)
>>> now = FIELD_GET(MSMON___L_VALUE, now);
>>> } else {
>>> ret = mpam_read_monsel_reg(msc, MBWU, &now32);
>>> + if (!ret && (now32 & MSMON___NRDY))
>>> + ret = -EBUSY;
>>> if (ret)
>>> goto out_unlock;
>>> - nrdy = now32 & MSMON___NRDY;
>>> +
>>> now = FIELD_GET(MSMON___VALUE, now32);
>>> }
>>> @@ -1404,9 +1409,6 @@ static void __ris_msmon_read(void *arg)
>>> m->type != mpam_feat_msmon_mbwu_63counter)
>>> now *= 64;
>>> - if (nrdy)
>>> - break;
>>> -
>>> mbwu_state = &ris->mbwu_state[ctx->mon];
>>> if (overflow)
>>> @@ -1419,22 +1421,16 @@ static void __ris_msmon_read(void *arg)
>>> now += mbwu_state->correction;
>>> break;
>>> default:
>>> - m->err = -EINVAL;
>>> + ret = -EINVAL;
>>> }
>>> - mpam_mon_sel_unlock(msc);
>>> -
>>> - if (nrdy)
>>> - m->err = -EBUSY;
>>> -
>>> - if (!m->err)
>>> - *m->val += now;
>>> -
>>> - return;
>>> out_unlock:
>>> mpam_mon_sel_unlock(msc);
>>> - m->err = ret;
>>> + if (ret)
>>> + m->err = ret;
>>> + else
>>> + *m->val += now;
>>> }
>>> static int _msmon_read(struct mpam_component *comp, struct mon_read *arg)
>>
>