Currently using smp_call_function() just woke up the corresponding cpu, but can not break the polling idle loop.
Here using the new sched API wake_up_if_idle() to implement it. Signed-off-by: Chuansheng Liu <[email protected]> --- kernel/smp.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/kernel/smp.c b/kernel/smp.c index aff8aa1..0b647c3 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -13,6 +13,7 @@ #include <linux/gfp.h> #include <linux/smp.h> #include <linux/cpu.h> +#include <linux/sched.h> #include "smpboot.h" @@ -677,10 +678,6 @@ void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info), } EXPORT_SYMBOL(on_each_cpu_cond); -static void do_nothing(void *unused) -{ -} - /** * kick_all_cpus_sync - Force all cpus out of idle * @@ -694,8 +691,15 @@ static void do_nothing(void *unused) */ void kick_all_cpus_sync(void) { - /* Make sure the change is visible before we kick the cpus */ - smp_mb(); - smp_call_function(do_nothing, NULL, 1); + int cpu; + + preempt_disable(); + for_each_online_cpu(cpu) { + if (cpu == smp_processor_id()) + continue; + + wake_up_if_idle(cpu); + } + preempt_enable(); } EXPORT_SYMBOL_GPL(kick_all_cpus_sync); -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

