fs/resctrl: Introduce interface to display number of free MBM counters

Introduce the "available_mbm_cntrs" resctrl file to display the number of
counters available for assignment in each domain when "mbm_event" mode is
enabled.

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
This commit is contained in:
Babu Moger 2025-09-05 16:34:12 -05:00 committed by Borislav Petkov (AMD)
parent 4d32c24a74
commit 16ff6b038f
4 changed files with 64 additions and 0 deletions

View File

@ -299,6 +299,17 @@ with the following files:
# cat /sys/fs/resctrl/info/L3_MON/num_mbm_cntrs
0=32;1=32
"available_mbm_cntrs":
The number of counters available for assignment in each domain when mbm_event
mode is enabled on the system.
For example, on a system with 30 available [hardware] assignable counters
in each of its L3 domains:
::
# cat /sys/fs/resctrl/info/L3_MON/available_mbm_cntrs
0=30;1=30
"max_threshold_occupancy":
Read/write file provides the largest value (in
bytes) at which a previously used LLC_occupancy

View File

@ -388,6 +388,9 @@ int resctrl_mbm_assign_mode_show(struct kernfs_open_file *of, struct seq_file *s
int resctrl_num_mbm_cntrs_show(struct kernfs_open_file *of, struct seq_file *s, void *v);
int resctrl_available_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);

View File

@ -936,6 +936,48 @@ int resctrl_num_mbm_cntrs_show(struct kernfs_open_file *of,
return 0;
}
int resctrl_available_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;
u32 cntrs, i;
int ret = 0;
cpus_read_lock();
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;
}
list_for_each_entry(dom, &r->mon_domains, hdr.list) {
if (sep)
seq_putc(s, ';');
cntrs = 0;
for (i = 0; i < r->mon.num_mbm_cntrs; i++) {
if (!dom->cntr_cfg[i].rdtgrp)
cntrs++;
}
seq_printf(s, "%d=%u", dom->hdr.id, cntrs);
sep = true;
}
seq_putc(s, '\n');
out_unlock:
mutex_unlock(&rdtgroup_mutex);
cpus_read_unlock();
return ret;
}
/**
* resctrl_mon_resource_init() - Initialise global monitoring structures.
*
@ -983,6 +1025,8 @@ int resctrl_mon_resource_init(void)
resctrl_enable_mon_event(QOS_L3_MBM_LOCAL_EVENT_ID);
resctrl_file_fflags_init("num_mbm_cntrs",
RFTYPE_MON_INFO | RFTYPE_RES_CACHE);
resctrl_file_fflags_init("available_mbm_cntrs",
RFTYPE_MON_INFO | RFTYPE_RES_CACHE);
}
return 0;

View File

@ -1822,6 +1822,12 @@ static struct rftype res_common_files[] = {
.seq_show = rdt_mon_features_show,
.fflags = RFTYPE_MON_INFO,
},
{
.name = "available_mbm_cntrs",
.mode = 0444,
.kf_ops = &rdtgroup_kf_single_ops,
.seq_show = resctrl_available_mbm_cntrs_show,
},
{
.name = "num_rmids",
.mode = 0444,