Re: [RFC PATCH V1 4/7] cpuidle: (powerpc) Add cpu_idle_wait() to allow switching idle routines
From: Trinabh Gupta <hidden>
Date: 2011-06-21 06:00:51
Also in:
lkml
On 06/17/2011 10:02 AM, Benjamin Herrenschmidt wrote:
On Tue, 2011-06-07 at 22:00 +0530, Trinabh Gupta wrote:quoted
diff --git a/arch/powerpc/kernel/idle.c b/arch/powerpc/kernel/idle.c index 39a2baa..932392b 100644 --- a/arch/powerpc/kernel/idle.c +++ b/arch/powerpc/kernel/idle.c@@ -102,6 +102,24 @@ void cpu_idle(void) } } +static void do_nothing(void *unused) +{ +} + +/* + * cpu_idle_wait - Used to ensure that all the CPUs come out of the old + * idle loop and start using the new idle loop. + * Required while changing idle handler on SMP systems. + * Caller must have changed idle handler to the new value before the call. + */ +void cpu_idle_wait(void) +{ + smp_mb(); + /* kick all the CPUs so that they exit out of old idle routine */ + smp_call_function(do_nothing, NULL, 1); +} +EXPORT_SYMBOL_GPL(cpu_idle_wait); + int powersave_nap; #ifdef CONFIG_SYSCTLThis is gross :-)
Well this is what exists today for x86; so didn't think too much into this. Maybe there is cleaner way. The requirement is to completely exit the idle loop and call cpuidle_idle_call() again. I think sending reschedule may be enough. With respect to current implementation the arch-independent cpuidle code needs a cpu_idle_wait() function for any architecture where CONFIG_SMP is defined. This cpu_idle_wait function is called whenever we have to pause usage of cpuidle; to switch driver or governor etc. So maybe there is a cleaner implementation of cpu_idle_wait instead of smp_call_function(do_nothing...); sending reschedule may work. Thanks -Trinabh
Do you need to absolutely ensure the idle task has changed or just kicking it with a send reschedule is enough ?
Cheers, Ben.