On Fri, Aug 15, 2014 at 12:01 AM, Chuansheng Liu <[email protected]> wrote: > 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.
kick_all_cpus_sync has other callers, and those other callers want the old behavior. I think this should be a new function. --Andy > > 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 > -- Andy Lutomirski AMA Capital Management, LLC -- 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/

