Re: [PATCH v9 2/9] fs/resctrl: Add resctrl_arch_rmid_idx_match() helper

From: Jinjie Ruan

Date: Mon Oct 26 2026 - 23:56:50 EST




在 2026/10/26 20:12, Ben Horgan 写道:
> Hi Jinjie,
>
> On 12/10/2026 09:23, Jinjie Ruan wrote:
>> The current RMID allocator assumes that RMID and CLOSID are entirely
>> independent or follow a rigid 2D encoding. This prevents architectures
>> where an RMID is bound to a specific CLOSID from properly filtering
>> free RMIDs.
>
> Is this patch required for the PARTID narrowing usage in this series? The static mapping is still a
> 2D encoding.

Hi ben,

Yes. Patch 7 needs it:

u32 resctrl_arch_rmid_idx_encode(u32 closid, u32 rmid)
{
if (resctrl_using_extra_partids)
return rmid; /* closid is gone */

return closid * (mpam_pmg_max + 1) + rmid;
}

With that, the old check below compares itr->rmid with itr->rmid, so it
always matches.

itr_idx = resctrl_arch_rmid_idx_encode(itr->closid, itr->rmid);
cmp_idx = resctrl_arch_rmid_idx_encode(closid, itr->rmid);
if (itr_idx == cmp_idx)
return itr;

So the allocator can then return an RMID from another CLOSID. For narrow
partid mode the task PARTID comes from the RMID as below, so the group
would use the wrong PARTID and read wrong counters. Patch 9 turns this on.

That is, after narrow PARTID is introduced, the allocated RMID needs to
correspond to the group.

static u16 resctrl_rmid_to_partid(u32 rmid)
{
return rmid / (mpam_pmg_max + 1);
}

Thanks,
Jinjie

