Message ID | 1408086085-16691-2-git-send-email-chuansheng.liu@intel.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
On Fri, Aug 15, 2014 at 12:01 AM, Chuansheng Liu <chuansheng.liu@intel.com> 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 <chuansheng.liu@intel.com> > --- > 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 >
Hello Andy, > -----Original Message----- > From: Andy Lutomirski [mailto:luto@amacapital.net] > Sent: Friday, August 15, 2014 11:41 PM > To: Liu, Chuansheng > Cc: Peter Zijlstra; Daniel Lezcano; Rafael J. Wysocki; Ingo Molnar; > linux-pm@vger.kernel.org; linux-kernel@vger.kernel.org; Liu, Changcheng; > Wang, Xiaoming; Chakravarty, Souvik K > Subject: Re: [PATCH 2/3] smp: re-implement the kick_all_cpus_sync() with > wake_up_if_idle() > > On Fri, Aug 15, 2014 at 12:01 AM, Chuansheng Liu > <chuansheng.liu@intel.com> 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. > Yes, seems some current users of kick_all_cpus_sync() need IPI indeed, will try to send out patch V2 with one new function.
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);
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 <chuansheng.liu@intel.com> --- kernel/smp.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)