Messages in this thread | | | Date | Mon, 8 Apr 2024 20:19:40 -0700 | Subject | Re: [PATCH v1 13/31] x86/resctrl: Stop using the for_each_*_rdt_resource() walkers | From | Reinette Chatre <> |
| |
Hi James,
On 3/21/2024 9:50 AM, James Morse wrote: > The for_each_*_rdt_resource() helpers walk the architectures array
architecture's ?
> of structures, using the resctrl visible part as an iterator. These > became over-complex when the structures were split into a > filesystem and architecture-specific struct. This approach avoided > the need to touch every call site. > > Once the filesystem parts of resctrl are moved to /fs/, both the > architecture's resource array, and the definition of those structures > is no longer accessible. To support resctrl, each architecture would > have to provide equally complex macros. > > Change the resctrl code that uses these to walk through the resource_level > enum and check the mon/alloc capable flags instead. Instances in core.c, > and resctrl_arch_reset_resources() remain part of x86's architecture > specific code. > > Signed-off-by: James Morse <james.morse@arm.com> > --- > arch/x86/kernel/cpu/resctrl/pseudo_lock.c | 7 +++++- > arch/x86/kernel/cpu/resctrl/rdtgroup.c | 30 +++++++++++++++++++---- > 2 files changed, 31 insertions(+), 6 deletions(-) > > diff --git a/arch/x86/kernel/cpu/resctrl/pseudo_lock.c b/arch/x86/kernel/cpu/resctrl/pseudo_lock.c > index 884b88e25141..f2315a50ea4f 100644 > --- a/arch/x86/kernel/cpu/resctrl/pseudo_lock.c > +++ b/arch/x86/kernel/cpu/resctrl/pseudo_lock.c > @@ -840,6 +840,7 @@ bool rdtgroup_cbm_overlaps_pseudo_locked(struct rdt_domain *d, unsigned long cbm > bool rdtgroup_pseudo_locked_in_hierarchy(struct rdt_domain *d) > { > cpumask_var_t cpu_with_psl; > + enum resctrl_res_level i; > struct rdt_resource *r; > struct rdt_domain *d_i; > bool ret = false; > @@ -854,7 +855,11 @@ bool rdtgroup_pseudo_locked_in_hierarchy(struct rdt_domain *d) > * First determine which cpus have pseudo-locked regions > * associated with them. > */ > - for_each_alloc_capable_rdt_resource(r) { > + for (i = 0; i < RDT_NUM_RESOURCES; i++) { > + r = resctrl_arch_get_resource(i); > + if (!r->alloc_capable) > + continue; > + > list_for_each_entry(d_i, &r->domains, list) { > if (d_i->plr) > cpumask_or(cpu_with_psl, cpu_with_psl, > diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > index e736e4d20f63..3f16e7854411 100644 > --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c > +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > @@ -98,12 +98,17 @@ void rdt_last_cmd_printf(const char *fmt, ...) > > void rdt_staged_configs_clear(void) > { > + enum resctrl_res_level i; > struct rdt_resource *r; > struct rdt_domain *dom; > > lockdep_assert_held(&rdtgroup_mutex); > > - for_each_alloc_capable_rdt_resource(r) { > + for (i = 0; i < RDT_NUM_RESOURCES; i++) { > + r = resctrl_arch_get_resource(i); > + if (!r->alloc_capable) > + continue; > + > list_for_each_entry(dom, &r->domains, list) > memset(dom->staged_config, 0, sizeof(dom->staged_config)); > } > @@ -2181,6 +2186,7 @@ static int rdtgroup_mkdir_info_resdir(void *priv, char *name, > > static int rdtgroup_create_info_dir(struct kernfs_node *parent_kn) > { > + enum resctrl_res_level i; > struct resctrl_schema *s; > struct rdt_resource *r; > unsigned long fflags; > @@ -2205,8 +2211,12 @@ static int rdtgroup_create_info_dir(struct kernfs_node *parent_kn) > goto out_destroy; > } > > - for_each_mon_capable_rdt_resource(r) { > - fflags = r->fflags | RFTYPE_MON_INFO; > + for (i = 0; i < RDT_NUM_RESOURCES; i++) { > + r = resctrl_arch_get_resource(i); > + if (!r->mon_capable) > + continue; > + > + fflags = r->fflags | RFTYPE_MON_INFO;
Please check spacing.
> sprintf(name, "%s_MON", r->name); > ret = rdtgroup_mkdir_info_resdir(r, name, fflags); > if (ret) > @@ -2615,10 +2625,15 @@ static int schemata_list_add(struct rdt_resource *r, enum resctrl_conf_type type > > static int schemata_list_create(void) > { > + enum resctrl_res_level i; > struct rdt_resource *r; > int ret = 0; > > - for_each_alloc_capable_rdt_resource(r) { > + for (i = 0; i < RDT_NUM_RESOURCES; i++) { > + r = resctrl_arch_get_resource(i); > + if (!r->alloc_capable) > + continue; > + > if (resctrl_arch_get_cdp_enabled(r->rid)) { > ret = schemata_list_add(r, CDP_CODE); > if (ret) > @@ -3166,6 +3181,7 @@ static int mkdir_mondata_all(struct kernfs_node *parent_kn, > struct rdtgroup *prgrp, > struct kernfs_node **dest_kn) > { > + enum resctrl_res_level i; > struct rdt_resource *r; > struct kernfs_node *kn; > int ret; > @@ -3184,7 +3200,11 @@ static int mkdir_mondata_all(struct kernfs_node *parent_kn, > * Create the subdirectories for each domain. Note that all events > * in a domain like L3 are grouped into a resource whose domain is L3 > */ > - for_each_mon_capable_rdt_resource(r) { > + for (i = 0; i < RDT_NUM_RESOURCES; i++) { > + r = resctrl_arch_get_resource(i); > + if (!r->mon_capable) > + continue; > + > ret = mkdir_mondata_subdir_alldom(kn, r, prgrp); > if (ret) > goto out_destroy;
Reinette
| |