mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Jinjie Ruan <ruanjinjie@huawei.com>
To: Reinette Chatre <reinette.chatre@intel.com>,
	<tony.luck@intel.com>, <Dave.Martin@arm.com>,
	<james.morse@arm.com>, <babu.moger@amd.com>, <bp@alien8.de>,
	<tan.shaopeng@fujitsu.com>, <x86@kernel.org>,
	<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 2/2] fs/resctrl: Skip monitor context allocation when force-freeing RMIDs
Date: Fri, 30 Oct 2026 16:21:06 +0800	[thread overview]
Message-ID: <e8f57912-b1e5-4434-a1b7-98a4fde9e540@huawei.com> (raw)
In-Reply-To: <e47f73ac-311c-4a6d-a283-aed675b95b6b@intel.com>



在 2026/10/30 2:15, Reinette Chatre 写道:
> Hi Jinjie,
> 
> There is no "force-freeing" of RMIDs. How about
> 	fs/resctrl: Do not allocate a monitor context when releasing limbo RMIDs
> 
> On 10/29/26 1:15 AM, Jinjie Ruan wrote:
>> __check_limbo() allocates the architecture monitor context before the
>> scan loop, even when the domain is going offline and the RMIDs will
>> be freed without reading their occupancy. So if the allocation fails,
>> the offline path returns early and leaves the busy RMIDs in limbo
>> which will be leaked instead of being released.
> 
> (please separate the context, problem, and solution descriptions).

OK.

> 
> "will be leaked" is a bit vague to gain confidence that there is an issue here.
> Compare with, for example, "The caller goes on to destroy the domain's
> monitoring state, freeing the bitmap that records which RMIDs are busy,
> so nothing can clear those bits afterwards and the busy counts never reach zero."
> 
> I think that there is an argument for this change even in the successful
> allocation path. If I understand correctly MPAM's resctrl_arch_mon_ctx_alloc()
> may need to block as it waits for a monitor? This would cause the CPU-offline
> path to block on a counter that will never be read.

I agree.

> 
>>
>> Split out release_limbo_rmids() for the offline path, which doesn't need
>> the monitor context.
> 
> Considering the shape of this fix and the "Fixes:" tag I think it may be
> worth a mention that this is not a revert of the indicated commit. This change
> maintains the intent of the original fix that avoids reading a counter in the
> offline path.

I agree.

> 
>>
>> Cc: James Morse <james.morse@arm.com>
>> Cc: Reinette Chatre <reinette.chatre@intel.com>
>> Fixes: fc16126cc11d ("x86,fs/resctrl: Prevent out-of-bounds access while offlining CPU when SNC enabled")
> 
> The changelog is missing a clear description of the impact of this issue.
> Nowhere does it mention that this only impacts MPAM and how likely this issue is. 

Will add the description.

> 
> This is important because this "Fixes:" commit has a "Cc: <stable@kernel.org>" so
> we need to help maintainers determine the impact of this issue to 
> guide where, if at all, it needs to be backported.

Thank you for the reminder.