>
> Thanks,
>
> Ben
>
>>
>> Introduce resctrl_arch_rmid_idx_match() to allow architectures to define
>> their own compatibility rules between a target CLOSID and an allocated
>> RMID's CLOSID.
>>
>> No functional change.
>
>
>
>>
>> Cc: Reinette Chatre <reinette.chatre@xxxxxxxxx>
>> Cc: Dave Martin <Dave.Martin@xxxxxxx>
>> Cc: James Morse <james.morse@xxxxxxx>
>> Cc: Babu Moger <babu.moger@xxxxxxx>
>> Cc: Thomas Gleixner <tglx@xxxxxxxxxx>
>> Cc: Ingo Molnar <mingo@xxxxxxxxxx>
>> Cc: Borislav Petkov <bp@xxxxxxxxx>
>> Cc: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
>> Cc: "H. Peter Anvin" <hpa@xxxxxxxxx>
>> Cc: Ben Horgan <ben.horgan@xxxxxxx>
>> Cc: Fenghua Yu <fenghuay@xxxxxxxxxx>
>> Suggested-by: James Morse <james.morse@xxxxxxx>
>> Signed-off-by: Zeng Heng <zengheng4@xxxxxxxxxx>
>> Signed-off-by: Jinjie Ruan <ruanjinjie@xxxxxxxxxx>
>> ---
>> arch/x86/include/asm/resctrl.h | 6 ++++++
>> drivers/resctrl/mpam_resctrl.c | 6 ++++++
>> fs/resctrl/monitor.c | 13 +++----------
>> include/linux/arm_mpam.h | 1 +
>> 4 files changed, 16 insertions(+), 10 deletions(-)
>>
>> diff --git a/arch/x86/include/asm/resctrl.h b/arch/x86/include/asm/resctrl.h
>> index 8f6edcdcfd87..7bb297a0ab6e 100644
>> --- a/arch/x86/include/asm/resctrl.h
>> +++ b/arch/x86/include/asm/resctrl.h
>> @@ -181,6 +181,12 @@ static inline u32 resctrl_arch_rmid_idx_encode(u32 ignored, u32 rmid)
>> return rmid;
>> }
>>
>> +/* x86 RMIDs are independent; any RMID can be used with any CLOSID. */
>> +static inline bool resctrl_arch_rmid_idx_match(u32 closid, u32 rmid_closid)
>> +{
>> + return true;
>> +}
>> +
>> /* x86 can always read an rmid, nothing needs allocating */
>> struct rdt_resource;
>> static inline void *resctrl_arch_mon_ctx_alloc(struct rdt_resource *r,
>> diff --git a/drivers/resctrl/mpam_resctrl.c b/drivers/resctrl/mpam_resctrl.c
>> index 9d223057953a..385c745787f2 100644
>> --- a/drivers/resctrl/mpam_resctrl.c
>> +++ b/drivers/resctrl/mpam_resctrl.c
>> @@ -279,6 +279,12 @@ u32 resctrl_arch_rmid_idx_encode(u32 closid, u32 rmid)
>> return closid * (mpam_pmg_max + 1) + rmid;
>> }
>>
>> +/* Check if the RMID's associated closid matches the target CLOSID. */
>> +bool resctrl_arch_rmid_idx_match(u32 closid, u32 rmid_closid)
>> +{
>> + return closid == rmid_closid;
>> +}
>> +
>> void resctrl_arch_rmid_idx_decode(u32 idx, u32 *closid, u32 *rmid)
>> {
>> *closid = idx / (mpam_pmg_max + 1);
>> diff --git a/fs/resctrl/monitor.c b/fs/resctrl/monitor.c
>> index 73413cb128ea..39908f67dea4 100644
>> --- a/fs/resctrl/monitor.c
>> +++ b/fs/resctrl/monitor.c
>> @@ -205,23 +205,16 @@ bool has_busy_rmid(struct rdt_l3_mon_domain *d)
>> static struct rmid_entry *resctrl_find_free_rmid(u32 closid)
>> {
>> struct rmid_entry *itr;
>> - u32 itr_idx, cmp_idx;
>>
>> if (list_empty(&rmid_free_lru))
>> return rmid_limbo_count ? ERR_PTR(-EBUSY) : ERR_PTR(-ENOSPC);
>>
>> list_for_each_entry(itr, &rmid_free_lru, list) {
>> /*
>> - * Get the index of this free RMID, and the index it would need
>> - * to be if it were used with this CLOSID.
>> - * If the CLOSID is irrelevant on this architecture, the two
>> - * index values are always the same on every entry and thus the
>> - * very first entry will be returned.
>> + * Check if the free RMID matches the target CLOSID.
>> + * Architecture-specific rules apply.
>> */
>> - itr_idx = resctrl_arch_rmid_idx_encode(itr->closid, itr->rmid);
>> - cmp_idx = resctrl_arch_rmid_idx_encode(closid, itr->rmid);
>> -
>> - if (itr_idx == cmp_idx)
>> + if (resctrl_arch_rmid_idx_match(closid, itr->closid))
>> return itr;
>> }
>>
>> diff --git a/include/linux/arm_mpam.h b/include/linux/arm_mpam.h
>> index f92a36187a52..0bc8049a3733 100644
>> --- a/include/linux/arm_mpam.h
>> +++ b/include/linux/arm_mpam.h
>> @@ -60,6 +60,7 @@ void resctrl_arch_sched_in(struct task_struct *tsk);
>> bool resctrl_arch_match_closid(struct task_struct *tsk, u32 closid);
>> bool resctrl_arch_match_rmid(struct task_struct *tsk, u32 closid, u32 rmid);
>> u32 resctrl_arch_rmid_idx_encode(u32 closid, u32 rmid);
>> +bool resctrl_arch_rmid_idx_match(u32 closid, u32 rmid_closid);
>> void resctrl_arch_rmid_idx_decode(u32 idx, u32 *closid, u32 *rmid);
>> u32 resctrl_arch_system_num_rmid_idx(void);
>>
>

--
Best regards,
Jinjie