All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tony Luck <tony.luck@intel.com>
To: 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>,
	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
Cc: Christoph Hellwig <hch@infradead.org>,
	linux-kernel@vger.kernel.org, patches@lists.linux.dev,
	Tony Luck <tony.luck@intel.com>
Subject: [PATCH v12 19/25] arm,x86,fs/resctrl: Enumerate AET on every resctrl mount
Date: Wed, 16 Sep 2026 16:13:14 -0700	[thread overview]
Message-ID: <20260916231320.14502-20-tony.luck@intel.com> (raw)
In-Reply-To: <20260916231320.14502-1-tony.luck@intel.com>

Call resctrl_arch_pre_mount() for every mount protected by
resctrl_mount_lock. Add matching resctrl_arch_unmount() path for
architecture code to clean up on mount failure or unmount.

Remove intel_aet_exit() after moving all the cleanup code into
intel_aet_unmount().

Signed-off-by: Tony Luck <tony.luck@intel.com>
---
v12:
	Rest of old patch 17 merged into patch 18 so the umount
	code path is complete.
	Fix rdt_get_tree() return value when kernfs_get_tree() fails.
	Move resctrl_arch_unmount() after cpus_read_unlock() in out: error path
	Update resctrl_arch_pre_mount() header comment to say it is now
	called for each mount, not just the first.
	Update comment for resctrl_mounted to say that both resctrl_mount_lock
	and rdtgroup_mutex must be help to change state.
---
 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                   | 31 ++++++++++++++++++++-----
 6 files changed, 82 insertions(+), 17 deletions(-)

diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h
index 604ab7af7c2b..5a975856f670 100644
--- a/include/linux/resctrl.h
+++ b/include/linux/resctrl.h
@@ -590,11 +590,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.
+ * Called while holding resctrl_mount_lock.
  */
 void resctrl_arch_pre_mount(void);
 
+/*
+ * Architecture hook called when mount fails, or on unmount.
+ * Called while holding resctrl_mount_lock.
+ */
+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 fc60b0af250d..5e71dd758624 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 2fa4ebf7159a..3bf4d1a07593 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,
@@ -1159,8 +1178,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 32f3f30894a4..8aa2e18a6bbb 100644
--- a/arch/x86/kernel/cpu/resctrl/intel_aet.c
+++ b/arch/x86/kernel/cpu/resctrl/intel_aet.c
@@ -298,7 +298,7 @@ static enum pmt_feature_id lookup_pfid(const char *pfname)
 /*
  * Protects pmt_module, get_feature, put_feature against races between module
  * load/unload of the pmt_telemetry module and mount/unmount of the resctrl
- * file system.
+ * file system. Also protects pmt_in_use.
  */
 static DEFINE_MUTEX(aet_register_lock);
 
