[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250829193346.31565-31-tony.luck@intel.com>
Date: Fri, 29 Aug 2025 12:33:42 -0700
From: Tony Luck <tony.luck@...el.com>
To: Fenghua Yu <fenghuay@...dia.com>,
Reinette Chatre <reinette.chatre@...el.com>,
Maciej Wieczor-Retman <maciej.wieczor-retman@...el.com>,
Peter Newman <peternewman@...gle.com>,
James Morse <james.morse@....com>,
Babu Moger <babu.moger@....com>,
Drew Fustini <dfustini@...libre.com>,
Dave Martin <Dave.Martin@....com>,
Chen Yu <yu.c.chen@...el.com>
Cc: x86@...nel.org,
linux-kernel@...r.kernel.org,
patches@...ts.linux.dev,
Tony Luck <tony.luck@...el.com>
Subject: [PATCH v9 30/31] x86/resctrl: Add debugfs files to show telemetry aggregator status
Each telemetry aggregator provides three status registers at the top
end of MMIO space after all the per-RMID per-event counters:
data_loss_count: This counts the number of times that this aggregator
failed to accumulate a counter value supplied by a CPU core.
data_loss_timestamp: This is a "timestamp" from a free running
25MHz uncore timer indicating when the most recent data loss occurred.
last_update_timestamp: Another 25MHz timestamp indicating when the
most recent counter update was successfully applied.
Create files in /sys/kernel/debug/resctrl/info/PERF_PKG_MON/x86_64/
to display the value of each of these status registers for each aggregator
in each enabled event group. The prefix for each file name describes
the type of aggregator and its location. The suffix is one of the
three strings listed above. An example name is:
energy_pkg0_agg2_data_loss_count
These files are removed along with all other debugfs entries by the
call to debugfs_remove_recursive() in resctrl_exit().
Signed-off-by: Tony Luck <tony.luck@...el.com>
---
arch/x86/kernel/cpu/resctrl/intel_aet.c | 48 +++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/arch/x86/kernel/cpu/resctrl/intel_aet.c b/arch/x86/kernel/cpu/resctrl/intel_aet.c
index 35670ef07478..ee6418517324 100644
--- a/arch/x86/kernel/cpu/resctrl/intel_aet.c
+++ b/arch/x86/kernel/cpu/resctrl/intel_aet.c
@@ -13,6 +13,7 @@
#include <linux/cleanup.h>
#include <linux/cpu.h>
+#include <linux/debugfs.h>
#include <linux/intel_vsec.h>
#include <linux/io.h>
#include <linux/minmax.h>
@@ -148,9 +149,50 @@ static bool all_regions_have_sufficient_rmid(struct event_group *e, struct pmt_f
return true;
}
+static int status_read(void *priv, u64 *val)
+{
+ void __iomem *info = (void __iomem *)priv;
+
+ *val = readq(info);
+
+ return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(status_fops, status_read, NULL, "%llu\n");
+
+static void make_status_files(struct dentry *dir, struct event_group *e, int pkg,
+ int instance, void *info_end)
+{
+ char name[64];
+
+ sprintf(name, "%s_pkg%d_agg%d_data_loss_count", e->name, pkg, instance);
+ debugfs_create_file(name, 0400, dir, info_end - 24, &status_fops);
+
+ sprintf(name, "%s_pkg%d_agg%d_data_loss_timestamp", e->name, pkg, instance);
+ debugfs_create_file(name, 0400, dir, info_end - 16, &status_fops);
+
+ sprintf(name, "%s_pkg%d_agg%d_last_update_timestamp", e->name, pkg, instance);
+ debugfs_create_file(name, 0400, dir, info_end - 8, &status_fops);
+}
+
+static void create_debug_event_status_files(struct dentry *dir, struct event_group *e,
+ struct pmt_feature_group *p)
+{
+ void *info_end;
+
+ for (int i = 0; i < p->count; i++) {
+ if (!p->regions[i].addr)
+ continue;
+ info_end = (void __force *)p->regions[i].addr + e->mmio_size;
+ make_status_files(dir, e, p->regions[i].plat_info.package_id,
+ i, info_end);
+ }
+}
+
static bool enable_events(struct event_group *e, struct pmt_feature_group *p)
{
struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_PERF_PKG].r_resctrl;
+ static struct dentry *infodir;
bool usable_events = false;
/* Disable feature if insufficient RMIDs */
@@ -194,6 +236,12 @@ static bool enable_events(struct event_group *e, struct pmt_feature_group *p)
resctrl_enable_mon_event(e->evts[j].id, true,
e->evts[j].bin_bits, &e->evts[j]);
+ if (!infodir)
+ infodir = resctrl_debugfs_mon_info_arch_mkdir(r);
+
+ if (infodir)
+ create_debug_event_status_files(infodir, e, p);
+
pr_info("%s %s monitoring detected\n", r->name, e->name);
return true;
--
2.50.1
Powered by blists - more mailing lists