]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fs/resctrl: Make event details accessible to functions when reading events
authorTony Luck <tony.luck@intel.com>
Wed, 17 Dec 2025 17:20:57 +0000 (09:20 -0800)
committerBorislav Petkov (AMD) <bp@alien8.de>
Mon, 5 Jan 2026 14:25:22 +0000 (15:25 +0100)
Reading monitoring event data from MMIO requires more context than the event id
to be able to read the correct memory location. struct mon_evt is the appropriate
place for this event specific context.

Prepare for addition of extra fields to struct mon_evt by changing the calling
conventions to pass a pointer to the mon_evt structure instead of just the
event id.

Signed-off-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Link: https://lore.kernel.org/20251217172121.12030-1-tony.luck@intel.com
fs/resctrl/ctrlmondata.c
fs/resctrl/internal.h
fs/resctrl/monitor.c
fs/resctrl/rdtgroup.c

index a3c734fe656e81d0554195fe16f4eb5bc04f8a6f..7f9b2fed117a66aaca943309a02f1e2069a09a9c 100644 (file)
@@ -552,7 +552,7 @@ struct rdt_domain_hdr *resctrl_find_domain(struct list_head *h, int id,
 
 void mon_event_read(struct rmid_read *rr, struct rdt_resource *r,
                    struct rdt_domain_hdr *hdr, struct rdtgroup *rdtgrp,
-                   cpumask_t *cpumask, int evtid, int first)
+                   cpumask_t *cpumask, struct mon_evt *evt, int first)
 {
        int cpu;
 
@@ -563,15 +563,15 @@ void mon_event_read(struct rmid_read *rr, struct rdt_resource *r,
         * Setup the parameters to pass to mon_event_count() to read the data.
         */
        rr->rgrp = rdtgrp;
-       rr->evtid = evtid;
+       rr->evt = evt;
        rr->r = r;
        rr->hdr = hdr;
        rr->first = first;
        if (resctrl_arch_mbm_cntr_assign_enabled(r) &&
-           resctrl_is_mbm_event(evtid)) {
+           resctrl_is_mbm_event(evt->evtid)) {
                rr->is_mbm_cntr = true;
        } else {
-               rr->arch_mon_ctx = resctrl_arch_mon_ctx_alloc(r, evtid);
+               rr->arch_mon_ctx = resctrl_arch_mon_ctx_alloc(r, evt->evtid);
                if (IS_ERR(rr->arch_mon_ctx)) {
                        rr->err = -EINVAL;
                        return;
@@ -592,14 +592,13 @@ void mon_event_read(struct rmid_read *rr, struct rdt_resource *r,
                smp_call_on_cpu(cpu, smp_mon_event_count, rr, false);
 
        if (rr->arch_mon_ctx)
-               resctrl_arch_mon_ctx_free(r, evtid, rr->arch_mon_ctx);
+               resctrl_arch_mon_ctx_free(r, evt->evtid, rr->arch_mon_ctx);
 }
 
 int rdtgroup_mondata_show(struct seq_file *m, void *arg)
 {
        struct kernfs_open_file *of = m->private;
        enum resctrl_res_level resid;
-       enum resctrl_event_id evtid;
        struct rdt_l3_mon_domain *d;
        struct rdt_domain_hdr *hdr;
        struct rmid_read rr = {0};
@@ -607,6 +606,7 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg)
        int domid, cpu, ret = 0;
        struct rdt_resource *r;
        struct cacheinfo *ci;
+       struct mon_evt *evt;
        struct mon_data *md;
 
        rdtgrp = rdtgroup_kn_lock_live(of->kn);
@@ -623,7 +623,7 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg)
 
        resid = md->rid;
        domid = md->domid;
-       evtid = md->evtid;
+       evt = md->evt;
        r = resctrl_arch_get_resource(resid);
 
        if (md->sum) {
@@ -641,7 +641,7 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg)
                                        continue;
                                rr.ci = ci;
                                mon_event_read(&rr, r, NULL, rdtgrp,
-                                              &ci->shared_cpu_map, evtid, false);
+                                              &ci->shared_cpu_map, evt, false);
                                goto checkresult;
                        }
                }
@@ -657,7 +657,7 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg)
                        ret = -ENOENT;
                        goto out;
                }
