Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

authored by

Tony Luck and committed by
Borislav Petkov (AMD)
0ec1db4c 51541f6c

+59 -51
+59 -51
fs/resctrl/rdtgroup.c
··· 3260 3260 } 3261 3261 } 3262 3262 3263 - static int mon_add_all_files(struct kernfs_node *kn, struct rdt_domain_hdr *hdr, 3264 - struct rdt_resource *r, struct rdtgroup *prgrp, 3265 - bool do_sum) 3263 + /* 3264 + * Create a directory for a domain and populate it with monitor files. Create 3265 + * summing monitors when @hdr is NULL. No need to initialize summing monitors. 3266 + */ 3267 + static struct kernfs_node *_mkdir_mondata_subdir(struct kernfs_node *parent_kn, char *name, 3268 + struct rdt_domain_hdr *hdr, 3269 + struct rdt_resource *r, 3270 + struct rdtgroup *prgrp, int domid) 3266 3271 { 3267 - struct rdt_l3_mon_domain *d; 3268 3272 struct rmid_read rr = {0}; 3273 + struct kernfs_node *kn; 3269 3274 struct mon_data *priv; 3270 3275 struct mon_evt *mevt; 3271 - int ret, domid; 3276 + int ret; 3272 3277 3273 - if (!domain_header_is_valid(hdr, RESCTRL_MON_DOMAIN, RDT_RESOURCE_L3)) 3274 - return -EINVAL; 3278 + kn = kernfs_create_dir(parent_kn, name, parent_kn->mode, prgrp); 3279 + if (IS_ERR(kn)) 3280 + return kn; 3275 3281 3276 - d = container_of(hdr, struct rdt_l3_mon_domain, hdr); 3282 + ret = rdtgroup_kn_set_ugid(kn); 3283 + if (ret) 3284 + goto out_destroy; 3285 + 3277 3286 for_each_mon_event(mevt) { 3278 3287 if (mevt->rid != r->rid || !mevt->enabled) 3279 3288 continue; 3280 - domid = do_sum ? d->ci_id : d->hdr.id; 3281 - priv = mon_get_kn_priv(r->rid, domid, mevt, do_sum); 3282 - if (WARN_ON_ONCE(!priv)) 3283 - return -EINVAL; 3289 + priv = mon_get_kn_priv(r->rid, domid, mevt, !hdr); 3290 + if (WARN_ON_ONCE(!priv)) { 3291 + ret = -EINVAL; 3292 + goto out_destroy; 3293 + } 3284 3294 3285 3295 ret = mon_addfile(kn, mevt->name, priv); 3286 3296 if (ret) 3287 - return ret; 3297 + goto out_destroy; 3288 3298 3289 - if (!do_sum && resctrl_is_mbm_event(mevt->evtid)) 3299 + if (hdr && resctrl_is_mbm_event(mevt->evtid)) 3290 3300 mon_event_read(&rr, r, hdr, prgrp, &hdr->cpu_mask, mevt, true); 3291 3301 } 3292 3302 3293 - return 0; 3303 + return kn; 3304 + out_destroy: 3305 + kernfs_remove(kn); 3306 + return ERR_PTR(ret); 3294 3307 } 3295 3308 3296 - static int mkdir_mondata_subdir(struct kernfs_node *parent_kn, 3297 - struct rdt_domain_hdr *hdr, 3298 - struct rdt_resource *r, struct rdtgroup *prgrp) 3309 + static int mkdir_mondata_subdir_snc(struct kernfs_node *parent_kn, 3310 + struct rdt_domain_hdr *hdr, 3311 + struct rdt_resource *r, struct rdtgroup *prgrp) 3299 3312 { 3300 - struct kernfs_node *kn, *ckn; 3313 + struct kernfs_node *ckn, *kn; 3301 3314 struct rdt_l3_mon_domain *d; 3302 3315 char name[32]; 3303 - bool snc_mode; 3304 - int ret = 0; 3305 - 3306 - lockdep_assert_held(&rdtgroup_mutex); 3307 3316 3308 3317 if (!domain_header_is_valid(hdr, RESCTRL_MON_DOMAIN, RDT_RESOURCE_L3)) 3309 3318 return -EINVAL; 3310 3319 3311 3320 d = container_of(hdr, struct rdt_l3_mon_domain, hdr); 3312 - snc_mode = r->mon_scope == RESCTRL_L3_NODE; 3313 - sprintf(name, "mon_%s_%02d", r->name, snc_mode ? d->ci_id : d->hdr.id); 3321 + sprintf(name, "mon_%s_%02d", r->name, d->ci_id); 3314 3322 kn = kernfs_find_and_get(parent_kn, name); 3315 3323 if (kn) { 3316 3324 /* ··· 3327 3319 */ 3328 3320 kernfs_put(kn); 3329 3321 } else { 3330 - kn = kernfs_create_dir(parent_kn, name, parent_kn->mode, prgrp); 3322 + kn = _mkdir_mondata_subdir(parent_kn, name, NULL, r, prgrp, d->ci_id); 3331 3323 if (IS_ERR(kn)) 3332 3324 return PTR_ERR(kn); 3333 - 3334 - ret = rdtgroup_kn_set_ugid(kn); 3335 - if (ret) 3336 - goto out_destroy; 3337 - ret = mon_add_all_files(kn, hdr, r, prgrp, snc_mode); 3338 - if (ret) 3339 - goto out_destroy; 3340 3325 } 3341 3326 3342 - if (snc_mode) { 3343 - sprintf(name, "mon_sub_%s_%02d", r->name, hdr->id); 3344 - ckn = kernfs_create_dir(kn, name, parent_kn->mode, prgrp); 3345 - if (IS_ERR(ckn)) { 3346 - ret = -EINVAL; 3347 - goto out_destroy; 3348 - } 3349 - 3350 - ret = rdtgroup_kn_set_ugid(ckn); 3351 - if (ret) 3352 - goto out_destroy; 3353 - 3354 - ret = mon_add_all_files(ckn, hdr, r, prgrp, false); 3355 - if (ret) 3356 - goto out_destroy; 3327 + sprintf(name, "mon_sub_%s_%02d", r->name, hdr->id); 3328 + ckn = _mkdir_mondata_subdir(kn, name, hdr, r, prgrp, hdr->id); 3329 + if (IS_ERR(ckn)) { 3330 + kernfs_remove(kn); 3331 + return PTR_ERR(ckn); 3357 3332 } 3358 3333 3359 3334 kernfs_activate(kn); 3360 3335 return 0; 3336 + } 3361 3337 3362 - out_destroy: 3363 - kernfs_remove(kn); 3364 - return ret; 3338 + static int mkdir_mondata_subdir(struct kernfs_node *parent_kn, 3339 + struct rdt_domain_hdr *hdr, 3340 + struct rdt_resource *r, struct rdtgroup *prgrp) 3341 + { 3342 + struct kernfs_node *kn; 3343 + char name[32]; 3344 + 3345 + lockdep_assert_held(&rdtgroup_mutex); 3346 + 3347 + if (r->rid == RDT_RESOURCE_L3 && r->mon_scope == RESCTRL_L3_NODE) 3348 + return mkdir_mondata_subdir_snc(parent_kn, hdr, r, prgrp); 3349 + 3350 + sprintf(name, "mon_%s_%02d", r->name, hdr->id); 3351 + kn = _mkdir_mondata_subdir(parent_kn, name, hdr, r, prgrp, hdr->id); 3352 + if (IS_ERR(kn)) 3353 + return PTR_ERR(kn); 3354 + 3355 + kernfs_activate(kn); 3356 + return 0; 3365 3357 } 3366 3358 3367 3359 /*