[Linux-ia64] [PATCH] Use PAL_HALT_LIGHT in cpu_idle

From: Alex Williamson <alex_williamson_at_hp.com>
Date: 2003-03-15 09:14:58
   Here's patches for 2.4 & 2.5 to use PAL_HALT_LIGHT in cpu_idle.
This helps to reduce CPU temp a little on boxes with firmware that
takes advantage of this lower power state.  I've tried this on a
rx2600 (2x900MHz McKinley) and an i2000 (fw 117) and it shows some
benefit.  On McKinley systems, only the very latest PAL from Intel
actually reduces power consumption in the halt_light state.  For
HP rx2600/zx6000/zx2000, this means you need to be running firmware
1.82.

  Rohit Seth, at Intel, has run some benchmarks with this kind of
modification and found the effects of enabling halt_light to fall
within the noise of mosts tests.  I replaced pal_halt(1) in safe_halt
with pal_halt_light() since halt_light is required to be implemented,
but pal_halt(1) is an optional halt state.  I'd be interested to hear
of any measurements anyone does using this, where it works/fails, and
if any benchmarks/applications are impacted.  Thanks,

	Alex

--
Alex Williamson                             HP Linux & Open Source Lab
--- linux-2.4.20/Documentation/Configure.help~	Fri Mar 14 09:52:58 2003
+++ linux-2.4.20/Documentation/Configure.help	Fri Mar 14 09:53:50 2003
@@ -25479,6 +25479,14 @@
   Say Y here to enable machine check support for IA-64.  If you're
   unsure, answer Y.
 
+Use PAL_HALT_LIGHT in idle loop
+CONFIG_IA64_PAL_IDLE
+  Say Y here to enable use of PAL_HALT_LIGHT in the cpu_idle loop.
+  This allows the CPU to enter a low power state when idle.  You
+  can enable CONFIG_IA64_PALINFO and check /proc/pal/cpu0/power_info
+  to see the power consumption and latency for this state.  If you're
+  unsure your firmware supports it, answer N.
+
 Disable IA-64 Virtual Hash Page Table
 CONFIG_DISABLE_VHPT
   The Virtual Hash Page Table (VHPT) enhances virtual address
--- linux-2.4.20/arch/ia64/config.in~	Fri Mar 14 09:53:08 2003
+++ linux-2.4.20/arch/ia64/config.in	Fri Mar 14 11:00:36 2003
@@ -86,6 +86,7 @@
 
 define_bool CONFIG_KCORE_ELF y	# On IA-64, we always want an ELF /proc/kcore.
 
+bool 'Use PAL_HALT_LIGHT in idle loop' CONFIG_IA64_PAL_IDLE
 bool 'SMP support' CONFIG_SMP
 tristate 'Support running of Linux/x86 binaries' CONFIG_IA32_SUPPORT
 bool 'Performance monitor support' CONFIG_PERFMON
--- linux-2.4.20/arch/ia64/kernel/process.c~	Fri Mar 14 09:53:16 2003
+++ linux-2.4.20/arch/ia64/kernel/process.c	Fri Mar 14 14:49:02 2003
@@ -122,6 +122,15 @@
 		show_stack(0);
 }
 
+static void
+default_idle(void)
+{
+#ifdef CONFIG_IA64_PAL_IDLE
+	if (!current->need_resched)
+		safe_halt();
+#endif
+}
+
 void __attribute__((noreturn))
 cpu_idle (void *unused)
 {
@@ -132,6 +141,10 @@
 
 
 	while (1) {
+		void (*idle)(void) = pm_idle;
+		if (!idle)
+			idle = default_idle;
+
 #ifdef CONFIG_SMP
 		if (!current->need_resched)
 			min_xtp();
@@ -141,7 +154,7 @@
 #ifdef CONFIG_IA64_SGI_SN
 			snidle();
 #endif
-			continue;
+			idle();
 		}
 
 #ifdef CONFIG_IA64_SGI_SN
@@ -153,8 +166,6 @@
 #endif
 		schedule();
 		check_pgt_cache();
-		if (pm_idle)
-			(*pm_idle)();
 	}
 }
 
--- linux-2.4.20/include/asm-ia64/system.h~	Fri Mar 14 09:55:42 2003
+++ linux-2.4.20/include/asm-ia64/system.h	Fri Mar 14 10:11:01 2003
@@ -104,7 +104,7 @@
 #define set_mb(var, value)	do { (var) = (value); mb(); } while (0)
 #define set_wmb(var, value)	do { (var) = (value); mb(); } while (0)
 
-#define safe_halt()         ia64_pal_halt(1)                /* PAL_HALT */
+#define safe_halt()         ia64_pal_halt_light()    /* PAL_HALT_LIGHT */
 
 /*
  * The group barrier in front of the rsm & ssm are necessary to ensure

--- linux-2.5.64/arch/ia64/Kconfig~	Fri Mar 14 14:18:38 2003
+++ linux-2.5.64/arch/ia64/Kconfig	Fri Mar 14 14:55:58 2003
@@ -405,6 +405,15 @@
 
 endchoice
 
+config IA64_PAL_IDLE
+	bool "Use PAL_HALT_LIGHT in idle loop"
+	---help---
+	  Say Y here to enable use of PAL_HALT_LIGHT in the cpu_idle loop.
+	  This allows the CPU to enter a low power state when idle.  You
+	  can enable CONFIG_IA64_PALINFO and check /proc/pal/cpu0/power_info
+	  to see the power consumption and latency for this state.  If you're
+	  unsure your firmware supports it, answer N.
+
 config SMP
 	bool "SMP support"
 	---help---
--- linux-2.5.64/arch/ia64/kernel/process.c~	Fri Mar 14 14:25:24 2003
+++ linux-2.5.64/arch/ia64/kernel/process.c	Fri Mar 14 14:46:17 2003
@@ -169,7 +169,10 @@
 void
 default_idle (void)
 {
-	/* may want to do PAL_LIGHT_HALT here... */
+#ifdef CONFIG_IA64_PAL_IDLE
+	if (!need_resched())
+		safe_halt();
+#endif
 }
 
 void __attribute__((noreturn))
@@ -177,6 +180,10 @@
 {
 	/* endless idle loop with no priority at all */
 	while (1) {
+		void (*idle)(void) = pm_idle;
+		if (!idle)
+			idle = default_idle;
+
 #ifdef CONFIG_SMP
 		if (!need_resched())
 			min_xtp();
@@ -186,10 +193,7 @@
 #ifdef CONFIG_IA64_SGI_SN
 			snidle();
 #endif
-			if (pm_idle)
-				(*pm_idle)();
-			else
-				default_idle();
+			idle();
 		}
 
 #ifdef CONFIG_IA64_SGI_SN
--- linux-2.5.64/include/asm-ia64/system.h~	Fri Mar 14 10:55:23 2003
+++ linux-2.5.64/include/asm-ia64/system.h	Fri Mar 14 10:55:51 2003
@@ -108,7 +108,7 @@
 #define set_mb(var, value)	do { (var) = (value); mb(); } while (0)
 #define set_wmb(var, value)	do { (var) = (value); mb(); } while (0)
 
-#define safe_halt()         ia64_pal_halt(1)                /* PAL_HALT */
+#define safe_halt()         ia64_pal_halt_light()    /* PAL_HALT_LIGHT */
 
 /*
  * The group barrier in front of the rsm & ssm are necessary to ensure
Received on Fri Mar 14 14:20:04 2003

This archive was generated by hypermail 2.1.8 : 2005-08-02 09:20:12 EST