mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 19:43:40 +02:00
fs/resctrl: Refactor mkdir_mondata_subdir()
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
This commit is contained in:
parent
51541f6ca7
commit
0ec1db4cac
|
|
@ -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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
ret = rdtgroup_kn_set_ugid(ckn);
|
||||
if (ret)
|
||||
goto out_destroy;
|
||||
|
||||
ret = mon_add_all_files(ckn, hdr, r, prgrp, false);
|
||||
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);
|
||||
}
|
||||
|
||||
kernfs_activate(kn);
|
||||
return 0;
|
||||
}
|
||||
|
||||
out_destroy:
|
||||
kernfs_remove(kn);
|
||||
return ret;
|
||||
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];
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user