[08/15] x86/resctrl: Introduce interface to display number of ABMC counters

Message ID 20231201005720.235639-9-babu.moger@amd.com
State New
Headers
Series x86/resctrl : Support AMD QoS RMID Pinning feature |

Commit Message

Moger, Babu Dec. 1, 2023, 12:57 a.m. UTC
  The ABMC feature provides an option to the user to pin (or assign) the
RMID to the hardware counter and monitor the bandwidth for a longer
duration. There are only a limited number of hardware counters.

Provide the interface to display the number of ABMC counters supported.

Signed-off-by: Babu Moger <babu.moger@amd.com>
---
 Documentation/arch/x86/resctrl.rst     |  4 ++++
 arch/x86/kernel/cpu/resctrl/rdtgroup.c | 29 +++++++++++++++++++++++++-
 2 files changed, 32 insertions(+), 1 deletion(-)
  

Patch

diff --git a/Documentation/arch/x86/resctrl.rst b/Documentation/arch/x86/resctrl.rst
index 19e906f629d4..87aa8eec71b7 100644
--- a/Documentation/arch/x86/resctrl.rst
+++ b/Documentation/arch/x86/resctrl.rst
@@ -266,6 +266,10 @@  with the following files:
 	    # cat /sys/fs/resctrl/info/L3_MON/mbm_local_bytes_config
 	    0=0x30;1=0x30;3=0x15;4=0x15
 
+"abmc_counters":
+	Available when ABMC feature is enabled. The number of ABMC counters
+	available for assignment.
+
 "max_threshold_occupancy":
 		Read/write file provides the largest value (in
 		bytes) at which a previously used LLC_occupancy
diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
index 7f6ed903ba17..897707694cc8 100644
--- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c
+++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
@@ -811,6 +811,17 @@  static int rdtgroup_rmid_show(struct kernfs_open_file *of,
 	return ret;
 }
 
+static int rdtgroup_abmc_counters_show(struct kernfs_open_file *of,
+				       struct seq_file *s, void *v)
+{
+	struct rdt_resource *r = of->kn->parent->priv;
+	struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r);
+
+	seq_printf(s, "%d\n", hw_res->abmc_counters);
+
+	return 0;
+}
+
 #ifdef CONFIG_PROC_CPU_RESCTRL
 
 /*
@@ -1861,6 +1872,12 @@  static struct rftype res_common_files[] = {
 		.seq_show	= mbm_local_bytes_config_show,
 		.write		= mbm_local_bytes_config_write,
 	},
+	{
+		.name		= "abmc_counters",
+		.mode		= 0444,
+		.kf_ops		= &rdtgroup_kf_single_ops,
+		.seq_show	= rdtgroup_abmc_counters_show,
+	},
 	{
 		.name		= "cpus",
 		.mode		= 0644,
@@ -2419,12 +2436,22 @@  static void resctrl_abmc_disable(enum resctrl_res_level l)
 int resctrl_arch_set_abmc_enabled(enum resctrl_res_level l, bool enable)
 {
 	struct rdt_hw_resource *hw_res = &rdt_resources_all[l];
+	struct rftype *rft;
 
 	if (!hw_res->r_resctrl.abmc_capable)
 		return -EINVAL;
 
-	if (enable)
+	if (enable) {
+		rft = rdtgroup_get_rftype_by_name("abmc_counters");
+		if (rft)
+			rft->fflags = RFTYPE_MON_INFO;
+
 		return resctrl_abmc_enable(l);
+	}
+
+	rft = rdtgroup_get_rftype_by_name("abmc_counters");
+	if (rft)
+		rft->fflags &= ~RFTYPE_MON_INFO;
 
 	resctrl_abmc_disable(l);