]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/ppc/kernel/idle.c
Pull altix-ce1.0-asic into release branch
[linux-2.6-omap-h63xx.git] / arch / ppc / kernel / idle.c
index fba29c876b62ab843d06e308ef2590c9f3999f85..1be3ca5bae4009026616423ef88dc623eccfce57 100644 (file)
 #include <asm/cache.h>
 #include <asm/cputable.h>
 #include <asm/machdep.h>
+#include <asm/smp.h>
 
 void default_idle(void)
 {
        void (*powersave)(void);
-       int cpu = smp_processor_id();
 
        powersave = ppc_md.power_save;
 
@@ -46,16 +46,13 @@ void default_idle(void)
 #ifdef CONFIG_SMP
                else {
                        set_thread_flag(TIF_POLLING_NRFLAG);
-                       while (!need_resched() && !cpu_is_offline(cpu))
+                       while (!need_resched() &&
+                                       !cpu_is_offline(smp_processor_id()))
                                barrier();
                        clear_thread_flag(TIF_POLLING_NRFLAG);
                }
 #endif
        }
-       if (need_resched())
-               schedule();
-       if (cpu_is_offline(cpu) && system_state == SYSTEM_RUNNING)
-               cpu_die();
 }
 
 /*
@@ -63,18 +60,29 @@ void default_idle(void)
  */
 void cpu_idle(void)
 {
-       for (;;)
-               if (ppc_md.idle != NULL)
-                       ppc_md.idle();
-               else
-                       default_idle();
+       int cpu = smp_processor_id();
+
+       for (;;) {
+               while (!need_resched()) {
+                       if (ppc_md.idle != NULL)
+                               ppc_md.idle();
+                       else
+                               default_idle();
+               }
+
+               if (cpu_is_offline(cpu) && system_state == SYSTEM_RUNNING)
+                       cpu_die();
+               preempt_enable_no_resched();
+               schedule();
+               preempt_disable();
+       }
 }
 
 #if defined(CONFIG_SYSCTL) && defined(CONFIG_6xx)
 /*
  * Register the sysctl to set/clear powersave_nap.
  */
-extern unsigned long powersave_nap;
+extern int powersave_nap;
 
 static ctl_table powersave_nap_ctl_table[]={
        {