From: Babu Moger <babu.moger@amd.com>
To: Tony Luck <tony.luck@intel.com>
Cc: Dave.Martin@arm.com, david.e.box@intel.com,
dfustini@baylibre.com, fenghuay@nvidia.com, hch@infradead.org,
james.morse@arm.com, linux-kernel@vger.kernel.org,
maciej.wieczor-retman@intel.com, patches@lists.linux.dev,
peternewman@google.com, reinette.chatre@intel.com,
x86@kernel.org, yu.c.chen@intel.com
Subject: Re: [PATCH v14.1 19/25] arm,x86,fs/resctrl: Enumerate AET on every resctrl mount
Date: Wed, 7 Oct 2026 14:55:30 -0500 [thread overview]
Message-ID: <4aa18085-49b6-48e5-83dc-33d87a60a99d@amd.com> (raw)
In-Reply-To: <20260929175231.16576-1-tony.luck@intel.com>
Hi Tony,
On 9/29/26 12:52, Tony Luck wrote:
> The pmt_telemetry driver is built-in, and Application Energy Telemetry (AET)
> is only enumerated on the first mount of the resctrl file system.
>
> In order to allow the pmt_telemetry driver to be a module, changes are
> needed to place a hold on the driver only while the resctrl file system
> is mounted. This means that resctrl must enumerate AET features on every
> mount, and clean up on every unmount.
>
> There are changes to three software layers:
>
> 1) resctrl file system
> Call architecture code for every mount and unmount. Locking is needed
> here so that architecture code can be sure that every call to
> resctrl_arch_pre_mount() occurs while the file system is not mounted,
> and resctrl_arch_unmount() occurs only to clean up a failed mount or
> to unmount the file system.
>
> 2) Architecture code
> New function resctrl_arch_unmount(). On x86 this calls the AET code
> if RDT_RESOURCE_PERF_PKG was marked as supporting monitoring by an
> earlier mount attempt. It completes cleanup by removing all domains
> used by AET.
>
> 3) AET code
> Disables all AET events and informs pmt_telemetry driver that it is no
> longer using the pmt_feature_group structures it received during mount.
> Releases the hold on the pmt_telemetry driver allowing it to be unloaded.
> All cleanup is handled by intel_aet_unmount() and intel_aet_exit() is
> no longer needed.
>
> Signed-off-by: Tony Luck <tony.luck@intel.com>
> ---
> v14:
> aet_register_lock name changed to aet_lock.
> ---
> include/linux/resctrl.h | 10 +++++++--
> arch/x86/kernel/cpu/resctrl/internal.h | 4 ++--
> arch/x86/kernel/cpu/resctrl/core.c | 21 +++++++++++++++--
> arch/x86/kernel/cpu/resctrl/intel_aet.c | 29 +++++++++++++++++++-----
> drivers/resctrl/mpam_resctrl.c | 4 ++++
> fs/resctrl/rdtgroup.c | 30 ++++++++++++++++++++-----
> 6 files changed, 81 insertions(+), 17 deletions(-)
>
> diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h
> index c77e24c0d8b6..c40d72e4a957 100644
> --- a/include/linux/resctrl.h
> +++ b/include/linux/resctrl.h
> @@ -611,11 +611,17 @@ 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 hook called at beginning of each file system mount attempt.
> + * Serialized against other mount and unmount attempts.
> */
> void resctrl_arch_pre_mount(void);
>
> +/*
> + * Architecture hook called when mount fails, or on unmount.
> + * Serialized against other mount and unmount attempts.
> + */
> +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 8406addc05f5..c66954bc01e7 100644
> --- a/arch/x86/kernel/cpu/resctrl/internal.h
> +++ b/arch/x86/kernel/cpu/resctrl/internal.h
> @@ -234,15 +234,15 @@ 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
> -void __exit intel_aet_exit(void);
> bool intel_aet_pre_mount(void);
> +void intel_aet_unmount(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 void __exit intel_aet_exit(void) { }
> static inline bool intel_aet_pre_mount(void) { return false; }
> +static inline void intel_aet_unmount(void) { }
> static inline int intel_aet_read_event(int domid, u32 rmid, void *arch_priv, u64 *val)
> {
> return -EINVAL;
> diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c
> index ac67b4523b2d..40466f29e48e 100644
> --- a/arch/x86/kernel/cpu/resctrl/core.c
> +++ b/arch/x86/kernel/cpu/resctrl/core.c
> @@ -811,6 +811,25 @@ void resctrl_arch_pre_mount(void)
> cpus_read_unlock();
> }
>
> +void resctrl_arch_unmount(void)
> +{
> + struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_PERF_PKG].r_resctrl;
> + int cpu;
> +
> + if (!r->mon_capable)
> + return;
> +
> + intel_aet_unmount();
> +
> + cpus_read_lock();
> + mutex_lock(&domain_list_lock);
> + for_each_online_cpu(cpu)
> + domain_remove_cpu_mon(cpu, r);
> + r->mon_capable = false;
> + mutex_unlock(&domain_list_lock);
> + cpus_read_unlock();
> +}
> +
> enum {
> RDT_FLAG_CMT,
> RDT_FLAG_MBM_TOTAL,
> @@ -1161,8 +1180,6 @@ late_initcall(resctrl_arch_late_init);
>
> static void __exit resctrl_arch_exit(void)
> {
> - intel_aet_exit();
> -
> cpuhp_remove_state(rdt_online);
>
> resctrl_exit();
> diff --git a/arch/x86/kernel/cpu/resctrl/intel_aet.c b/arch/x86/kernel/cpu/resctrl/intel_aet.c
> index d79c459f4c54..e7cd7d8a80cd 100644
> --- a/arch/x86/kernel/cpu/resctrl/intel_aet.c
> +++ b/arch/x86/kernel/cpu/resctrl/intel_aet.c
> @@ -297,7 +297,7 @@ static enum pmt_feature_id lookup_pfid(const char *pfname)
>
> /*
> * Serialises AET's view of pmt_telemetry:
> - * - pmt_module, get_feature, put_feature
> + * - pmt_module, get_feature, put_feature, pmt_in_use
> * - every event_group's ->pfg
> *
> * Lock ordering with pmt/telemetry.c's ep_lock is ep_lock -> aet_lock.
> @@ -311,6 +311,11 @@ static struct module *pmt_module;
> static struct pmt_feature_group *(*get_feature)(enum pmt_feature_id id);
> static void (*put_feature)(struct pmt_feature_group *p);
>
> +/*
> + * Track whether pmt_telemetry enumeration succeeded during mount for use during unmount.
> + */
> +static bool pmt_in_use;
> +
> /*
> * Request a copy of struct pmt_feature_group for each event group. If there is
> * one, the returned structure has an array of telemetry_region structures,
> @@ -395,19 +400,33 @@ bool intel_aet_pre_mount(void)
> return false;
> }
>
> + pmt_in_use = true;
> +
> return true;
> }
>
> -void __exit intel_aet_exit(void)
> +void intel_aet_unmount(void)
> {
> + struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_PERF_PKG].r_resctrl;
> struct event_group **peg;
>
> + guard(mutex)(&aet_lock);
> + if (!pmt_in_use)
> + return;
> +
> for_each_event_group(peg) {
> - if ((*peg)->pfg) {
> - put_feature((*peg)->pfg);
> - (*peg)->pfg = NULL;
> + struct event_group *e = *peg;
> +
> + if (e->pfg) {
> + for (int i = 0; i < e->num_events; i++)
> + resctrl_disable_mon_event(e->evts[i].id);
> + put_feature(e->pfg);
> + e->pfg = NULL;
> }
> }
> + module_put(pmt_module);
> + pmt_in_use = false;
> + r->mon.num_rmid = 0;
> }
>
> #define DATA_VALID BIT_ULL(63)
> diff --git a/drivers/resctrl/mpam_resctrl.c b/drivers/resctrl/mpam_resctrl.c
> index 360a50eb0cd3..ecea2239afa4 100644
> --- a/drivers/resctrl/mpam_resctrl.c
> +++ b/drivers/resctrl/mpam_resctrl.c
> @@ -121,6 +121,10 @@ void resctrl_arch_pre_mount(void)
> {
> }
>
> +void resctrl_arch_unmount(void)
> +{
> +}
> +
> bool resctrl_arch_get_cdp_enabled(enum resctrl_res_level rid)
> {
> return mpam_resctrl_controls[rid].cdp_enabled;
> diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c
> index ecdb5da50179..20e579067570 100644
> --- a/fs/resctrl/rdtgroup.c
> +++ b/fs/resctrl/rdtgroup.c
> @@ -30,6 +30,9 @@
>
> #include "internal.h"
>
> +/* Mutex protecting resctrl_mounted and mount/unmount operations */
> +static DEFINE_MUTEX(resctrl_mount_lock);
> +
> /* Mutex to protect rdtgroup access. */
> DEFINE_MUTEX(rdtgroup_mutex);
>
> @@ -48,7 +51,10 @@ LIST_HEAD(resctrl_schema_all);
> */
> static LIST_HEAD(mon_data_kn_priv_list);
>
> -/* The filesystem can only be mounted once. */
> +/*
> + * The filesystem can only be mounted once. Can only be updated
> + * while holding both resctrl_mount_lock and rdtgroup_mutex.
> + */
> bool resctrl_mounted;
>
> /* Kernel fs node for "info" directory under root */
> @@ -3147,6 +3153,7 @@ static void resctrl_unmount(void)
> {
> struct rdt_resource *r;
>
> + mutex_lock(&resctrl_mount_lock);
> cpus_read_lock();
> mutex_lock(&rdtgroup_mutex);
>
> @@ -3164,6 +3171,8 @@ static void resctrl_unmount(void)
> resctrl_mounted = false;
> mutex_unlock(&rdtgroup_mutex);
> cpus_read_unlock();
> + resctrl_arch_unmount();
> + mutex_unlock(&resctrl_mount_lock);
> }
>
> static int rdt_get_tree(struct fs_context *fc)
> @@ -3175,24 +3184,27 @@ static int rdt_get_tree(struct fs_context *fc)
> struct rdt_resource *r;
> int ret;
>
> - DO_ONCE_SLEEPABLE(resctrl_arch_pre_mount);
> + mutex_lock(&resctrl_mount_lock);
>
> - cpus_read_lock();
> - mutex_lock(&rdtgroup_mutex);
> /*
> * resctrl file system can only be mounted once.
> */
> if (resctrl_mounted) {
> ret = -EBUSY;
> - goto out;
> + goto out_mount_unlock;
> }
>
> /* Avoid races from pending operations from a previous mount */
> if (atomic_read(&rdtgroup_default.waitcount) != 0) {
> ret = -EBUSY;
> - goto out;
> + goto out_mount_unlock;
> }
>
> + resctrl_arch_pre_mount();
I dont completely understand this.
After this function call, e->force_off can be permanently modified,
whereas previously it was only altered by the boot options. Is this
behavior expected?
Thanks
Babu
next prev parent reply other threads:[~2026-10-07 19:55 UTC|newest]
Thread overview: 37+ 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-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-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-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
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 [this message]
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=4aa18085-49b6-48e5-83dc-33d87a60a99d@amd.com \
--to=babu.moger@amd.com \
--cc=Dave.Martin@arm.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=tony.luck@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 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®