> 
>> Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com>
>> ---
>>  fs/resctrl/internal.h |  3 +-
>>  fs/resctrl/monitor.c  | 69 ++++++++++++++++++++++++++++---------------
>>  fs/resctrl/rdtgroup.c |  2 +-
>>  3 files changed, 48 insertions(+), 26 deletions(-)
>>
>> diff --git a/fs/resctrl/internal.h b/fs/resctrl/internal.h
>> index e62a277dee85..a1837679b27a 100644
>> --- a/fs/resctrl/internal.h
>> +++ b/fs/resctrl/internal.h
>> @@ -405,7 +405,8 @@ void cqm_handle_limbo(struct work_struct *work);
>>  
>>  bool has_busy_rmid(struct rdt_l3_mon_domain *d);
>>  
>> -void __check_limbo(struct rdt_l3_mon_domain *d, bool force_free);
>> +void __check_limbo(struct rdt_l3_mon_domain *d);
> 
> Looks like __check_limbo() can be static now?
> 
>> +void release_limbo_rmids(struct rdt_l3_mon_domain *d);
>>  
>>  void resctrl_file_fflags_init(const char *config, unsigned long fflags);
>>  
>> diff --git a/fs/resctrl/monitor.c b/fs/resctrl/monitor.c
>> index b8f4e1ff4083..020140b794a7 100644
>> --- a/fs/resctrl/monitor.c
>> +++ b/fs/resctrl/monitor.c
>> @@ -124,13 +124,36 @@ static void limbo_release_entry(struct rmid_entry *entry)
>>  		closid_num_dirty_rmid[entry->closid]--;
>>  }
>>  
>> +/*
>> + * Release the busy RMIDs of a domain that is going offline. Their occupancy
>> + * can't be read any more, so they are freed without being checked.
> 
> Please document the function self, not the caller. Considering the comments in
> resctrl_offline_mon_domain() the caller already does a good job at this.

OK.

> 
> The "Their occupancy can't be read any more" also does not look right. I think
> this claim is based on x86's cpumask_empty() guard in resctrl_arch_rmid_read(), for
> x86 that does not actually mean that the occupancy cannot be read anymore, just that
> the CPU may already been removed from the domain at that point. This is really
> a platform specific detail that resctrl fs cannot assume.
> 
> How about something like:
> 
> 	/*
> 	 * Release the RMIDs that are marked as busy for this domain without
> 	 * checking their LLC occupancy. Cache lines may still be tagged with
> 	 * these RMIDs and will be accounted to the next user of each RMID.
> 	 */
> 
> I think such comment pairs well with the comment in the caller - it documents
> the consequence that the caller documents it is willing to take.
> 
>> + */
>> +void release_limbo_rmids(struct rdt_l3_mon_domain *d)
>> +{
>> +	u32 idx_limit = resctrl_arch_system_num_rmid_idx();
>> +	struct rmid_entry *entry;
>> +	u32 idx, cur_idx = 1;
>> +
>> +	for (;;) {
>> +		idx = find_next_bit(d->rmid_busy_llc, idx_limit, cur_idx);
>> +		if (idx >= idx_limit)
>> +			break;
>> +
>> +		entry = __rmid_entry(idx);
>> +		clear_bit(idx, d->rmid_busy_llc);
>> +		if (!--entry->busy)
>> +			limbo_release_entry(entry);
>> +		cur_idx = idx + 1;
>> +	}
>> +}
>> +
>>  /*
>>   * Check the RMIDs that are marked as busy for this domain. If the
>>   * reported LLC occupancy is below the threshold clear the busy bit and
>>   * decrement the count. If the busy count gets to zero on an RMID, we
>>   * free the RMID
>>   */
>> -void __check_limbo(struct rdt_l3_mon_domain *d, bool force_free)
>> +void __check_limbo(struct rdt_l3_mon_domain *d)
> 
> Now __check_limbO() can be static?

Yes

