Messages in this thread Patch in this message | | | From | Andrew Murray <> | Subject | [PATCH] smp,cpumask: Don't call functions on offline CPUs | Date | Wed, 22 May 2019 12:15:37 +0100 |
| |
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.
Signed-off-by: Andrew Murray <andrew.murray@arm.com> --- kernel/smp.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/kernel/smp.c b/kernel/smp.c index f4cf1b0bb3b8..10970692f1c0 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -259,6 +259,7 @@ static void flush_smp_call_function_queue(bool warn_cpu_offline) /* * smp_call_function_single - Run a function on a specific CPU + * @cpu: The CPU to run on. * @func: The function to run. This must be fast and non-blocking. * @info: An arbitrary pointer to pass to the function. * @wait: If true, wait until function has completed on other CPUs. @@ -657,6 +658,8 @@ EXPORT_SYMBOL(on_each_cpu_mask); * completed on other CPUs. * @gfp_flags: GFP flags to use when allocating the cpumask * used internally by the function. + * @mask: The set of cpus to run on (only runs on online + subset). * * The function might sleep if the GFP flags indicates a non * atomic allocation is allowed. @@ -690,12 +693,13 @@ void on_each_cpu_cond_mask(bool (*cond_func)(int cpu, void *info), * just have to IPI them one by one. */ preempt_disable(); - for_each_cpu(cpu, mask) - if (cond_func(cpu, info)) { + for_each_cpu(cpu, mask) { + if (cpu_online(cpu) && cond_func(cpu, info)) { ret = smp_call_function_single(cpu, func, info, wait); WARN_ON_ONCE(ret); } + } preempt_enable(); } } -- 2.21.0
| |