smp: Process pending softirqs in flush_smp_call_function_from_idle()
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Sat, 23 Jan 2021 20:10:25 +0000 (21:10 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 4 Mar 2021 10:37:51 +0000 (11:37 +0100)
[ Upstream commit 66040b2d5d41f85cb1a752a75260595344c5ec3b ]

send_call_function_single_ipi() may wake an idle CPU without sending an
IPI. The woken up CPU will process the SMP-functions in
flush_smp_call_function_from_idle(). Any raised softirq from within the
SMP-function call will not be processed.
Should the CPU have no tasks assigned, then it will go back to idle with
pending softirqs and the NOHZ will rightfully complain.

Process pending softirqs on return from flush_smp_call_function_queue().

Fixes: b2a02fc43a1f4 ("smp: Optimize send_call_function_single_ipi()")
Reported-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20210123201027.3262800-2-bigeasy@linutronix.de
Signed-off-by: Sasha Levin <sashal@kernel.org>
kernel/smp.c

index 4d17501433be7fe2a3c70f889dc9c40a4ddc857b..25240fb2df949221221454013af102ca1ac8c78c 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/export.h>
 #include <linux/percpu.h>
 #include <linux/init.h>
+#include <linux/interrupt.h>
 #include <linux/gfp.h>
 #include <linux/smp.h>
 #include <linux/cpu.h>
@@ -449,6 +450,9 @@ void flush_smp_call_function_from_idle(void)
 
        local_irq_save(flags);
        flush_smp_call_function_queue(true);
+       if (local_softirq_pending())
+               do_softirq();
+
        local_irq_restore(flags);
 }