-               mon_event_read(&rr, r, hdr, rdtgrp, &hdr->cpu_mask, evtid, false);
+               mon_event_read(&rr, r, hdr, rdtgrp, &hdr->cpu_mask, evt, false);
        }
 
 checkresult:
index 9768341aa21cc7adf26498a9c6cf9aad950c7f10..86cf38ab08a7f4aabb3d116d06a0402a8c36cbc6 100644 (file)
@@ -81,7 +81,7 @@ extern struct mon_evt mon_event_all[QOS_NUM_EVENTS];
  * struct mon_data - Monitoring details for each event file.
  * @list:            Member of the global @mon_data_kn_priv_list list.
  * @rid:             Resource id associated with the event file.
- * @evtid:           Event id associated with the event file.
+ * @evt:             Event structure associated with the event file.
  * @sum:             Set when event must be summed across multiple
  *                   domains.
  * @domid:           When @sum is zero this is the domain to which
@@ -95,7 +95,7 @@ extern struct mon_evt mon_event_all[QOS_NUM_EVENTS];
 struct mon_data {
        struct list_head        list;
        enum resctrl_res_level  rid;
-       enum resctrl_event_id   evtid;
+       struct mon_evt          *evt;
        int                     domid;
        bool                    sum;
 };
@@ -108,7 +108,7 @@ struct mon_data {
  * @r:    Resource describing the properties of the event being read.
  * @hdr:   Header of domain that the counter should be read from. If NULL then
  *        sum all domains in @r sharing L3 @ci.id
- * @evtid: Which monitor event to read.
+ * @evt:   Which monitor event to read.
  * @first: Initialize MBM counter when true.
  * @ci:    Cacheinfo for L3. Only set when @hdr is NULL. Used when summing
  *        domains.
@@ -126,7 +126,7 @@ struct rmid_read {
        struct rdtgroup         *rgrp;
        struct rdt_resource     *r;
        struct rdt_domain_hdr   *hdr;
-       enum resctrl_event_id   evtid;
+       struct mon_evt          *evt;
        bool                    first;
        struct cacheinfo        *ci;
        bool                    is_mbm_cntr;
@@ -367,7 +367,7 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg);
 
 void mon_event_read(struct rmid_read *rr, struct rdt_resource *r,
                    struct rdt_domain_hdr *hdr, struct rdtgroup *rdtgrp,
-                   cpumask_t *cpumask, int evtid, int first);
+                   cpumask_t *cpumask, struct mon_evt *evt, int first);
 
 void mbm_setup_overflow_handler(struct rdt_l3_mon_domain *dom,
                                unsigned long delay_ms,
index d5ae0ef4c947bbe3d4878f2e4ab68d33a74e7381..340b847ab397293f81838d392f465500f0c71f0f 100644 (file)
@@ -430,7 +430,7 @@ static int __l3_mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
        d = container_of(rr->hdr, struct rdt_l3_mon_domain, hdr);
 
        if (rr->is_mbm_cntr) {
-               cntr_id = mbm_cntr_get(rr->r, d, rdtgrp, rr->evtid);
+               cntr_id = mbm_cntr_get(rr->r, d, rdtgrp, rr->evt->evtid);
                if (cntr_id < 0) {
                        rr->err = -ENOENT;
                        return -EINVAL;
@@ -439,10 +439,10 @@ static int __l3_mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
 
        if (rr->first) {
                if (rr->is_mbm_cntr)
-                       resctrl_arch_reset_cntr(rr->r, d, closid, rmid, cntr_id, rr->evtid);
+                       resctrl_arch_reset_cntr(rr->r, d, closid, rmid, cntr_id, rr->evt->evtid);
                else
-                       resctrl_arch_reset_rmid(rr->r, d, closid, rmid, rr->evtid);
-               m = get_mbm_state(d, closid, rmid, rr->evtid);
+                       resctrl_arch_reset_rmid(rr->r, d, closid, rmid, rr->evt->evtid);
+               m = get_mbm_state(d, closid, rmid, rr->evt->evtid);
                if (m)
                        memset(m, 0, sizeof(struct mbm_state));
                return 0;
@@ -453,10 +453,10 @@ static int __l3_mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
                return -EINVAL;
        if (rr->is_mbm_cntr)
                rr->err = resctrl_arch_cntr_read(rr->r, d, closid, rmid, cntr_id,
-                                                rr->evtid, &tval);
+                                                rr->evt->evtid, &tval);
        else
                rr->err = resctrl_arch_rmid_read(rr->r, rr->hdr, closid, rmid,
-                                                rr->evtid, &tval, rr->arch_mon_ctx);
+                                                rr->evt->evtid, &tval, rr->arch_mon_ctx);
        if (rr->err)
                return rr->err;
 
@@ -501,7 +501,7 @@ static int __l3_mon_event_count_sum(struct rdtgroup *rdtgrp, struct rmid_read *r
                if (d->ci_id != rr->ci->id)
                        continue;
                err = resctrl_arch_rmid_read(rr->r, &d->hdr, closid, rmid,
-                                            rr->evtid, &tval, rr->arch_mon_ctx);
+                                            rr->evt->evtid, &tval, rr->arch_mon_ctx);
                if (!err) {
                        rr->val += tval;
                        ret = 0;
@@ -551,7 +551,7 @@ static void mbm_bw_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
        if (!domain_header_is_valid(rr->hdr, RESCTRL_MON_DOMAIN, RDT_RESOURCE_L3))
                return;
        d = container_of(rr->hdr, struct rdt_l3_mon_domain, hdr);
-       m = get_mbm_state(d, closid, rmid, rr->evtid);
+       m = get_mbm_state(d, closid, rmid, rr->evt->evtid);
        if (WARN_ON_ONCE(!m))
                return;
 
@@ -725,11 +725,11 @@ static void mbm_update_one_event(struct rdt_resource *r, struct rdt_l3_mon_domai
 
        rr.r = r;
        rr.hdr = &d->hdr;
-       rr.evtid = evtid;
+       rr.evt = &mon_event_all[evtid];
        if (resctrl_arch_mbm_cntr_assign_enabled(r)) {
                rr.is_mbm_cntr = true;
        } else {
-               rr.arch_mon_ctx = resctrl_arch_mon_ctx_alloc(rr.r, rr.evtid);
+               rr.arch_mon_ctx = resctrl_arch_mon_ctx_alloc(rr.r, evtid);
                if (IS_ERR(rr.arch_mon_ctx)) {
                        pr_warn_ratelimited("Failed to allocate monitor context: %ld",
                                            PTR_ERR(rr.arch_mon_ctx));
@@ -747,7 +747,7 @@ static void mbm_update_one_event(struct rdt_resource *r, struct rdt_l3_mon_domai
                mbm_bw_count(rdtgrp, &rr);
 
        if (rr.arch_mon_ctx)
-               resctrl_arch_mon_ctx_free(rr.r, rr.evtid, rr.arch_mon_ctx);
+               resctrl_arch_mon_ctx_free(rr.r, evtid, rr.arch_mon_ctx);
 }
 
 static void mbm_update(struct rdt_resource *r, struct rdt_l3_mon_domain *d,
index b57e1e78bbc25d77f33647447a156540f481de8f..771e40f02ba64120de1e47b49870e8e5c16dcfc1 100644 (file)
@@ -3103,7 +3103,7 @@ static struct mon_data *mon_get_kn_priv(enum resctrl_res_level rid, int domid,
 
        list_for_each_entry(priv, &mon_data_kn_priv_list, list) {
                if (priv->rid == rid && priv->domid == domid &&
-                   priv->sum == do_sum && priv->evtid == mevt->evtid)
+                   priv->sum == do_sum && priv->evt == mevt)
                        return priv;
        }
 
@@ -3114,7 +3114,7 @@ static struct mon_data *mon_get_kn_priv(enum resctrl_res_level rid, int domid,
        priv->rid = rid;
        priv->domid = domid;
        priv->sum = do_sum;
-       priv->evtid = mevt->evtid;
+       priv->evt = mevt;
        list_add_tail(&priv->list, &mon_data_kn_priv_list);
 
        return priv;
@@ -3281,7 +3281,7 @@ static int mon_add_all_files(struct kernfs_node *kn, struct rdt_domain_hdr *hdr,
                        return ret;
 
                if (!do_sum && resctrl_is_mbm_event(mevt->evtid))
-                       mon_event_read(&rr, r, hdr, prgrp, &hdr->cpu_mask, mevt->evtid, true);
+                       mon_event_read(&rr, r, hdr, prgrp, &hdr->cpu_mask, mevt, true);
        }
 
        return 0;