From: "Luck, Tony" <tony.luck@intel.com>
To: Reinette Chatre <reinette.chatre@intel.com>
Cc: Fenghua Yu <fenghuay@nvidia.com>,
Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com>,
Peter Newman <peternewman@google.com>,
James Morse <james.morse@arm.com>,
Babu Moger <babu.moger@amd.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>,
<linux-kernel@vger.kernel.org>, <patches@lists.linux.dev>
Subject: Re: [PATCH v4 4/7] fs,x86/resctrl: Add architecture hooks for every mount/unmount
Date: Mon, 6 Apr 2026 13:35:10 -0700 [thread overview]
Message-ID: <adQY_m8I2jUiR88k@agluck-desk3> (raw)
In-Reply-To: <45436044-202b-4d77-b552-2156be47a52d@intel.com>
Hi Reinette,
On Fri, Apr 03, 2026 at 05:52:30PM -0700, Reinette Chatre wrote:
> Hi Tony,
>
> On 3/30/26 2:43 PM, Tony Luck wrote:
> > Add hooks for every mount/unmount of the resctrl file system so that
> > architecture code can allocate on mount and free on unmount.
>
> Please use the changelog to describe and motivate all the other things
> that this patch does.
OK. I will expand.
> >
> > Signed-off-by: Tony Luck <tony.luck@intel.com>
> > ---
> >
> > Note this patch disables enumeration of AET monitor events because the
> > new mount/unmount hooks do not call intel_aet_get_events() (which is
> > not ready for the change from "just on first mount" to "called on
> > every mount"). That is resolved in the next patch.
>
> This could be part of the proper changelog.
>
> Could patches be re-ordered to support incremental changes?
I'll look again because several things have changed since I ordered
the series this way. But some bits got overly complicated trying to
make AET ready to be called multiple times. If I can't solve elegantly
I'll move this into the proper changelog.
> >
> > include/linux/resctrl.h | 12 +++++--
> > arch/x86/kernel/cpu/resctrl/internal.h | 8 +++--
> > arch/x86/kernel/cpu/resctrl/core.c | 14 +++++++-
> > arch/x86/kernel/cpu/resctrl/intel_aet.c | 13 ++++++++
> > fs/resctrl/rdtgroup.c | 43 ++++++++++++++++++-------
> > 5 files changed, 74 insertions(+), 16 deletions(-)
> >
> > diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h
> > index b312aaf76974..489c7d4ae3e9 100644
> > --- a/include/linux/resctrl.h
> > +++ b/include/linux/resctrl.h
> > @@ -518,11 +518,19 @@ void resctrl_online_cpu(unsigned int cpu);
> > void resctrl_offline_cpu(unsigned int cpu);
> >
> > /*
> > - * Architecture hook called at beginning of first file system mount attempt.
> > - * No locks are held.
> > + * Architecture hooks for resctrl mount/unmount.
> > + * Each is called with resctrl_mount_lock held.
> > */
> > +
> > +/* Called at beginning of each file system mount attempt. */
> > void resctrl_arch_pre_mount(void);
> >
> > +/* Called to report success/failure of mount. */
> > +void resctrl_arch_mount_result(int ret);
>
> Why is this needed? Why not just always call resctrl_arch_unmount()?
You are right. If the mount fails in the resctrl code, resctrl_arch_unmount()
can clean things up.
> > +
> > +/* Called to report unmount. */
> > +void resctrl_arch_unmount(void);
> > +
> > /**
> > * resctrl_arch_rmid_read() - Read the eventid counter corresponding to rmid
> > * for this resource and domain.
> > diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h
> > index e3cfa0c10e92..6f322818a9e6 100644
> > --- a/arch/x86/kernel/cpu/resctrl/internal.h
> > +++ b/arch/x86/kernel/cpu/resctrl/internal.h
> > @@ -234,14 +234,18 @@ void rdt_domain_reconfigure_cdp(struct rdt_resource *r);
> > void resctrl_arch_mbm_cntr_assign_set_one(struct rdt_resource *r);
> >
> > #ifdef CONFIG_X86_CPU_RESCTRL_INTEL_AET
> > -bool intel_aet_get_events(void);
> > +bool intel_aet_pre_mount(void);
> > +void intel_aet_mount_result(int ret);
> > +void intel_aet_unmount(void);
> > void __exit intel_aet_exit(void);
> > int intel_aet_read_event(int domid, u32 rmid, void *arch_priv, u64 *val);
> > void intel_aet_mon_domain_setup(int cpu, int id, struct rdt_resource *r,
> > struct list_head *add_pos);
> > bool intel_handle_aet_option(bool force_off, char *tok);
> > #else
> > -static inline bool intel_aet_get_events(void) { return false; }
> > +static inline bool intel_aet_pre_mount(void) { return false; }
> > +static inline void intel_aet_mount_result(int ret) { }
> > +static inline void intel_aet_unmount(void) { }
> > static inline void __exit intel_aet_exit(void) { }
> > static inline int intel_aet_read_event(int domid, u32 rmid, void *arch_priv, u64 *val)
> > {
> > diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c
> > index 7667cf7c4e94..162eca2cfcdb 100644
> > --- a/arch/x86/kernel/cpu/resctrl/core.c
> > +++ b/arch/x86/kernel/cpu/resctrl/core.c
> > @@ -769,8 +769,10 @@ void resctrl_arch_pre_mount(void)
> > struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_PERF_PKG].r_resctrl;
> > int cpu;
> >
> > - if (!intel_aet_get_events())
> > + if (!intel_aet_pre_mount()) {
> > + r->mon_capable = false;
>
> Why is this needed?
I'll move to the next patch. It's needed for the case when AET works on some
mount and then fails on a subsequent one. But that can't happen at this point
in this patch series.
> > return;
> > + }
> >
> > /*
> > * Late discovery of telemetry events means the domains for the
>
>
> ...
>
> > #include "internal.h"
> >
> > +/* Mutex protecting mount/unmount operations */
> > +static DEFINE_MUTEX(resctrl_mount_lock);
> > +
> > /* Mutex to protect rdtgroup access. */
> > DEFINE_MUTEX(rdtgroup_mutex);
> >
> > @@ -2788,17 +2790,8 @@ static int rdt_get_tree(struct fs_context *fc)
> > struct rdt_resource *r;
> > int ret;
> >
> > - DO_ONCE_SLEEPABLE(resctrl_arch_pre_mount);
> > -
> > cpus_read_lock();
> > mutex_lock(&rdtgroup_mutex);
> > - /*
> > - * resctrl file system can only be mounted once.
> > - */
> > - if (resctrl_mounted) {
> > - ret = -EBUSY;
> > - goto out;
> > - }
> >
> > ret = setup_rmid_lru_list();
> > if (ret)
> > @@ -2900,6 +2893,30 @@ static int rdt_get_tree(struct fs_context *fc)
> > return ret;
> > }
> >
> > +static int rdt_get_tree_wrapper(struct fs_context *fc)
> > +{
> > + int ret;
> > +
> > + mutex_lock(&resctrl_mount_lock);
> > +
> > + /*
> > + * resctrl file system can only be mounted once.
> > + */
> > + if (resctrl_mounted) {
> > + mutex_unlock(&resctrl_mount_lock);
> > + return -EBUSY;
> > + }
> > +
>
> This does not look right. Here too is resctrl_mounted accessed without rdtgroup_mutex
> held. This change implies that resctrl_mounted is now protected by resctrl_mount_lock
> but resctrl is not changed to respect this throughout resulting in unsafe access of
> resctrl_mounted.
>
> Does this new resctrl_mount_lock need to be in resctrl fs? It really seems as though the
> needed synchronization belongs in the architecture. Could this instead be accomplished
> with a private mutex within the AET code?
If you dig in lore for the v3 of this patch, you'll see I had the mutex in the
AET code. But there were some complications.
1) Need to acquire in intel_aet_pre_mount() and release in intel_aet_mount_result()
which is legal, but makes code more complex when call chains need to be compared to
check that the mutex is being released correctly.
2) The "only mounted once" case meant extra state (AET_PRESENT, which you note
in next patch may be redundant) because intel_aet_pre_mount() is called, but
needs to do nothing.
Adding resctrl_mount_lock to the file system code made things simpler. The
pre-mount code can't be called with rdtgroup_mutex held because it needs to
build the domains. That needs cpus_read_lock() + mutex_lock(&domain_list_lock);
I need to add more comments on locking. resctrl_mounted is only modified when both
resctrl_mount_lock AND rdtgroup_mutex are held. I believe that makes it safe to
read the value of resctrl_mounted with just rdtgroup_mutex held.
> > + resctrl_arch_pre_mount();
> > +
> > + ret = rdt_get_tree(fc);
> > +
> > + resctrl_arch_mount_result(ret);
>
> Could this instead just call resctrl_arch_unmount() on failure?
Yes. Thanks for the suggestion.
> Reinette
-Tony
next prev parent reply other threads:[~2026-04-06 20:35 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-30 21:43 [PATCH v4 0/7] Allow AET to use PMT/TPMI as loadable modules Tony Luck
2026-03-30 21:43 ` [PATCH v4 1/7] platform/x86/intel/pmt: Export PMT enumeration functions as GPL Tony Luck
2026-04-04 0:00 ` Reinette Chatre
2026-04-06 18:07 ` David Box
2026-04-08 5:07 ` Christoph Hellwig
2026-04-08 17:01 ` Luck, Tony
2026-04-09 5:41 ` Christoph Hellwig
2026-03-30 21:43 ` [PATCH v4 2/7] x86/resctrl: Drop setting of event_group::force_off when insufficient RMIDs Tony Luck
2026-04-04 0:01 ` Reinette Chatre
2026-03-30 21:43 ` [PATCH v4 3/7] fs/resctrl: Add interface to disable a monitor event Tony Luck
2026-04-04 0:03 ` Reinette Chatre
2026-04-06 18:35 ` Luck, Tony
2026-04-06 21:13 ` Reinette Chatre
2026-04-07 18:40 ` Luck, Tony
2026-04-07 23:10 ` Reinette Chatre
2026-03-30 21:43 ` [PATCH v4 4/7] fs,x86/resctrl: Add architecture hooks for every mount/unmount Tony Luck
2026-04-04 0:52 ` Reinette Chatre
2026-04-06 20:35 ` Luck, Tony [this message]
2026-04-06 21:16 ` Reinette Chatre
2026-04-09 20:35 ` Luck, Tony
2026-04-10 15:16 ` Reinette Chatre
2026-04-10 18:59 ` Luck, Tony
2026-04-10 21:21 ` Reinette Chatre
2026-04-10 23:03 ` Luck, Tony
2026-04-21 20:25 ` Luck, Tony
2026-04-22 21:28 ` Reinette Chatre
2026-04-22 21:59 ` Luck, Tony
2026-04-22 22:10 ` Reinette Chatre
2026-04-22 22:44 ` Luck, Tony
2026-04-22 23:17 ` Reinette Chatre
2026-04-23 22:29 ` Luck, Tony
2026-04-23 23:54 ` Reinette Chatre
2026-04-24 19:09 ` Luck, Tony
2026-03-30 21:43 ` [PATCH v4 5/7] x86/resctrl: Resolve PMT and TPMI symbols at runtime Tony Luck
2026-04-04 0:56 ` Reinette Chatre
2026-04-07 18:13 ` Luck, Tony
2026-04-07 18:40 ` Reinette Chatre
2026-04-07 20:33 ` Luck, Tony
2026-03-30 21:43 ` [PATCH v4 6/7] x86/resctrl: Delete intel_aet_exit() Tony Luck
2026-03-30 21:43 ` [PATCH v4 7/7] x86/resctrl: Downgrade dependency of AET on INTEL_PMT Tony Luck
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=adQY_m8I2jUiR88k@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=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.