@@ -306,6 +306,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,
@@ -375,19 +380,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_register_lock);
+	if (!pmt_in_use)
+		return;
+
 	for_each_event_group(peg) {
-		if ((*peg)->pfg) {
-			intel_pmt_put_feature_group((*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 69c9e02d2f40..f42f98f89c38 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 2e9f71901f68..07fefa3c434e 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 */
@@ -3149,6 +3155,7 @@ static void resctrl_unmount(void)
 {
 	struct rdt_resource *r;
 
+	mutex_lock(&resctrl_mount_lock);
 	cpus_read_lock();
 	mutex_lock(&rdtgroup_mutex);
 
@@ -3166,6 +3173,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)
@@ -3177,24 +3186,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();
+
+	cpus_read_lock();
+	mutex_lock(&rdtgroup_mutex);
+
 	if (!resctrl_alloc_capable() && !resctrl_mon_capable()) {
 		ret = invalfc(fc, "No allocation or monitoring features are available or enabled");
 		goto out;
@@ -3289,6 +3301,8 @@ static int rdt_get_tree(struct fs_context *fc)
 	mutex_unlock(&rdtgroup_mutex);
 	cpus_read_unlock();
 
+	mutex_unlock(&resctrl_mount_lock);
+
 	ret = kernfs_get_tree(fc);
 	/*
 	 * resctrl can only be mounted once, new superblock only expected
@@ -3297,6 +3311,7 @@ static int rdt_get_tree(struct fs_context *fc)
 	if (!ctx->kfc.new_sb_created)
 		resctrl_unmount();
 	kernfs_put(rdt_root_kn);
+
 	return ret;
 
 out_mondata:
@@ -3320,6 +3335,10 @@ static int rdt_get_tree(struct fs_context *fc)
 out:
 	mutex_unlock(&rdtgroup_mutex);
 	cpus_read_unlock();
+	resctrl_arch_unmount();
+out_mount_unlock:
+	mutex_unlock(&resctrl_mount_lock);
+
 	return ret;
 }
 
-- 
2.55.0


  parent reply	other threads:[~2026-09-16 23:13 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-16 23:12 [PATCH v12 00/25] Allow AET to use PMT as loadable module Tony Luck
2026-09-16 23:12 ` [PATCH v12 01/25] x86/cpufeatures: Add missing CQM feature dependency Tony Luck
2026-09-24 15:12   ` Reinette Chatre
2026-09-16 23:12 ` [PATCH v12 02/25] x86/resctrl: Check if monitoring features are supported Tony Luck
2026-09-24 15:13   ` Reinette Chatre
2026-09-16 23:12 ` [PATCH v12 03/25] x86/resctrl: Enumerate monitor features in rdt_get_l3_mon_config() Tony Luck
2026-09-24 15:15   ` Reinette Chatre
2026-09-16 23:12 ` [PATCH v12 04/25] x86/resctrl: Apply Intel MBM quirk from rdt_get_l3_mon_config() Tony Luck
2026-09-21 17:45   ` Babu Moger
2026-09-22 20:46     ` Luck, Tony
2026-09-24 15:23       ` Reinette Chatre
2026-09-24 15:17   ` Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 05/25] x86/resctrl: Delete resctrl_cpu_detect() Tony Luck
2026-09-24 15:21   ` Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 06/25] arm,x86,fs/resctrl: Replace architecture resctrl_arch_{alloc,mon}_capable() Tony Luck
2026-09-24 15:22   ` Reinette Chatre
2026-09-25 22:14     ` Luck, Tony
2026-09-26  0:11       ` Reinette Chatre
2026-09-28 17:40         ` Luck, Tony
2026-09-16 23:13 ` [PATCH v12 07/25] x86/resctrl: Update special case for Intel Haswell enumeration Tony Luck
2026-09-24 15:27   ` Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 08/25] x86/resctrl: Delete rdt_alloc_capable and rdt_mon_capable Tony Luck
2026-09-24 15:28   ` Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 09/25] fs/resctrl: Remove redundant calls to resctrl_{alloc,mon}_capable() Tony Luck
2026-09-21 17:45   ` Babu Moger
2026-09-22 20:33     ` Luck, Tony
2026-09-24 15:30   ` Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 10/25] x86/resctrl: Honor rdt=perf option to force enable AET perf events Tony Luck
2026-09-24 15:29   ` Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 11/25] fs/resctrl: Add interface to disable a monitor event Tony Luck
2026-09-24 15:31   ` Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 12/25] arm,x86,fs/resctrl: Allocate maximum needed rmid_ptrs[] Tony Luck
2026-09-21 17:45   ` Babu Moger
2026-09-22  0:30     ` Reinette Chatre
2026-09-22 13:09       ` Babu Moger
2026-09-24 15:37   ` Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 13/25] arm,x86,fs/resctrl: Allocate right size for L3 monitor arrays Tony Luck
2026-09-24 20:30   ` Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 14/25] fs/resctrl: Rebuild free RMID list on each mount Tony Luck
2026-09-21 17:45   ` Babu Moger
2026-09-22 20:30     ` Luck, Tony
2026-09-22 22:58       ` Moger, Babu
2026-09-22 23:07         ` Luck, Tony
2026-09-23 13:21           ` Moger, Babu
2026-09-16 23:13 ` [PATCH v12 15/25] x86,fs/resctrl: Handle systems where AET is the only resource Tony Luck
2026-09-24 20:41   ` Reinette Chatre
2026-09-25  0:06     ` Luck, Tony
2026-09-25 14:37       ` Reinette Chatre
2026-09-25 15:50         ` Luck, Tony
2026-09-25 16:39           ` Reinette Chatre
2026-09-25 18:02             ` Luck, Tony
2026-09-16 23:13 ` [PATCH v12 16/25] x86/resctrl: Add PMT registration API for AET enumeration callbacks Tony Luck
2026-09-24 20:43   ` Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 17/25] platform/x86/intel/pmt: Register enumeration functions with resctrl Tony Luck
2026-09-24 20:46   ` Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 18/25] x86/resctrl: Use registered function pointers for AET enumeration Tony Luck
2026-09-24 20:49   ` Reinette Chatre
2026-09-16 23:13 ` Tony Luck [this message]
2026-09-24 20:53   ` [PATCH v12 19/25] arm,x86,fs/resctrl: Enumerate AET on every resctrl mount Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 20/25] x86/resctrl: Enforce system RMID limit on AET Tony Luck
2026-09-24 20:55   ` Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 21/25] x86/resctrl: Export interface to report telemetry unbind/remove Tony Luck
2026-09-16 23:13 ` [PATCH v12 22/25] platform/x86/intel/pmt: Inform resctrl when MMIO maps are being removed Tony Luck
2026-09-18 16:29   ` [PATCH 12 22/25 UPDATED] " Tony Luck
2026-09-24 20:55     ` Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 23/25] x86/resctrl: Require 64-bit x86 for resctrl support Tony Luck
2026-09-24 20:57   ` Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 24/25] x86/resctrl: Simplify Kconfig options for resctrl Tony Luck
2026-09-24 20:59   ` Reinette Chatre
2026-09-16 23:13 ` [PATCH v12 25/25] x86,fs/resctrl: Document telemetry mount timing caveat Tony Luck
2026-09-24 21:00   ` Reinette Chatre
2026-09-17 16:32 ` [PATCH v12 00/25] Allow AET to use PMT as loadable module Luck, Tony
2026-09-17 21:23   ` 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=20260916231320.14502-20-tony.luck@intel.com \
    --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.