[PATCH v13 21/32] fs/resctrl: Refactor mkdir_mondata_subdir()

Tony Luck
2025-10-29T16:21:41Z

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>
---
fs/resctrl/rdtgroup.c | 108 +++++++++++++++++++++++-------------------
1 file changed, 58 insertions(+), 50 deletions(-)

diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c
index fa1398787e83..bcb76dc818c0 100644
--- a/fs/resctrl/rdtgroup.c
+++ b/fs/resctrl/rdtgroup.c
@@ -3194,57 +3194,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) {
/*
@@ -3253,41 +3261,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;
}

/*
--
2.51.0