[RFC PATCH 04/17] x86/resctrl: Split L3 specific code out of rdtgroup_mondata_show()
From: Tony Luck
Date: Mon Mar 03 2025 - 18:35:19 EST
New monitor resources require different operations to read counters.
Move the L3 specific code to a helper function.
Signed-off-by: Tony Luck <tony.luck@xxxxxxxxx>
---
arch/x86/kernel/cpu/resctrl/ctrlmondata.c | 79 +++++++++++++----------
1 file changed, 46 insertions(+), 33 deletions(-)
diff --git a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
index 536351159cc2..515a9bec05cd 100644
--- a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
+++ b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
@@ -627,31 +627,14 @@ void mon_event_read(struct rmid_read *rr, struct rdt_resource *r,
resctrl_arch_mon_ctx_free(r, evtid, rr->arch_mon_ctx);
}
-int rdtgroup_mondata_show(struct seq_file *m, void *arg)
+static int rdtgroup_l3_data_show(struct seq_file *m, struct rdt_resource *r,
+ int domid, struct rdtgroup *rdtgrp, u32 evtid,
+ bool sum, struct rmid_read *rr)
{
- struct kernfs_open_file *of = m->private;
struct rdt_domain_hdr *hdr;
- struct rmid_read rr = {0};
struct rdt_mon_domain *d;
- u32 resid, evtid, domid;
- struct rdtgroup *rdtgrp;
- struct rdt_resource *r;
- union mon_data_bits md;
- int ret = 0;
-
- rdtgrp = rdtgroup_kn_lock_live(of->kn);
- if (!rdtgrp) {
- ret = -ENOENT;
- goto out;
- }
- md.priv = of->kn->priv;
- resid = md.u.rid;
- domid = md.u.domid;
- evtid = md.u.evtid;
- r = &rdt_resources_all[resid].r_resctrl;
-
- if (md.u.sum) {
+ if (sum) {
/*
* This file requires summing across all domains that share
* the L3 cache id that was provided in the "domid" field of the
@@ -660,37 +643,67 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg)
*/
list_for_each_entry(d, &r->mon_domains, hdr.list) {
if (d->ci->id == domid) {
- rr.ci = d->ci;
- mon_event_read(&rr, r, NULL, rdtgrp,
+ rr->ci = d->ci;
+ mon_event_read(rr, r, NULL, rdtgrp,
&d->ci->shared_cpu_map, evtid, false);
goto checkresult;
}
}
- ret = -ENOENT;
- goto out;
+ return -ENOENT;
} else {
/*
* This file provides data from a single domain. Search
* the resource to find the domain with "domid".
*/
hdr = rdt_find_domain(&r->mon_domains, domid, NULL);
- if (!hdr || WARN_ON_ONCE(hdr->type != RESCTRL_MON_DOMAIN)) {
- ret = -ENOENT;
- goto out;
- }
+ if (!hdr || WARN_ON_ONCE(hdr->type != RESCTRL_MON_DOMAIN))
+ return -ENOENT;
d = container_of(hdr, struct rdt_mon_domain, hdr);
- mon_event_read(&rr, r, d, rdtgrp, &d->hdr.cpu_mask, evtid, false);
+ mon_event_read(rr, r, d, rdtgrp, &d->hdr.cpu_mask, evtid, false);
}
checkresult:
- if (rr.err == -EIO)
+ if (rr->err == -EIO)
seq_puts(m, "Error\n");
- else if (rr.err == -EINVAL)
+ else if (rr->err == -EINVAL)
seq_puts(m, "Unavailable\n");
else
- seq_printf(m, "%llu\n", rr.val);
+ seq_printf(m, "%llu\n", rr->val);
+ return 0;
+}
+
+int rdtgroup_mondata_show(struct seq_file *m, void *arg)
+{
+ struct kernfs_open_file *of = m->private;
+ struct rmid_read rr = {0};
+ u32 resid, evtid, domid;
+ struct rdtgroup *rdtgrp;
+ struct rdt_resource *r;
+ union mon_data_bits md;
+ int ret = 0;
+
+ rdtgrp = rdtgroup_kn_lock_live(of->kn);
+ if (!rdtgrp) {
+ ret = -ENOENT;
+ goto out;
+ }
+
+ md.priv = of->kn->priv;
+ resid = md.u.rid;
+ domid = md.u.domid;
+ evtid = md.u.evtid;
+ r = &rdt_resources_all[resid].r_resctrl;
+
+ switch (r->rid) {
+ case RDT_RESOURCE_L3:
+ ret = rdtgroup_l3_data_show(m, r, domid, rdtgrp, evtid, md.u.sum, &rr);
+ break;
+ default:
+ ret = -EINVAL;
+ break;
+ }
out:
rdtgroup_kn_unlock(of->kn);
return ret;
--
2.48.1