]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fs/resctrl: Refactor mkdir_mondata_subdir()
authorTony Luck <tony.luck@intel.com>
Wed, 17 Dec 2025 17:21:08 +0000 (09:21 -0800)
committerBorislav Petkov (AMD) <bp@alien8.de>
Fri, 9 Jan 2026 22:02:57 +0000 (23:02 +0100)
Population of a monitor group's mon_data directory is unreasonably complicated
because of the support for Sub-NUMA Cluster (SNC) mode.

Split out the SNC code into a helper function to make it easier to add support
for a new telemetry resource.

Move all the duplicated code to make and set owner of domain directories into
the mon_add_all_files() helper and rename to _mkdir_mondata_subdir().

Suggested-by: Reinette Chatre <reinette.chatre@intel.com>
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/rdtgroup.c

index a2ad99acedd6674250861a50c86c1c5ddbde09ad..6314819def29d65292f51172604116945d0c67a8 100644 (file)
@@ -3260,57 +3260,65 @@ static void rmdir_mondata_subdir_allrdtgrp(struct rdt_resource *r,
        }
 }
 
-static int mon_add_all_files(struct kernfs_node *kn, struct rdt_domain_hdr *hdr,
-                            struct rdt_resource *r, struct rdtgroup *prgrp,
-                            bool do_sum)
+/*
+ * Create a directory for a domain and populate it with monitor files. Create
+ * summing monitors when @hdr is NULL. No need to initialize summing monitors.
+ */
+static struct kernfs_node *_mkdir_mondata_subdir(struct kernfs_node *parent_kn, char *name,
+                                                struct rdt_domain_hdr *hdr,
+                                                struct rdt_resource *r,
+                                                struct rdtgroup *prgrp, int domid)
 {
-       struct rdt_l3_mon_domain *d;
        struct rmid_read rr = {0};
+       struct kernfs_node *kn;
        struct mon_data *priv;
        struct mon_evt *mevt;
-       int ret, domid;
+       int ret;
 
-       if (!domain_header_is_valid(hdr, RESCTRL_MON_DOMAIN, RDT_RESOURCE_L3))
-               return -EINVAL;
+       kn = kernfs_create_dir(parent_kn, name, parent_kn->mode, prgrp);
+       if (IS_ERR(kn))
+               return kn;
+
+       ret = rdtgroup_kn_set_ugid(kn);
+       if (ret)
+               goto out_destroy;
 
-       d = container_of(hdr, struct rdt_l3_mon_domain, hdr);
        for_each_mon_event(mevt) {
                if (mevt->rid != r->rid || !mevt->enabled)
                        continue;
-               domid = do_sum ? d->ci_id : d->hdr.id;
-               priv = mon_get_kn_priv(r->rid, domid, mevt, do_sum);
-               if (WARN_ON_ONCE(!priv))
-                       return -EINVAL;
+               priv = mon_get_kn_priv(r->rid, domid, mevt, !hdr);
+               if (WARN_ON_ONCE(!priv)) {
+                       ret = -EINVAL;
+                       goto out_destroy;
+               }
 
                ret = mon_addfile(kn, mevt->name, priv);
                if (ret)
-                       return ret;
+                       goto out_destroy;
 
-               if (!do_sum && resctrl_is_mbm_event(mevt->evtid))
+               if (hdr && resctrl_is_mbm_event(mevt->evtid))
                        mon_event_read(&rr, r, hdr, prgrp, &hdr->cpu_mask, mevt, true);
        }
 
-       return 0;
+       return kn;
+out_destroy:
+       kernfs_remove(kn);
+       return ERR_PTR(ret);
 }
 
-static int mkdir_mondata_subdir(struct kernfs_node *parent_kn,
-                               struct rdt_domain_hdr *hdr,
-                               struct rdt_resource *r, struct rdtgroup *prgrp)
+static int mkdir_mondata_subdir_snc(struct kernfs_node *parent_kn,
+                                   struct rdt_domain_hdr *hdr,
+                                   struct rdt_resource *r, struct rdtgroup *prgrp)
 {
-       struct kernfs_node *kn, *ckn;
+       struct kernfs_node *ckn, *kn;
        struct rdt_l3_mon_domain *d;
        char name[32];
-       bool snc_mode;
-       int ret = 0;
-
-       lockdep_assert_held(&rdtgroup_mutex);
 
        if (!domain_header_is_valid(hdr, RESCTRL_MON_DOMAIN, RDT_RESOURCE_L3))
                return -EINVAL;
 
        d = container_of(hdr, struct rdt_l3_mon_domain, hdr);
-       snc_mode = r->mon_scope == RESCTRL_L3_NODE;
-       sprintf(name, "mon_%s_%02d", r->name, snc_mode ? d->ci_id : d->hdr.id);
+       sprintf(name, "mon_%s_%02d", r->name, d->ci_id);
        kn = kernfs_find_and_get(parent_kn, name);
        if (kn) {
                /*
@@ -3319,41 +3327,41 @@ static int mkdir_mondata_subdir(struct kernfs_node *parent_kn,
                 */
                kernfs_put(kn);
        } else {
-               kn = kernfs_create_dir(parent_kn, name, parent_kn->mode, prgrp);
+               kn = _mkdir_mondata_subdir(parent_kn, name, NULL, r, prgrp, d->ci_id);
                if (IS_ERR(kn))
                        return PTR_ERR(kn);
+       }
 
-               ret = rdtgroup_kn_set_ugid(kn);
-               if (ret)
-                       goto out_destroy;
-               ret = mon_add_all_files(kn, hdr, r, prgrp, snc_mode);
-               if (ret)
-                       goto out_destroy;
+       sprintf(name, "mon_sub_%s_%02d", r->name, hdr->id);
+       ckn = _mkdir_mondata_subdir(kn, name, hdr, r, prgrp, hdr->id);
+       if (IS_ERR(ckn)) {
+               kernfs_remove(kn);
+               return PTR_ERR(ckn);
        }
 
-       if (snc_mode) {
-               sprintf(name, "mon_sub_%s_%02d", r->name, hdr->id);
-               ckn = kernfs_create_dir(kn, name, parent_kn->mode, prgrp);
-               if (IS_ERR(ckn)) {
-                       ret = -EINVAL;
-                       goto out_destroy;
-               }
+       kernfs_activate(kn);
+       return 0;
+}
 
-               ret = rdtgroup_kn_set_ugid(ckn);
-               if (ret)
-                       goto out_destroy;
+static int mkdir_mondata_subdir(struct kernfs_node *parent_kn,
+                               struct rdt_domain_hdr *hdr,
+                               struct rdt_resource *r, struct rdtgroup *prgrp)
+{
+       struct kernfs_node *kn;
+       char name[32];
 
-               ret = mon_add_all_files(ckn, hdr, r, prgrp, false);
-               if (ret)
-                       goto out_destroy;
-       }
+       lockdep_assert_held(&rdtgroup_mutex);
+
+       if (r->rid == RDT_RESOURCE_L3 && r->mon_scope == RESCTRL_L3_NODE)
+               return mkdir_mondata_subdir_snc(parent_kn, hdr, r, prgrp);
+
+       sprintf(name, "mon_%s_%02d", r->name, hdr->id);
+       kn = _mkdir_mondata_subdir(parent_kn, name, hdr, r, prgrp, hdr->id);
+       if (IS_ERR(kn))
+               return PTR_ERR(kn);
 
        kernfs_activate(kn);
        return 0;
-
-out_destroy:
-       kernfs_remove(kn);
-       return ret;
 }
 
 /*