From: Babu Moger <babu.moger@amd.com>
To: <corbet@lwn.net>, <tony.luck@intel.com>,
<reinette.chatre@intel.com>, <james.morse@arm.com>,
<tglx@linutronix.de>, <mingo@redhat.com>, <bp@alien8.de>,
<dave.hansen@linux.intel.com>
Cc: <Dave.Martin@arm.com>, <x86@kernel.org>, <hpa@zytor.com>,
<akpm@linux-foundation.org>, <paulmck@kernel.org>,
<rostedt@goodmis.org>, <Neeraj.Upadhyay@amd.com>,
<david@redhat.com>, <arnd@arndb.de>, <fvdl@google.com>,
<seanjc@google.com>, <jpoimboe@kernel.org>,
<pawan.kumar.gupta@linux.intel.com>, <xin@zytor.com>,
<manali.shukla@amd.com>, <babu.moger@amd.com>,
<tao1.su@linux.intel.com>, <sohil.mehta@intel.com>,
<kai.huang@intel.com>, <xiaoyao.li@intel.com>,
<peterz@infradead.org>, <xin3.li@intel.com>,
<kan.liang@linux.intel.com>, <mario.limonciello@amd.com>,
<thomas.lendacky@amd.com>, <perry.yuan@amd.com>,
<gautham.shenoy@amd.com>, <chang.seok.bae@intel.com>,
<linux-doc@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<peternewman@google.com>, <eranian@google.com>
Subject: [PATCH v16 28/34] fs/resctrl: Auto assign counters on mkdir and clean up on group removal
Date: Fri, 25 Jul 2025 13:29:47 -0500 [thread overview]
Message-ID: <df758bfeb3f8a3e975891029b3a0ca90da3744f0.1753467772.git.babu.moger@amd.com> (raw)
In-Reply-To: <cover.1753467772.git.babu.moger@amd.com>
Resctrl provides a user-configurable option mbm_assign_on_mkdir that
determines if a counter will automatically be assigned to an RMID, event
pair when its associated monitor group is created via mkdir.
Enable mbm_assign_on_mkdir by default to automatically assign counters to
the two default events (MBM total and MBM local) of a new monitoring group
created via mkdir. This maintains backward compatibility with original
resctrl support for these two events.
Unassign and free counters belonging to a monitoring group when the group
is deleted.
Monitor group creation does not fail if a counter cannot be assigned to one
or both events. There may be limited counters and users have the
flexibility to modify counter assignments at a later time. Log the error
message "Failed to allocate counter for <event> in domain <id>" in
/sys/fs/resctrl/info/last_cmd_status when a new monitoring group is created
but counter assignment failed.
Signed-off-by: Babu Moger <babu.moger@amd.com>
---
v16: Updated the changelog. Thanks to Reinette.
Moved r->mon.mbm_assign_on_mkdir initialization to resctrl_mon_resource_init().
Minor code comment update.
Updated the Subject line to fs/resctrl:
v15: Updated the subject line.
Updated changelog to add unassign part.
Fixed the check in rdtgroup_assign_cntrs() to call assign correctly.
Renamed resctrl_assign_cntr_event() -> rdtgroup_assign_cntr_event()
resctrl_unassign_cntr_event() -> rdtgroup_unassign_cntr_event().
v14: Updated the changelog with changed name mbm_event.
Update code comments with changed name mbm_event.
Changed the code to reflect Tony's struct mon_evt changes.
v13: Changes due to calling of resctrl_assign_cntr_event() and resctrl_unassign_cntr_event().
It only takes evtid. evt_cfg is not required anymore.
Resolved conflicts caused by the recent FS/ARCH code restructure.
The monitor.c/rdtgroup.c files have been split between the FS and ARCH directories.
v12: Removed mbm_cntr_reset() as it is not required while removing the group.
Update the commit text.
Added r->mon_capable check in rdtgroup_assign_cntrs() and rdtgroup_unassign_cntrs.
v11: Moved mbm_cntr_reset() to monitor.c.
Added code reset non-architectural state in mbm_cntr_reset().
Added missing rdtgroup_unassign_cntrs() calls on failure path.
v10: Assigned the counter before exposing the event files.
Moved the call rdtgroup_assign_cntrs() inside mkdir_rdt_prepare_rmid_alloc().
This is called both CNTR_MON and MON group creation.
Call mbm_cntr_reset() when unmounted to clear all the assignments.
Taken care of few other feedback comments.
v9: Changed rdtgroup_assign_cntrs() and rdtgroup_unassign_cntrs() to return void.
Updated couple of rdtgroup_unassign_cntrs() calls properly.
Updated function comments.
v8: Renamed rdtgroup_assign_grp to rdtgroup_assign_cntrs.
Renamed rdtgroup_unassign_grp to rdtgroup_unassign_cntrs.
Fixed the problem with unassigning the child MON groups of CTRL_MON group.
v7: Reworded the commit message.
Removed the reference of ABMC with mbm_cntr_assign.
Renamed the function rdtgroup_assign_cntrs to rdtgroup_assign_grp.
v6: Removed the redundant comments on all the calls of
rdtgroup_assign_cntrs. Updated the commit message.
Dropped printing error message on every call of rdtgroup_assign_cntrs.
v5: Removed the code to enable/disable ABMC during the mount.
That will be another patch.
Added arch callers to get the arch specific data.
Renamed fuctions to match the other abmc function.
Added code comments for assignment failures.
v4: Few name changes based on the upstream discussion.
Commit message update.
v3: This is a new patch. Patch addresses the upstream comment to enable
ABMC feature by default if the feature is available.
---
fs/resctrl/monitor.c | 1 +
fs/resctrl/rdtgroup.c | 70 +++++++++++++++++++++++++++++++++++++++++--
2 files changed, 69 insertions(+), 2 deletions(-)
diff --git a/fs/resctrl/monitor.c b/fs/resctrl/monitor.c
index 6205bbfe08fb..5cf1b79c17f5 100644
--- a/fs/resctrl/monitor.c
+++ b/fs/resctrl/monitor.c
@@ -1072,6 +1072,7 @@ int resctrl_mon_resource_init(void)
mon_event_all[QOS_L3_MBM_LOCAL_EVENT_ID].evt_cfg = READS_TO_LOCAL_MEM |
READS_TO_LOCAL_S_MEM |
NON_TEMP_WRITE_TO_LOCAL_MEM;
+ r->mon.mbm_assign_on_mkdir = true;
resctrl_file_fflags_init("num_mbm_cntrs",
RFTYPE_MON_INFO | RFTYPE_RES_CACHE);
resctrl_file_fflags_init("available_mbm_cntrs",
diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c
index bf04235d2603..d087ba990cd3 100644
--- a/fs/resctrl/rdtgroup.c
+++ b/fs/resctrl/rdtgroup.c
@@ -2792,6 +2792,54 @@ static void schemata_list_destroy(void)
}
}
+/*
+ * rdtgroup_assign_cntrs() - Assign counters to MBM events. Called when
+ * a new group is created.
+ * If "mbm_event" counter assignment mode is enabled, counters should be
+ * automatically assigned if the "mbm_assign_on_mkdir" is set.
+ * Each group can accommodate two counters per domain: one for the total
+ * event and one for the local event. Assignments may fail due to the limited
+ * number of counters. However, it is not necessary to fail the group creation
+ * and thus no failure is returned. Users have the option to modify the
+ * counter assignments after the group has been created.
+ */
+static void rdtgroup_assign_cntrs(struct rdtgroup *rdtgrp)
+{
+ struct rdt_resource *r = resctrl_arch_get_resource(RDT_RESOURCE_L3);
+
+ if (!r->mon_capable || !resctrl_arch_mbm_cntr_assign_enabled(r) ||
+ !r->mon.mbm_assign_on_mkdir)
+ return;
+
+ if (resctrl_is_mon_event_enabled(QOS_L3_MBM_TOTAL_EVENT_ID))
+ rdtgroup_assign_cntr_event(NULL, rdtgrp,
+ &mon_event_all[QOS_L3_MBM_TOTAL_EVENT_ID]);
+
+ if (resctrl_is_mon_event_enabled(QOS_L3_MBM_LOCAL_EVENT_ID))
+ rdtgroup_assign_cntr_event(NULL, rdtgrp,
+ &mon_event_all[QOS_L3_MBM_LOCAL_EVENT_ID]);
+}
+
+/*
+ * rdtgroup_unassign_cntrs() - Unassign the counters associated with MBM events.
+ * Called when a group is deleted.
+ */
+static void rdtgroup_unassign_cntrs(struct rdtgroup *rdtgrp)
+{
+ struct rdt_resource *r = resctrl_arch_get_resource(RDT_RESOURCE_L3);
+
+ if (!r->mon_capable || !resctrl_arch_mbm_cntr_assign_enabled(r))
+ return;
+
+ if (resctrl_is_mon_event_enabled(QOS_L3_MBM_TOTAL_EVENT_ID))
+ rdtgroup_unassign_cntr_event(NULL, rdtgrp,
+ &mon_event_all[QOS_L3_MBM_TOTAL_EVENT_ID]);
+
+ if (resctrl_is_mon_event_enabled(QOS_L3_MBM_LOCAL_EVENT_ID))
+ rdtgroup_unassign_cntr_event(NULL, rdtgrp,
+ &mon_event_all[QOS_L3_MBM_LOCAL_EVENT_ID]);
+}
+
static int rdt_get_tree(struct fs_context *fc)
{
struct rdt_fs_context *ctx = rdt_fc2context(fc);
@@ -2848,6 +2896,8 @@ static int rdt_get_tree(struct fs_context *fc)
if (ret < 0)
goto out_info;
+ rdtgroup_assign_cntrs(&rdtgroup_default);
+
ret = mkdir_mondata_all(rdtgroup_default.kn,
&rdtgroup_default, &kn_mondata);
if (ret < 0)
@@ -2886,8 +2936,10 @@ static int rdt_get_tree(struct fs_context *fc)
if (resctrl_arch_mon_capable())
kernfs_remove(kn_mondata);
out_mongrp:
- if (resctrl_arch_mon_capable())
+ if (resctrl_arch_mon_capable()) {
+ rdtgroup_unassign_cntrs(&rdtgroup_default);
kernfs_remove(kn_mongrp);
+ }
out_info:
kernfs_remove(kn_info);
out_closid_exit:
@@ -3033,6 +3085,7 @@ static void free_all_child_rdtgrp(struct rdtgroup *rdtgrp)
head = &rdtgrp->mon.crdtgrp_list;
list_for_each_entry_safe(sentry, stmp, head, mon.crdtgrp_list) {
+ rdtgroup_unassign_cntrs(sentry);
free_rmid(sentry->closid, sentry->mon.rmid);
list_del(&sentry->mon.crdtgrp_list);
@@ -3073,6 +3126,8 @@ static void rmdir_all_sub(void)
cpumask_or(&rdtgroup_default.cpu_mask,
&rdtgroup_default.cpu_mask, &rdtgrp->cpu_mask);
+ rdtgroup_unassign_cntrs(rdtgrp);
+
free_rmid(rdtgrp->closid, rdtgrp->mon.rmid);
kernfs_remove(rdtgrp->kn);
@@ -3157,6 +3212,7 @@ static void resctrl_fs_teardown(void)
return;
rmdir_all_sub();
+ rdtgroup_unassign_cntrs(&rdtgroup_default);
mon_put_kn_priv();
rdt_pseudo_lock_release();
rdtgroup_default.mode = RDT_MODE_SHAREABLE;
@@ -3637,9 +3693,12 @@ static int mkdir_rdt_prepare_rmid_alloc(struct rdtgroup *rdtgrp)
}
rdtgrp->mon.rmid = ret;
+ rdtgroup_assign_cntrs(rdtgrp);
+
ret = mkdir_mondata_all(rdtgrp->kn, rdtgrp, &rdtgrp->mon.mon_data_kn);
if (ret) {
rdt_last_cmd_puts("kernfs subdir error\n");
+ rdtgroup_unassign_cntrs(rdtgrp);
free_rmid(rdtgrp->closid, rdtgrp->mon.rmid);
return ret;
}
@@ -3649,8 +3708,10 @@ static int mkdir_rdt_prepare_rmid_alloc(struct rdtgroup *rdtgrp)
static void mkdir_rdt_prepare_rmid_free(struct rdtgroup *rgrp)
{
- if (resctrl_arch_mon_capable())
+ if (resctrl_arch_mon_capable()) {
+ rdtgroup_unassign_cntrs(rgrp);
free_rmid(rgrp->closid, rgrp->mon.rmid);
+ }
}
/*
@@ -3926,6 +3987,9 @@ static int rdtgroup_rmdir_mon(struct rdtgroup *rdtgrp, cpumask_var_t tmpmask)
update_closid_rmid(tmpmask, NULL);
rdtgrp->flags = RDT_DELETED;
+
+ rdtgroup_unassign_cntrs(rdtgrp);
+
free_rmid(rdtgrp->closid, rdtgrp->mon.rmid);
/*
@@ -3973,6 +4037,8 @@ static int rdtgroup_rmdir_ctrl(struct rdtgroup *rdtgrp, cpumask_var_t tmpmask)
cpumask_or(tmpmask, tmpmask, &rdtgrp->cpu_mask);
update_closid_rmid(tmpmask, NULL);
+ rdtgroup_unassign_cntrs(rdtgrp);
+
free_rmid(rdtgrp->closid, rdtgrp->mon.rmid);
closid_free(rdtgrp->closid);
--
2.34.1
next prev parent reply other threads:[~2025-07-25 18:35 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-25 18:29 [PATCH v16 00/34] x86,fs/resctrl: Support AMD Assignable Bandwidth Monitoring Counters (ABMC) Babu Moger
2025-07-25 18:29 ` [PATCH v16 01/34] x86,fs/resctrl: Consolidate monitor event descriptions Babu Moger
2025-07-30 19:47 ` Reinette Chatre
2025-07-30 20:23 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 02/34] x86,fs/resctrl: Replace architecture event enabled checks Babu Moger
2025-07-25 18:29 ` [PATCH v16 03/34] x86/resctrl: Remove 'rdt_mon_features' global variable Babu Moger
2025-07-25 18:29 ` [PATCH v16 04/34] x86,fs/resctrl: Prepare for more monitor events Babu Moger
2025-07-25 18:29 ` [PATCH v16 05/34] x86/cpufeatures: Add support for Assignable Bandwidth Monitoring Counters (ABMC) Babu Moger
2025-07-30 19:47 ` Reinette Chatre
2025-07-25 18:29 ` [PATCH v16 06/34] x86/resctrl: Add ABMC feature in the command line options Babu Moger
2025-07-25 18:29 ` [PATCH v16 07/34] x86,fs/resctrl: Consolidate monitoring related data from rdt_resource Babu Moger
2025-07-25 18:29 ` [PATCH v16 08/34] x86,fs/resctrl: Detect Assignable Bandwidth Monitoring feature details Babu Moger
2025-07-30 19:49 ` Reinette Chatre
2025-08-06 21:04 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 09/34] x86/resctrl: Add support to enable/disable AMD ABMC feature Babu Moger
2025-07-25 18:29 ` [PATCH v16 10/34] fs/resctrl: Introduce the interface to display monitoring modes Babu Moger
2025-08-06 21:02 ` Moger, Babu
2025-08-06 21:30 ` Reinette Chatre
2025-07-25 18:29 ` [PATCH v16 11/34] fs/resctrl: Add resctrl file to display number of assignable counters Babu Moger
2025-08-06 21:12 ` Moger, Babu
2025-08-06 21:31 ` Reinette Chatre
2025-07-25 18:29 ` [PATCH v16 12/34] fs/resctrl: Introduce mbm_cntr_cfg to track assignable counters per domain Babu Moger
2025-07-25 18:29 ` [PATCH v16 13/34] fs/resctrl: Introduce interface to display number of free MBM counters Babu Moger
2025-08-06 21:19 ` Moger, Babu
2025-08-06 21:31 ` Reinette Chatre
2025-08-06 22:04 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 14/34] x86/resctrl: Add data structures and definitions for ABMC assignment Babu Moger
2025-07-25 18:29 ` [PATCH v16 15/34] fs/resctrl: Introduce event configuration field in struct mon_evt Babu Moger
2025-07-25 18:29 ` [PATCH v16 16/34] x86,fs/resctrl: Implement resctrl_arch_config_cntr() to assign a counter with ABMC Babu Moger
2025-07-30 19:50 ` Reinette Chatre
2025-07-25 18:29 ` [PATCH v16 17/34] fs/resctrl: Add the functionality to assign MBM events Babu Moger
2025-07-30 19:52 ` Reinette Chatre
2025-08-07 18:29 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 18/34] fs/resctrl: Add the functionality to unassign " Babu Moger
2025-07-30 19:53 ` Reinette Chatre
2025-08-07 18:33 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 19/34] fs/resctrl: Pass struct rdtgroup instead of individual members Babu Moger
2025-07-30 19:54 ` Reinette Chatre
2025-07-25 18:29 ` [PATCH v16 20/34] fs/resctrl: Introduce counter ID read, reset calls in mbm_event mode Babu Moger
2025-07-30 19:59 ` Reinette Chatre
2025-08-07 19:59 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 21/34] x86/resctrl: Refactor resctrl_arch_rmid_read() Babu Moger
2025-07-30 19:59 ` Reinette Chatre
2025-07-25 18:29 ` [PATCH v16 22/34] x86/resctrl: Implement resctrl_arch_reset_cntr() and resctrl_arch_cntr_read() Babu Moger
2025-07-30 20:01 ` Reinette Chatre
2025-08-08 2:05 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 23/34] fs/resctrl: Support counter read/reset with mbm_event assignment mode Babu Moger
2025-07-30 20:03 ` Reinette Chatre
2025-08-08 2:20 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 24/34] fs/resctrl: Add definitions for MBM event configuration Babu Moger
2025-07-30 20:03 ` Reinette Chatre
2025-08-08 2:24 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 25/34] fs/resctrl: Add event configuration directory under info/L3_MON/ Babu Moger
2025-07-30 20:04 ` Reinette Chatre
2025-08-08 13:56 ` Moger, Babu
2025-08-08 15:12 ` Reinette Chatre
2025-08-08 17:47 ` Moger, Babu
2025-08-08 18:23 ` Reinette Chatre
2025-08-08 18:48 ` Moger, Babu
2025-08-08 20:26 ` Reinette Chatre
2025-07-25 18:29 ` [PATCH v16 26/34] fs/resctrl: Provide interface to update the event configurations Babu Moger
2025-07-30 20:05 ` Reinette Chatre
2025-08-08 18:27 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 27/34] fs/resctrl: Introduce mbm_assign_on_mkdir to enable assignments on mkdir Babu Moger
2025-07-30 20:08 ` Reinette Chatre
2025-08-08 20:29 ` Moger, Babu
2025-08-08 21:00 ` Reinette Chatre
2025-08-08 21:10 ` Moger, Babu
2025-07-25 18:29 ` Babu Moger [this message]
2025-07-30 20:08 ` [PATCH v16 28/34] fs/resctrl: Auto assign counters on mkdir and clean up on group removal Reinette Chatre
2025-08-11 23:39 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 29/34] fs/resctrl: Introduce mbm_L3_assignments to list assignments in a group Babu Moger
2025-07-30 20:09 ` Reinette Chatre
2025-08-11 23:42 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 30/34] fs/resctrl: Introduce the interface to modify " Babu Moger
2025-07-30 20:10 ` Reinette Chatre
2025-08-11 23:51 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 31/34] fs/resctrl: Disable BMEC event configuration when mbm_event mode is enabled Babu Moger
2025-07-30 20:11 ` Reinette Chatre
2025-08-12 19:16 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 32/34] fs/resctrl: Introduce the interface to switch between monitor modes Babu Moger
2025-07-30 20:11 ` Reinette Chatre
2025-08-12 19:18 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 33/34] x86/resctrl: Configure mbm_event mode if supported Babu Moger
2025-07-30 20:11 ` Reinette Chatre
2025-08-12 19:21 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 34/34] MAINTAINERS: resctrl: add myself as reviewer Babu Moger
2025-07-30 20:14 ` Reinette Chatre
2025-08-12 19:23 ` Moger, Babu
2025-07-30 19:47 ` [PATCH v16 00/34] x86,fs/resctrl: Support AMD Assignable Bandwidth Monitoring Counters (ABMC) Reinette Chatre
2025-07-30 23:31 ` Moger, Babu
2025-07-30 23:57 ` Reinette Chatre
2025-07-31 14:17 ` Moger, Babu
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=df758bfeb3f8a3e975891029b3a0ca90da3744f0.1753467772.git.babu.moger@amd.com \
--to=babu.moger@amd.com \
--cc=Dave.Martin@arm.com \
--cc=Neeraj.Upadhyay@amd.com \
--cc=akpm@linux-foundation.org \
--cc=arnd@arndb.de \
--cc=bp@alien8.de \
--cc=chang.seok.bae@intel.com \
--cc=corbet@lwn.net \
--cc=dave.hansen@linux.intel.com \
--cc=david@redhat.com \
--cc=eranian@google.com \
--cc=fvdl@google.com \
--cc=gautham.shenoy@amd.com \
--cc=hpa@zytor.com \
--cc=james.morse@arm.com \
--cc=jpoimboe@kernel.org \
--cc=kai.huang@intel.com \
--cc=kan.liang@linux.intel.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=manali.shukla@amd.com \
--cc=mario.limonciello@amd.com \
--cc=mingo@redhat.com \
--cc=paulmck@kernel.org \
--cc=pawan.kumar.gupta@linux.intel.com \
--cc=perry.yuan@amd.com \
--cc=peternewman@google.com \
--cc=peterz@infradead.org \
--cc=reinette.chatre@intel.com \
--cc=rostedt@goodmis.org \
--cc=seanjc@google.com \
--cc=sohil.mehta@intel.com \
--cc=tao1.su@linux.intel.com \
--cc=tglx@linutronix.de \
--cc=thomas.lendacky@amd.com \
--cc=tony.luck@intel.com \
--cc=x86@kernel.org \
--cc=xiaoyao.li@intel.com \
--cc=xin3.li@intel.com \
--cc=xin@zytor.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®