Hi Tony, On 2/28/2024 11:36 AM, Tony Luck wrote: > reset_all_ctrls() and resctrl_arch_update_domains() use on_each_cpu_mask() > to call rdt_ctrl_update() on potentially one CPU from each domain. > > But this means rdt_ctrl_update() needs to figure out which domain to > apply changes to. Doing so requires a search of all domains in a resource, > which can only be done safely if cpus_lock is held. Both callers do hold > this lock, but there isn't a way for a function called on another CPU > via IPI to verify this. > > Commit c0d848fcb09d ("x86/resctrl: Remove lockdep annotation that triggers > false positive") removed the incorrect assertions. > > Add the target domain to the msr_param structure and > call rdt_ctrl_update() for each domain separately using > smp_call_function_single(). This means that rdt_ctrl_update() doesn't > need to search for the domain and get_domain_from_cpu() can safely assert > that the cpus_lock is held since the remaining callers do not use IPI. > > Signed-off-by: Tony Luck <tony.luck@xxxxxxxxx> > --- ... > @@ -315,27 +300,27 @@ int resctrl_arch_update_domains(struct rdt_resource *r, u32 closid) > struct rdt_hw_domain *hw_dom; > struct msr_param msr_param; > enum resctrl_conf_type t; > - cpumask_var_t cpu_mask; > struct rdt_domain *d; > + int cpu; > u32 idx; > > /* Walking r->domains, ensure it can't race with cpuhp */ > lockdep_assert_cpus_held(); > > - if (!zalloc_cpumask_var(&cpu_mask, GFP_KERNEL)) > - return -ENOMEM; > - > - msr_param.res = NULL; > list_for_each_entry(d, &r->domains, list) { > hw_dom = resctrl_to_arch_dom(d); > + msr_param.res = NULL; > + msr_param.dom = d; > for (t = 0; t < CDP_NUM_TYPES; t++) { > cfg = &hw_dom->d_resctrl.staged_config[t]; > if (!cfg->have_new_ctrl) > continue; > > idx = get_config_index(closid, t); > - if (!apply_config(hw_dom, cfg, idx, cpu_mask)) > + if (cfg->new_ctrl == hw_dom->ctrl_val[idx]) > continue; > + hw_dom->ctrl_val[idx] = cfg->new_ctrl; > + cpu = cpumask_any(&d->cpu_mask); > cpu only needs to be assigned once. How about initializing cpu to nr_cpu_ids at the same time msr_param.res and msr_param.dom is initialized and only assign it when msr_param.res is assigned? I think that will be more robust. If you agree and do this then please feel free to add: Reviewed-by: Reinette Chatre <reinette.chatre@xxxxxxxxx> Reinette