All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Luck, Tony" <tony.luck@intel.com>
To: Babu Moger <babu.moger@amd.com>
Cc: Fenghua Yu <fenghuay@nvidia.com>,
	Reinette Chatre <reinette.chatre@intel.com>,
	Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com>,
	Peter Newman <peternewman@google.com>,
	James Morse <james.morse@arm.com>,
	Drew Fustini <dfustini@baylibre.com>,
	"Dave Martin" <Dave.Martin@arm.com>,
	Chen Yu <yu.c.chen@intel.com>,
	David E Box <david.e.box@intel.com>, <x86@kernel.org>,
	Christoph Hellwig <hch@infradead.org>,
	<linux-kernel@vger.kernel.org>, <patches@lists.linux.dev>
Subject: Re: [PATCH v13 13/25] arm,x86,fs/resctrl: Allocate maximum needed rmid_ptrs[]
Date: Tue, 6 Oct 2026 15:07:49 -0700	[thread overview]
Message-ID: <asVxNVeP8d6HPRu0@agluck-desk3> (raw)
In-Reply-To: <327d9248-2e4f-41b8-b4ad-4f6d01c85ecb@amd.com>

Hi Babu,

On Tue, Oct 06, 2026 at 02:53:49PM -0500, Babu Moger wrote:
> Hi Tony,

... snip ...