> 
>>  {
>>  	struct rdt_resource *r = resctrl_arch_get_resource(RDT_RESOURCE_L3);
>>  	u32 idx_limit = resctrl_arch_system_num_rmid_idx();
>> @@ -161,30 +184,28 @@ void __check_limbo(struct rdt_l3_mon_domain *d, bool force_free)
>>  			break;
> 
> To be true to the fix I think the rmid_dirty initializer added by fc16126cc11d
> can also be removed?
> 	"bool rmid_dirty = true;" -> "bool rmid_dirty;"
Yes

> 
>>  
>>  		entry = __rmid_entry(idx);
>> -		if (!force_free) {
>> -			if (resctrl_arch_rmid_read(r, &d->hdr, entry->closid,
>> -						   entry->rmid, QOS_L3_OCCUP_EVENT_ID,
>> -						   arch_priv, &val, arch_mon_ctx)) {
>> -				rmid_dirty = true;
>> -			} else {
>> -				rmid_dirty = (val >= resctrl_rmid_realloc_threshold);
>> -
>> -				/*
>> -				 * x86's CLOSID and RMID are independent numbers,
>> -				 * so the entry's CLOSID is an empty CLOSID
>> -				 * (X86_RESCTRL_EMPTY_CLOSID). On Arm the RMID
>> -				 * (PMG) extends the CLOSID (PARTID) space with
>> -				 * bits that aren't used to select the configuration.
>> -				 * It is thus necessary to track both CLOSID and
>> -				 * RMID because there may be dependencies between
>> -				 * them on some architectures.
>> -				 */
>> -				trace_mon_llc_occupancy_limbo(entry->closid, entry->rmid,
>> -							      d->hdr.id, val);
>> -			}
>> +		if (resctrl_arch_rmid_read(r, &d->hdr, entry->closid,
>> +					   entry->rmid, QOS_L3_OCCUP_EVENT_ID,
>> +					   arch_priv, &val, arch_mon_ctx)) {
>> +			rmid_dirty = true;
>> +		} else {
>> +			rmid_dirty = (val >= resctrl_rmid_realloc_threshold);
>> +
>> +			/*
>> +			 * x86's CLOSID and RMID are independent numbers,
>> +			 * so the entry's CLOSID is an empty CLOSID
>> +			 * (X86_RESCTRL_EMPTY_CLOSID). On Arm the RMID
>> +			 * (PMG) extends the CLOSID (PARTID) space with
>> +			 * bits that aren't used to select the configuration.
>> +			 * It is thus necessary to track both CLOSID and
>> +			 * RMID because there may be dependencies between
>> +			 * them on some architectures.
>> +			 */
>> +			trace_mon_llc_occupancy_limbo(entry->closid, entry->rmid,
>> +						      d->hdr.id, val);
>>  		}
>>  
>> -		if (force_free || !rmid_dirty) {
>> +		if (!rmid_dirty) {
>>  			clear_bit(idx, d->rmid_busy_llc);
>>  			if (!--entry->busy)
>>  				limbo_release_entry(entry);
>> @@ -843,7 +864,7 @@ void cqm_handle_limbo(struct work_struct *work)
>>  	if (cpumask_empty(&d->hdr.cpu_mask))
>>  		goto out_unlock;
>>  
>> -	__check_limbo(d, false);
>> +	__check_limbo(d);
>>  
>>  	if (has_busy_rmid(d)) {
>>  		d->cqm_work_cpu = cpumask_any_housekeeping(&d->hdr.cpu_mask,
>> diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c
>> index 57ab090072c2..5d0351453c2f 100644
>> --- a/fs/resctrl/rdtgroup.c
>> +++ b/fs/resctrl/rdtgroup.c
>> @@ -4590,7 +4590,7 @@ void resctrl_offline_mon_domain(struct rdt_resource *r, struct rdt_domain_hdr *h
>>  		 * the RMID as busy creates RMID leaks if the
>>  		 * package never comes back.
>>  		 */
>> -		__check_limbo(d, true);
>> +		release_limbo_rmids(d);
>>  	}
>>  
>>  	domain_destroy_l3_mon_state(d);
> 
> Thank you very much.
> 
> Reinette

-- 
Best regards,
Jinjie


      reply	other threads:[~2026-10-30  8:21 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-29  8:15 [PATCH 0/2] fs/resctrl: Fix RMID limbo handling Jinjie Ruan
2026-10-29  8:15 ` [PATCH 1/2] fs/resctrl: Return -EBUSY when per-CLOSID RMIDs are in limbo Jinjie Ruan
2026-10-29 18:12   ` Reinette Chatre
2026-10-30  8:07     ` Jinjie Ruan
2026-10-29  8:15 ` [PATCH 2/2] fs/resctrl: Skip monitor context allocation when force-freeing RMIDs Jinjie Ruan
2026-10-29 18:15   ` Reinette Chatre
2026-10-30  8:21     ` Jinjie Ruan [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e8f57912-b1e5-4434-a1b7-98a4fde9e540@huawei.com \
    --to=ruanjinjie@huawei.com \
    --cc=Dave.Martin@arm.com \
    --cc=babu.moger@amd.com \
    --cc=bp@alien8.de \
    --cc=james.morse@arm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=reinette.chatre@intel.com \
    --cc=tan.shaopeng@fujitsu.com \
    --cc=tony.luck@intel.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®