Messages in this thread Patch in this message | | | From | Tony Luck <> | Subject | [PATCH 07/10] x86/resctrl: Update rmdir_mondata_subdir_allrdtgrp() for Sub-NUMA domains | Date | Wed, 27 Mar 2024 13:03:49 -0700 |
| |
Old code could simply remove the mon_L3_XX directory with all contents when a domain was taken offline. With Sub-NUMA cluster enabled this becomes a multi-stage process.
While the parent L3 domain is still online the offline process for a SUBL3 domain removes just one directory from mon_L3_XX. When the last such domain goes offline the whole mon_L3_XX must be removed.
Signed-off-by: Tony Luck <tony.luck@intel.com> --- arch/x86/kernel/cpu/resctrl/rdtgroup.c | 46 ++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 7 deletions(-)
diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c index 22effd8dc207..399dc3175292 100644 --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c @@ -3012,17 +3012,49 @@ static int mon_addfile(struct kernfs_node *parent_kn, const char *name, * and monitor groups with given domain id. */ static void rmdir_mondata_subdir_allrdtgrp(struct rdt_resource *r, - unsigned int dom_id) + struct rdt_domain *d) { struct rdtgroup *prgrp, *crgrp; - char name[32]; + char pname[32], name[32]; + bool remove_all = false; + struct kernfs_node *kn; + struct rdt_domain *pd; + + sprintf(name, "mon_%s_%02d", r->name, d->id); + + if (!r->parent) { + list_for_each_entry(prgrp, &rdt_all_groups, rdtgroup_list) { + kernfs_remove_by_name(prgrp->mon.mon_data_kn, name); + + list_for_each_entry(crgrp, &prgrp->mon.crdtgrp_list, mon.crdtgrp_list) + kernfs_remove_by_name(crgrp->mon.mon_data_kn, name); + } + return; + } + + sprintf(pname, "mon_%s_%02d", r->parent->name, d->parent); + pd = get_parent_domain(r, d); + if (!pd) + remove_all = true; list_for_each_entry(prgrp, &rdt_all_groups, rdtgroup_list) { - sprintf(name, "mon_%s_%02d", r->name, dom_id); - kernfs_remove_by_name(prgrp->mon.mon_data_kn, name); + if (remove_all) { + kernfs_remove_by_name(prgrp->mon.mon_data_kn, pname); + } else { + kn = kernfs_find_and_get_ns(prgrp->mon.mon_data_kn, pname, NULL); + if (kn) + kernfs_remove_by_name(kn, name); + } - list_for_each_entry(crgrp, &prgrp->mon.crdtgrp_list, mon.crdtgrp_list) - kernfs_remove_by_name(crgrp->mon.mon_data_kn, name); + list_for_each_entry(crgrp, &prgrp->mon.crdtgrp_list, mon.crdtgrp_list) { + if (remove_all) { + kernfs_remove_by_name(crgrp->mon.mon_data_kn, pname); + } else { + kn = kernfs_find_and_get_ns(crgrp->mon.mon_data_kn, pname, NULL); + if (kn) + kernfs_remove_by_name(kn, name); + } + } } } @@ -3979,7 +4011,7 @@ void resctrl_offline_domain(struct rdt_resource *r, struct rdt_domain *d) * per domain monitor data directories. */ if (resctrl_mounted && resctrl_arch_mon_capable()) - rmdir_mondata_subdir_allrdtgrp(r, d->id); + rmdir_mondata_subdir_allrdtgrp(r, d); if (is_mbm_enabled()) cancel_delayed_work(&d->mbm_over); -- 2.44.0
| |