* Arun R Bharadwaj <a...@linux.vnet.ibm.com> [2009-10-08 15:18:28]:

This patch removes the routines, pseries_shared_idle_sleep and
pseries_dedicated_idle_sleep, since this is implemented as a part
of arch/powerpc/platform/pseries/processor_idle.c

Also, similar to x86, call cpuidle_idle_call from cpu_idle() idle
loop instead of ppc_md.power_save.


Signed-off-by: Arun R Bharadwaj <a...@linux.vnet.ibm.com>
---
 arch/powerpc/kernel/idle.c             |   50 +++++++-----------
 arch/powerpc/platforms/pseries/setup.c |   89 ---------------------------------
 2 files changed, 22 insertions(+), 117 deletions(-)

Index: linux.trees.git/arch/powerpc/platforms/pseries/setup.c
===================================================================
--- linux.trees.git.orig/arch/powerpc/platforms/pseries/setup.c
+++ linux.trees.git/arch/powerpc/platforms/pseries/setup.c
@@ -75,9 +75,6 @@ EXPORT_SYMBOL(CMO_PageSize);
 
 int fwnmi_active;  /* TRUE if an FWNMI handler is present */
 
-static void pseries_shared_idle_sleep(void);
-static void pseries_dedicated_idle_sleep(void);
-
 static struct device_node *pSeries_mpic_node;
 
 static void pSeries_show_cpuinfo(struct seq_file *m)
@@ -297,18 +294,8 @@ static void __init pSeries_setup_arch(vo
        pSeries_nvram_init();
 
        /* Choose an idle loop */
-       if (firmware_has_feature(FW_FEATURE_SPLPAR)) {
+       if (firmware_has_feature(FW_FEATURE_SPLPAR))
                vpa_init(boot_cpuid);
-               if (get_lppaca()->shared_proc) {
-                       printk(KERN_DEBUG "Using shared processor idle loop\n");
-                       ppc_md.power_save = pseries_shared_idle_sleep;
-               } else {
-                       printk(KERN_DEBUG "Using dedicated idle loop\n");
-                       ppc_md.power_save = pseries_dedicated_idle_sleep;
-               }
-       } else {
-               printk(KERN_DEBUG "Using default idle loop\n");
-       }
 
        if (firmware_has_feature(FW_FEATURE_LPAR))
                ppc_md.enable_pmcs = pseries_lpar_enable_pmcs;
@@ -496,80 +483,6 @@ static int __init pSeries_probe(void)
        return 1;
 }
 
-
-DECLARE_PER_CPU(unsigned long, smt_snooze_delay);
-
-static void pseries_dedicated_idle_sleep(void)
-{ 
-       unsigned int cpu = smp_processor_id();
-       unsigned long start_snooze;
-       unsigned long in_purr, out_purr;
-
-       /*
-        * Indicate to the HV that we are idle. Now would be
-        * a good time to find other work to dispatch.
-        */
-       get_lppaca()->idle = 1;
-       get_lppaca()->donate_dedicated_cpu = 1;
-       in_purr = mfspr(SPRN_PURR);
-
-       /*
-        * We come in with interrupts disabled, and need_resched()
-        * has been checked recently.  If we should poll for a little
-        * while, do so.
-        */
-       if (__get_cpu_var(smt_snooze_delay)) {
-               start_snooze = get_tb() +
-                       __get_cpu_var(smt_snooze_delay) * tb_ticks_per_usec;
-               local_irq_enable();
-               set_thread_flag(TIF_POLLING_NRFLAG);
-
-               while (get_tb() < start_snooze) {
-                       if (need_resched() || cpu_is_offline(cpu))
-                               goto out;
-                       ppc64_runlatch_off();
-                       HMT_low();
-                       HMT_very_low();
-               }
-
-               HMT_medium();
-               clear_thread_flag(TIF_POLLING_NRFLAG);
-               smp_mb();
-               local_irq_disable();
-               if (need_resched() || cpu_is_offline(cpu))
-                       goto out;
-       }
-
-       cede_processor();
-
-out:
-       HMT_medium();
-       out_purr = mfspr(SPRN_PURR);
-       get_lppaca()->wait_state_cycles += out_purr - in_purr;
-       get_lppaca()->donate_dedicated_cpu = 0;
-       get_lppaca()->idle = 0;
-}
-
-static void pseries_shared_idle_sleep(void)
-{
-       /*
-        * Indicate to the HV that we are idle. Now would be
-        * a good time to find other work to dispatch.
-        */
-       get_lppaca()->idle = 1;
-
-       /*
-        * Yield the processor to the hypervisor.  We return if
-        * an external interrupt occurs (which are driven prior
-        * to returning here) or if a prod occurs from another
-        * processor. When returning here, external interrupts
-        * are enabled.
-        */
-       cede_processor();
-
-       get_lppaca()->idle = 0;
-}
-
 static int pSeries_pci_probe_mode(struct pci_bus *bus)
 {
        if (firmware_has_feature(FW_FEATURE_LPAR))
Index: linux.trees.git/arch/powerpc/kernel/idle.c
===================================================================
--- linux.trees.git.orig/arch/powerpc/kernel/idle.c
+++ linux.trees.git/arch/powerpc/kernel/idle.c
@@ -25,6 +25,7 @@
 #include <linux/cpu.h>
 #include <linux/sysctl.h>
 #include <linux/tick.h>
+#include <linux/cpuidle.h>
 
 #include <asm/system.h>
 #include <asm/processor.h>
@@ -60,35 +61,26 @@ void cpu_idle(void)
                while (!need_resched() && !cpu_should_die()) {
                        ppc64_runlatch_off();
 
-                       if (ppc_md.power_save) {
-                               clear_thread_flag(TIF_POLLING_NRFLAG);
-                               /*
-                                * smp_mb is so clearing of TIF_POLLING_NRFLAG
-                                * is ordered w.r.t. need_resched() test.
-                                */
-                               smp_mb();
-                               local_irq_disable();
-
-                               /* Don't trace irqs off for idle */
-                               stop_critical_timings();
-
-                               /* check again after disabling irqs */
-                               if (!need_resched() && !cpu_should_die())
-                                       ppc_md.power_save();
-
-                               start_critical_timings();
-
-                               local_irq_enable();
-                               set_thread_flag(TIF_POLLING_NRFLAG);
-
-                       } else {
-                               /*
-                                * Go into low thread priority and possibly
-                                * low power mode.
-                                */
-                               HMT_low();
-                               HMT_very_low();
-                       }
+                       clear_thread_flag(TIF_POLLING_NRFLAG);
+                       /*
+                        * smp_mb is so clearing of TIF_POLLING_NRFLAG
+                        * is ordered w.r.t. need_resched() test.
+                        */
+                       smp_mb();
+                       local_irq_disable();
+
+                       /* Don't trace irqs off for idle */
+                       stop_critical_timings();
+
+                       /* check again after disabling irqs */
+                       if (!need_resched() && !cpu_should_die())
+                               cpuidle_idle_call();
+
+                       start_critical_timings();
+
+                       local_irq_enable();
+                       set_thread_flag(TIF_POLLING_NRFLAG);
+
                }
 
                HMT_medium();
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to