Messages in this thread Patch in this message | | | Date | Wed, 22 May 2019 16:09:21 +0200 | From | Peter Zijlstra <> | Subject | Re: [PATCH] smp,cpumask: Don't call functions on offline CPUs |
| |
On Wed, May 22, 2019 at 12:15:37PM +0100, Andrew Murray wrote: > When we are able to allocate a cpumask in on_each_cpu_cond_mask > we call functions with on_each_cpu_mask - this masks out offline > cpus via smp_call_function_many. > > However when we fail to allocate a cpumask in on_each_cpu_cond_mask > we call functions with smp_call_function_single - this will return > -ENXIO from generic_exec_single if a CPU is offline which will > result in a WARN_ON_ONCE. > > Let's avoid the WARN by only calling smp_call_function_single when > the CPU is online and thus making both paths consistent with each > other.
I'm confused, why are you feeding it offline CPUs to begin with? @mask shouldn't include them.
Is perhaps the problem that on_each_cpu_cond() uses cpu_onlne_mask without protection?
Something like so?
diff --git a/kernel/smp.c b/kernel/smp.c index f4cf1b0bb3b8..a493b3dfa67f 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -705,8 +707,10 @@ void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info), smp_call_func_t func, void *info, bool wait, gfp_t gfp_flags) { + cpus_read_lock(); on_each_cpu_cond_mask(cond_func, func, info, wait, gfp_flags, cpu_online_mask); + cpus_read_unlock(); } EXPORT_SYMBOL(on_each_cpu_cond);
| |