]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs/resctrl: Add resctrl file to display number of assignable counters
authorBabu Moger <babu.moger@amd.com>
Fri, 5 Sep 2025 21:34:10 +0000 (16:34 -0500)
committerBorislav Petkov (AMD) <bp@alien8.de>
Mon, 15 Sep 2025 10:12:09 +0000 (12:12 +0200)
The "mbm_event" counter assignment mode allows users to assign a hardware
counter to an RMID, event pair and monitor bandwidth usage as long as it is
assigned.  The hardware continues to track the assigned counter until it is
explicitly unassigned by the user.

Create 'num_mbm_cntrs' resctrl file that displays the number of counters
supported in each domain. 'num_mbm_cntrs' is only visible to user space when
the system supports "mbm_event" mode.

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

index b692829fec5f6bb6effe23d77a28ac7e2c62cdbd..4eb27530be6ffe620088c31e42a56fd984368727 100644 (file)
@@ -288,6 +288,17 @@ with the following files:
        result in misleading values or display "Unavailable" if no counter is assigned
        to the event.
 
+"num_mbm_cntrs":
+       The maximum number of counters (total of available and assigned counters) in
+       each domain when the system supports mbm_event mode.
+
+       For example, on a system with maximum of 32 memory bandwidth monitoring
+       counters in each of its L3 domains:
+       ::
+
+         # cat /sys/fs/resctrl/info/L3_MON/num_mbm_cntrs
+         0=32;1=32
+
 "max_threshold_occupancy":
                Read/write file provides the largest value (in
                bytes) at which a previously used LLC_occupancy
index 78aeb7ea38af2634a24d3c7ec9bd50725459fcd1..7a12187eced821db8ad163b795cfe54ff57ab3f2 100644 (file)
@@ -386,6 +386,8 @@ void *rdt_kn_parent_priv(struct kernfs_node *kn);
 
 int resctrl_mbm_assign_mode_show(struct kernfs_open_file *of, struct seq_file *s, void *v);
 
+int resctrl_num_mbm_cntrs_show(struct kernfs_open_file *of, struct seq_file *s, void *v);
+
 #ifdef CONFIG_RESCTRL_FS_PSEUDO_LOCK
 int rdtgroup_locksetup_enter(struct rdtgroup *rdtgrp);
 
index 96231d517e711d4506463b468e0a359cdc26d3e5..112979e9c44453894c97acd4308836e5f9ff78fe 100644 (file)
@@ -912,6 +912,30 @@ int resctrl_mbm_assign_mode_show(struct kernfs_open_file *of,
        return 0;
 }
 
+int resctrl_num_mbm_cntrs_show(struct kernfs_open_file *of,
+                              struct seq_file *s, void *v)
+{
+       struct rdt_resource *r = rdt_kn_parent_priv(of->kn);
+       struct rdt_mon_domain *dom;
+       bool sep = false;
+
+       cpus_read_lock();
+       mutex_lock(&rdtgroup_mutex);
+
+       list_for_each_entry(dom, &r->mon_domains, hdr.list) {
+               if (sep)
+                       seq_putc(s, ';');
+
+               seq_printf(s, "%d=%d", dom->hdr.id, r->mon.num_mbm_cntrs);
+               sep = true;
+       }
+       seq_putc(s, '\n');
+
+       mutex_unlock(&rdtgroup_mutex);
+       cpus_read_unlock();
+       return 0;
+}
+
 /**
  * resctrl_mon_resource_init() - Initialise global monitoring structures.
  *
@@ -957,6 +981,8 @@ int resctrl_mon_resource_init(void)
                        resctrl_enable_mon_event(QOS_L3_MBM_TOTAL_EVENT_ID);
                if (!resctrl_is_mon_event_enabled(QOS_L3_MBM_LOCAL_EVENT_ID))
                        resctrl_enable_mon_event(QOS_L3_MBM_LOCAL_EVENT_ID);
+               resctrl_file_fflags_init("num_mbm_cntrs",
+                                        RFTYPE_MON_INFO | RFTYPE_RES_CACHE);
        }
 
        return 0;
index 144585a8599670e2ce0a8beb9cd32d82d814a076..9d95d01da3f9d3a8ae127706418fa99deb7834cb 100644 (file)
@@ -1836,6 +1836,12 @@ static struct rftype res_common_files[] = {
                .seq_show       = rdt_default_ctrl_show,
                .fflags         = RFTYPE_CTRL_INFO | RFTYPE_RES_CACHE,
        },
+       {
+               .name           = "num_mbm_cntrs",
+               .mode           = 0444,
+               .kf_ops         = &rdtgroup_kf_single_ops,
+               .seq_show       = resctrl_num_mbm_cntrs_show,
+       },
        {
                .name           = "min_cbm_bits",
                .mode           = 0444,