> >   int setup_rmid_lru_list(void)
> >   {
> > -	struct rmid_entry *entry = NULL;
> > -	u32 idx_limit;
> > -	u32 idx;
> > +	struct rmid_entry *entry;
> > +	u32 cur_idx_limit;
> > +	u32 rsvd_idx;
> >   	int i;
> >   	if (!resctrl_mon_capable())
> >   		return 0;
> >   	/*
> > -	 * Called on every mount, but the number of RMIDs cannot change
> > -	 * after the first mount, so keep using the same set of rmid_ptrs[]
> > -	 * until resctrl_exit(). Note that the limbo handler continues to
> > -	 * access rmid_ptrs[] after resctrl is unmounted.
> > +	 * Allocate the largest number of RMIDs that this system will ever
> > +	 * need. These cannot be freed until resctrl_exit() because the limbo
> > +	 * handler continues to access rmid_ptrs[] after resctrl is unmounted.
> >   	 */
> > -	if (rmid_ptrs)
> > -		return 0;
> > +	if (!rmid_ptrs) {
> > +		num_rmid_ptrs = resctrl_arch_system_max_rmid_idx();
> > +		rmid_ptrs = kzalloc_objs(struct rmid_entry, num_rmid_ptrs);
> > +		if (!rmid_ptrs) {
> > +			num_rmid_ptrs = 0;
> > +			return -ENOMEM;
> > +		}
> > -	idx_limit = resctrl_arch_system_num_rmid_idx();
> > -	rmid_ptrs = kzalloc_objs(struct rmid_entry, idx_limit);
> > -	if (!rmid_ptrs)
> > -		return -ENOMEM;
> > +		for (i = 0; i < num_rmid_ptrs; i++) {
> > +			entry = &rmid_ptrs[i];
> > +			INIT_LIST_HEAD(&entry->list);
> 
> [1]. All the nodes are initialized. Basically, it is pointing to itself now.

This is setting the ->next and ->prev fields to point to the entry. So
each of them is an empty list. Maybe I should just delete this as it is
pointless. Later on these objects are added to the free list with:

	list_add_tail(&entry->list, &rmid_free_lru);

but if you dig into that code you'll see that the ->next and ->prev
fields are never read (not even in all the debug/sanity routines). Both
fields are overwritten to add them to the free list.

Note that this seems to be a common pattern. Code does
INIT_LIST_HEAD(&x->list) and then immediately uses list_add()
or list_add_tail() to put "x" onto a list.

> 
> > -	for (i = 0; i < idx_limit; i++) {
> > -		entry = &rmid_ptrs[i];
> > -		INIT_LIST_HEAD(&entry->list);
> > +			resctrl_arch_rmid_idx_decode(i, &entry->closid, &entry->rmid);
> > +		}
> > +	}
> > -		resctrl_arch_rmid_idx_decode(i, &entry->closid, &entry->rmid);
> > -		list_add_tail(&entry->list, &rmid_free_lru);
> > +	/* Find how many RMIDs are available for this mount */
> > +	cur_idx_limit = resctrl_arch_system_num_rmid_idx();
> > +	if (cur_idx_limit > num_rmid_ptrs) {
> > +		pr_warn_once("RMID count %u exceeds allocation. Limit to %u\n",
> > +			     cur_idx_limit, num_rmid_ptrs);
> > +		cur_idx_limit = num_rmid_ptrs;
> >   	}
> > +	INIT_LIST_HEAD(&rmid_free_lru);
> 
> Initializing the list head without first cleaning up existing entries could
> be problematic here.

I don't see a problem. Any entries on the list are left floating, but
they are all in the rmid_ptrs[] so easy to access them again.
rmid_free_list is now an empty list having discarded all entries that
were on it. Sure, those floating entries have stale pointers sitting in 
their ->next and ->prev fields. But those pointers are not going to be
used by any code.

> The first mount works correctly, and INIT_LIST_HEAD() is not needed in that
> case because the list head is already statically initialized.
> 
> However, on a subsequent mount, the list entries remain linked from the
> previous mount through the setup performed in [2] below.
> 
> INIT_LIST_HEAD() only reinitializes the list head itself. It does not
> traverse the list and detach or reinitialize existing entries as was done in
> [1].
> 
> I think you need to replace
> 
> INIT_LIST_HEAD(&rmid_free_lru);
> 
> to
> 
> while (!list_empty(&rmid_free_lru))
>         list_del_init(rmid_free_lru.next);

That would set up all those floating entries each as an empty list. But
doing that doesn't matter. No code is going to look at the ->next or
->prev fields.

> 
> This ensures that any entries left over from a previous mount are properly
> detached before the list is reinitialized.
> 
> 
> > +
> >   	/*
> >   	 * RESCTRL_RESERVED_CLOSID and RESCTRL_RESERVED_RMID are special and
> >   	 * are always allocated. These are used for the rdtgroup_default
> >   	 * control group, which was setup earlier in rdtgroup_setup_default().
> >   	 */
> > -	idx = resctrl_arch_rmid_idx_encode(RESCTRL_RESERVED_CLOSID,
> > -					   RESCTRL_RESERVED_RMID);
> > -	entry = __rmid_entry(idx);
> > -	list_del(&entry->list);
> > +	rsvd_idx = resctrl_arch_rmid_idx_encode(RESCTRL_RESERVED_CLOSID,
> > +						RESCTRL_RESERVED_RMID);
> > +
> > +	for (i = 0; i < cur_idx_limit; i++) {
> > +		entry = &rmid_ptrs[i];
> > +		/* Don't add reserved or busy entries to free list */
> > +		if (i == rsvd_idx || entry->busy)
> > +			continue;
> > +		list_add_tail(&entry->list, &rmid_free_lru);
> 
> [2]. Here nodes are linked to head.  Basically, Head <->A <->B <->HEAD

As mentioned above, the ->next and ->prev fields of this entry are not
used when adding it to the rmid_free_lru list.
> 
> 
> Thanks
> 
> Babu

-Tony

  reply	other threads:[~2026-10-06 22:07 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-28 22:14 [PATCH v13 00/25] Allow AET to use PMT as loadable module Tony Luck
2026-09-28 22:14 ` [PATCH v13 01/25] fs/resctrl: Ensure default group reports tasks on monitor-only systems Tony Luck
2026-10-08 22:21   ` Reinette Chatre
2026-09-28 22:14 ` [PATCH v13 02/25] x86/cpufeatures: Add missing CQM feature dependency Tony Luck
2026-09-28 22:14 ` [PATCH v13 03/25] x86/resctrl: Check if monitoring features are supported Tony Luck
2026-10-08 23:25   ` Reinette Chatre
2026-09-28 22:14 ` [PATCH v13 04/25] x86/resctrl: Centralize monitoring feature enumeration Tony Luck
2026-09-28 22:14 ` [PATCH v13 05/25] x86/resctrl: Apply Intel MBM quirk from rdt_get_l3_mon_config() Tony Luck
2026-10-09 17:15   ` Reinette Chatre
2026-09-28 22:14 ` [PATCH v13 06/25] x86/resctrl: Delete resctrl_cpu_detect() Tony Luck
2026-09-28 22:14 ` [PATCH v13 07/25] arm,x86,fs/resctrl: Replace architecture resctrl_arch_{alloc,mon}_capable() Tony Luck
2026-09-28 22:14 ` [PATCH v13 08/25] x86/resctrl: Update special case for Intel Haswell enumeration Tony Luck
2026-09-28 22:14 ` [PATCH v13 09/25] x86/resctrl: Delete rdt_alloc_capable and rdt_mon_capable Tony Luck
2026-09-28 22:14 ` [PATCH v13 10/25] fs/resctrl: Remove redundant calls to resctrl_mon_capable() Tony Luck
2026-09-28 22:14 ` [PATCH v13 11/25] x86/resctrl: Honor rdt={perf|energy} options to force enable AET events Tony Luck
2026-09-28 22:14 ` [PATCH v13 12/25] fs/resctrl: Add interface to disable a monitor event Tony Luck
2026-09-28 22:14 ` [PATCH v13 13/25] arm,x86,fs/resctrl: Allocate maximum needed rmid_ptrs[] Tony Luck
2026-10-06 19:53   ` Babu Moger
2026-10-06 22:07     ` Luck, Tony [this message]
2026-10-07 14:10       ` Moger, Babu
2026-09-28 22:14 ` [PATCH v13 14/25] arm,x86,fs/resctrl: Use right size for L3 monitor data structures Tony Luck
2026-09-28 22:14 ` [PATCH v13 15/25] x86,fs/resctrl: Handle systems where AET is the only resource Tony Luck
2026-09-28 22:15 ` [PATCH v13 16/25] x86/resctrl: Add PMT registration API for AET enumeration callbacks Tony Luck
2026-09-28 22:15 ` [PATCH v13 17/25] platform/x86/intel/pmt: Register enumeration functions with resctrl Tony Luck
2026-09-28 22:15 ` [PATCH v13 18/25] x86/resctrl: Use registered function pointers for AET enumeration Tony Luck
2026-09-29 17:52   ` [PATCH v14.1 " Tony Luck
2026-09-28 22:15 ` [PATCH v13 19/25] arm,x86,fs/resctrl: Enumerate AET on every resctrl mount Tony Luck
2026-09-29 17:52   ` [PATCH v14.1 " Tony Luck
2026-10-07 19:55     ` Babu Moger
2026-10-07 20:43       ` Luck, Tony
2026-09-28 22:15 ` [PATCH v13 20/25] x86/resctrl: Enforce system RMID limit on AET Tony Luck
2026-09-29 17:52   ` [PATCH v14.1 " Tony Luck
2026-09-28 22:15 ` [PATCH v13 21/25] x86/resctrl: Export interface to report telemetry unbind/remove Tony Luck
2026-09-29 17:52   ` [PATCH v14.1 " Tony Luck
2026-09-28 22:15 ` [PATCH v13 22/25] platform/x86/intel/pmt: Inform resctrl when MMIO maps are being removed Tony Luck
2026-09-28 22:15 ` [PATCH v13 23/25] x86/resctrl: Require 64-bit x86 for resctrl support Tony Luck
2026-09-28 22:15 ` [PATCH v13 24/25] x86/resctrl: Simplify Kconfig options for resctrl Tony Luck
2026-09-28 22:15 ` [PATCH v13 25/25] x86,fs/resctrl: Document telemetry mount timing caveat Tony Luck
2026-09-29  0:29 ` [PATCH v13 00/25] Allow AET to use PMT as loadable module Luck, Tony
2026-09-29 19:43   ` Luck, Tony

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=asVxNVeP8d6HPRu0@agluck-desk3 \
    --to=tony.luck@intel.com \
    --cc=Dave.Martin@arm.com \
    --cc=babu.moger@amd.com \
    --cc=david.e.box@intel.com \
    --cc=dfustini@baylibre.com \
    --cc=fenghuay@nvidia.com \
    --cc=hch@infradead.org \
    --cc=james.morse@arm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maciej.wieczor-retman@intel.com \
    --cc=patches@lists.linux.dev \
    --cc=peternewman@google.com \
    --cc=reinette.chatre@intel.com \
    --cc=x86@kernel.org \
    --cc=yu.c.chen@intel.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.