On Wed, Apr 03, 2024 at 08:51:09PM +0800, Dawei Li wrote: > For CONFIG_CPUMASK_OFFSTACK=y kernel, explicit allocation of cpumask > variable on stack is not recommended since it can cause potential stack > overflow. > > Instead, kernel code should always use *cpumask_var API(s) to allocate > cpumask var in config-neutral way, leaving allocation strategy to > CONFIG_CPUMASK_OFFSTACK. > > But dynamic allocation in cpuhp's teardown callback is somewhat problematic > for if allocation fails(which is unlikely but still possible): > - If -ENOMEM is returned to caller, kernel crashes for non-bringup > teardown; > - If callback pretends nothing happened and returns 0 to caller, it may > trap system into an in-consisitent/compromised state; > > Use newly-introduced cpumask_any_and_but() to address all issues above. > It eliminates usage of temporary cpumask var in generic way, no matter how > the cpumask var is allocated. > > Suggested-by: Mark Rutland <mark.rutland@xxxxxxx> > Signed-off-by: Dawei Li <dawei.li@xxxxxxxxxxxx> The logic looks good to me, but I'd like the commit message updated the same as per my comment on patch 2. With that commit message: Reviewed-by: Mark Rutland <mark.rutland@xxxxxxx> Mark. > --- > drivers/perf/thunderx2_pmu.c | 10 +++------- > 1 file changed, 3 insertions(+), 7 deletions(-) > > diff --git a/drivers/perf/thunderx2_pmu.c b/drivers/perf/thunderx2_pmu.c > index e16d10c763de..b3377b662ffc 100644 > --- a/drivers/perf/thunderx2_pmu.c > +++ b/drivers/perf/thunderx2_pmu.c > @@ -932,9 +932,8 @@ static int tx2_uncore_pmu_online_cpu(unsigned int cpu, > static int tx2_uncore_pmu_offline_cpu(unsigned int cpu, > struct hlist_node *hpnode) > { > - int new_cpu; > struct tx2_uncore_pmu *tx2_pmu; > - struct cpumask cpu_online_mask_temp; > + unsigned int new_cpu; > > tx2_pmu = hlist_entry_safe(hpnode, > struct tx2_uncore_pmu, hpnode); > @@ -945,11 +944,8 @@ static int tx2_uncore_pmu_offline_cpu(unsigned int cpu, > if (tx2_pmu->hrtimer_callback) > hrtimer_cancel(&tx2_pmu->hrtimer); > > - cpumask_copy(&cpu_online_mask_temp, cpu_online_mask); > - cpumask_clear_cpu(cpu, &cpu_online_mask_temp); > - new_cpu = cpumask_any_and( > - cpumask_of_node(tx2_pmu->node), > - &cpu_online_mask_temp); > + new_cpu = cpumask_any_and_but(cpumask_of_node(tx2_pmu->node), > + cpu_online_mask, cpu); > > tx2_pmu->cpu = new_cpu; > if (new_cpu >= nr_cpu_ids) > -- > 2.27.0 >