]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
fs/resctrl: Introduce mbm_assign_on_mkdir to enable assignments on mkdir
authorBabu Moger <babu.moger@amd.com>
Fri, 5 Sep 2025 21:34:25 +0000 (16:34 -0500)
committerBorislav Petkov (AMD) <bp@alien8.de>
Mon, 15 Sep 2025 10:42:02 +0000 (12:42 +0200)
The "mbm_event" counter assignment mode allows users to assign a hardware
counter to an RMID, event pair and monitor the bandwidth as long as it is
assigned.

Introduce a user-configurable option that determines if a counter will
automatically be assigned to an RMID, event pair when its associated
monitor group is created via mkdir. Accessible when "mbm_event" counter
assignment mode is enabled.

Suggested-by: Peter Newman <peternewman@google.com>
Signed-off-by: Babu Moger <babu.moger@amd.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Link: https://lore.kernel.org/cover.1757108044.git.babu.moger@amd.com
Documentation/filesystems/resctrl.rst
fs/resctrl/internal.h
fs/resctrl/monitor.c
fs/resctrl/rdtgroup.c
include/linux/resctrl.h

index 2e840ef26f6829dc2a19f92f129faf3596d50461..1de815b3a07b459d9502899da0f0c550f02de579 100644 (file)
@@ -355,6 +355,26 @@ with the following files:
          # cat /sys/fs/resctrl/info/L3_MON/event_configs/mbm_total_bytes/event_filter
           local_reads,local_non_temporal_writes
 
+"mbm_assign_on_mkdir":
+       Exists when "mbm_event" counter assignment mode is supported. Accessible
+       only when "mbm_event" counter assignment mode is enabled.
+
+       Determines if a counter will automatically be assigned to an RMID, MBM event
+       pair when its associated monitor group is created via mkdir. Enabled by default
+       on boot, also when switched from "default" mode to "mbm_event" counter assignment
+       mode. Users can disable this capability by writing to the interface.
+
+       "0":
+               Auto assignment is disabled.
+       "1":
+               Auto assignment is enabled.
+
+       Example::
+
+         # echo 0 > /sys/fs/resctrl/info/L3_MON/mbm_assign_on_mkdir
+         # cat /sys/fs/resctrl/info/L3_MON/mbm_assign_on_mkdir
+         0
+
 "max_threshold_occupancy":
                Read/write file provides the largest value (in
                bytes) at which a previously used LLC_occupancy
index 90d3e4ab335b6b1bf669fab747819197ae11cb5c..66c677c1b858816991e9ea15f385af8a1505d56f 100644 (file)
@@ -410,6 +410,12 @@ int event_filter_show(struct kernfs_open_file *of, struct seq_file *seq, void *v
 ssize_t event_filter_write(struct kernfs_open_file *of, char *buf, size_t nbytes,
                           loff_t off);
 
+int resctrl_mbm_assign_on_mkdir_show(struct kernfs_open_file *of,
+                                    struct seq_file *s, void *v);
+
+ssize_t resctrl_mbm_assign_on_mkdir_write(struct kernfs_open_file *of, char *buf,
+                                         size_t nbytes, loff_t off);
+
 #ifdef CONFIG_RESCTRL_FS_PSEUDO_LOCK
 int rdtgroup_locksetup_enter(struct rdtgroup *rdtgrp);
 
index ccb9726bba545db0bf016d11b369efd60a9c4d9d..deca9535fbbb8ef07dfdc7e6968c85fece1b6b5a 100644 (file)
@@ -1027,6 +1027,57 @@ out_unlock:
        return ret;
 }
 
+int resctrl_mbm_assign_on_mkdir_show(struct kernfs_open_file *of, struct seq_file *s,
+                                    void *v)
+{
+       struct rdt_resource *r = rdt_kn_parent_priv(of->kn);
+       int ret = 0;
+
+       mutex_lock(&rdtgroup_mutex);
+       rdt_last_cmd_clear();
+
+       if (!resctrl_arch_mbm_cntr_assign_enabled(r)) {
+               rdt_last_cmd_puts("mbm_event counter assignment mode is not enabled\n");
+               ret = -EINVAL;
+               goto out_unlock;
+       }
+
+       seq_printf(s, "%u\n", r->mon.mbm_assign_on_mkdir);
+
+out_unlock:
+       mutex_unlock(&rdtgroup_mutex);
+
+       return ret;
+}
+
+ssize_t resctrl_mbm_assign_on_mkdir_write(struct kernfs_open_file *of, char *buf,
+                                         size_t nbytes, loff_t off)
+{
+       struct rdt_resource *r = rdt_kn_parent_priv(of->kn);
+       bool value;
+       int ret;
+
+       ret = kstrtobool(buf, &value);
+       if (ret)
+               return ret;
+
+       mutex_lock(&rdtgroup_mutex);
+       rdt_last_cmd_clear();
+
+       if (!resctrl_arch_mbm_cntr_assign_enabled(r)) {
+               rdt_last_cmd_puts("mbm_event counter assignment mode is not enabled\n");
+               ret = -EINVAL;
+               goto out_unlock;
+       }
+
+       r->mon.mbm_assign_on_mkdir = value;
+
+out_unlock:
+       mutex_unlock(&rdtgroup_mutex);
+
+       return ret ?: nbytes;
+}
+
 /*
  * rdtgroup_assign_cntr() - Assign/unassign the counter ID for the event, RMID
  * pair in the domain.
@@ -1457,6 +1508,8 @@ int resctrl_mon_resource_init(void)
                resctrl_file_fflags_init("available_mbm_cntrs",
                                         RFTYPE_MON_INFO | RFTYPE_RES_CACHE);
                resctrl_file_fflags_init("event_filter", RFTYPE_ASSIGN_CONFIG);
+               resctrl_file_fflags_init("mbm_assign_on_mkdir", RFTYPE_MON_INFO |
+                                        RFTYPE_RES_CACHE);
        }
 
        return 0;
index e90bc808fe5327d29c03c3511d9d5530c2009da6..c7ea42c2a3c24ec44e03dde5b225d9848b36e355 100644 (file)
@@ -1808,6 +1808,13 @@ static struct rftype res_common_files[] = {
                .seq_show       = rdt_last_cmd_status_show,
                .fflags         = RFTYPE_TOP_INFO,
        },
+       {
+               .name           = "mbm_assign_on_mkdir",
+               .mode           = 0644,
+               .kf_ops         = &rdtgroup_kf_single_ops,
+               .seq_show       = resctrl_mbm_assign_on_mkdir_show,
+               .write          = resctrl_mbm_assign_on_mkdir_write,
+       },
        {
                .name           = "num_closids",
                .mode           = 0444,
index 04152654827d4f92c8b1ffc425844d752f74dda9..a7d92718b653f51735e2fbb01ba9506e22e59a64 100644 (file)
@@ -277,12 +277,15 @@ enum resctrl_schema_fmt {
  *                     monitoring events can be configured.
  * @num_mbm_cntrs:     Number of assignable counters.
  * @mbm_cntr_assignable:Is system capable of supporting counter assignment?
+ * @mbm_assign_on_mkdir:True if counters should automatically be assigned to MBM
+ *                     events of monitor groups created via mkdir.
  */
 struct resctrl_mon {
        int                     num_rmid;
        unsigned int            mbm_cfg_mask;
        int                     num_mbm_cntrs;
        bool                    mbm_cntr_assignable;
+       bool                    mbm_assign_on_mkdir;
 };
 
 /**