Messages in this thread Patch in this message | | | From | Tony Luck <> | Subject | [PATCH 04/10] x86/resctrl: Add pointer to enabled monitor resource | Date | Wed, 27 Mar 2024 13:03:46 -0700 |
| |
Sub-NUMA cluster enabled systems do all monitoring using the SUBL3 resource. Others use the regular L3 resource.
Replace the hard-coded rdt_resources_all[RDT_RESOURCE_L3].r_resctrl references with a new pointer "rdt_l3_mon_resource".
Signed-off-by: Tony Luck <tony.luck@intel.com> --- arch/x86/kernel/cpu/resctrl/internal.h | 1 + arch/x86/kernel/cpu/resctrl/core.c | 2 +- arch/x86/kernel/cpu/resctrl/monitor.c | 19 ++++++++++++------- arch/x86/kernel/cpu/resctrl/rdtgroup.c | 7 +++---- 4 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h index 5fcff861e185..21d81f51838f 100644 --- a/arch/x86/kernel/cpu/resctrl/internal.h +++ b/arch/x86/kernel/cpu/resctrl/internal.h @@ -464,6 +464,7 @@ int parse_bw(struct rdt_parse_data *data, struct resctrl_schema *s, extern struct mutex rdtgroup_mutex; extern struct rdt_hw_resource rdt_resources_all[]; +extern struct rdt_resource *rdt_l3_mon_resource; extern struct rdtgroup rdtgroup_default; extern struct dentry *debugfs_resctrl; diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c index bfa179f20802..2fa04375da8c 100644 --- a/arch/x86/kernel/cpu/resctrl/core.c +++ b/arch/x86/kernel/cpu/resctrl/core.c @@ -996,7 +996,7 @@ late_initcall(resctrl_late_init); static void __exit resctrl_exit(void) { - struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl; + struct rdt_resource *r = rdt_l3_mon_resource; cpuhp_remove_state(rdt_online); diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c index 84a2056190c8..95455cb187eb 100644 --- a/arch/x86/kernel/cpu/resctrl/monitor.c +++ b/arch/x86/kernel/cpu/resctrl/monitor.c @@ -78,6 +78,9 @@ static struct rmid_entry *rmid_ptrs; */ bool rdt_mon_capable; +/* Resource (L3 or SUBL3) that is base for monitoring */ +struct rdt_resource *rdt_l3_mon_resource; + /* * Global to indicate which monitoring events are enabled. */ @@ -321,7 +324,7 @@ static void limbo_release_entry(struct rmid_entry *entry) */ void __check_limbo(struct rdt_domain *d, bool force_free) { - struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl; + struct rdt_resource *r = rdt_l3_mon_resource; u32 idx_limit = resctrl_arch_system_num_rmid_idx(); struct rmid_entry *entry; u32 idx, cur_idx = 1; @@ -467,7 +470,7 @@ int alloc_rmid(u32 closid) static void add_rmid_to_limbo(struct rmid_entry *entry) { - struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl; + struct rdt_resource *r = rdt_l3_mon_resource; struct rdt_domain *d; u32 idx; @@ -839,7 +842,7 @@ void mbm_handle_overflow(struct work_struct *work) if (!resctrl_mounted || !resctrl_arch_mon_capable()) goto out_unlock; - r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl; + r = rdt_l3_mon_resource; d = container_of(work, struct rdt_domain, mbm_over.work); list_for_each_entry(prgrp, &rdt_all_groups, rdtgroup_list) { @@ -1036,7 +1039,9 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r) */ resctrl_rmid_realloc_threshold = resctrl_arch_round_mon_val(threshold); - ret = dom_data_init(r); + rdt_l3_mon_resource = r; + + ret = dom_data_init(rdt_l3_mon_resource); if (ret) return ret; @@ -1057,10 +1062,10 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r) } } - l3_mon_evt_init(r); + l3_mon_evt_init(rdt_l3_mon_resource); - r->mon_capable = true; - r->mon_enabled = true; + rdt_l3_mon_resource->mon_capable = true; + rdt_l3_mon_resource->mon_enabled = true; return 0; } diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c index ffcafe567b25..a2ebd7e051bb 100644 --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c @@ -2703,7 +2703,7 @@ static int rdt_get_tree(struct fs_context *fc) resctrl_mounted = true; if (is_mbm_enabled()) { - r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl; + r = rdt_l3_mon_resource; list_for_each_entry(dom, &r->domains, list) mbm_setup_overflow_handler(dom, MBM_OVERFLOW_INTERVAL, RESCTRL_PICK_ANY_CPU); @@ -4062,7 +4062,6 @@ static void clear_childcpus(struct rdtgroup *r, unsigned int cpu) void resctrl_offline_cpu(unsigned int cpu) { - struct rdt_resource *l3 = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl; struct rdtgroup *rdtgrp; struct rdt_domain *d; @@ -4074,10 +4073,10 @@ void resctrl_offline_cpu(unsigned int cpu) } } - if (!l3->mon_enabled) + if (!rdt_l3_mon_resource->mon_enabled) goto out_unlock; - d = get_domain_from_cpu(cpu, l3); + d = get_domain_from_cpu(cpu, rdt_l3_mon_resource); if (d) { if (is_mbm_enabled() && cpu == d->mbm_work_cpu) { cancel_delayed_work(&d->mbm_over); -- 2.44.0
| |