lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Wed, 22 May 2019 12:15:37 +0100 From: Andrew Murray <andrew.murray@....com> To: peterz@...radead.org, Thomas Gleixner <tglx@...utronix.de> Cc: Rik van Riel <riel@...riel.com>, linux-kernel@...r.kernel.org Subject: [PATCH] smp,cpumask: Don't call functions on offline CPUs 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@....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
Powered by blists - more mailing lists