# HG changeset patch
# User root@xxxxxxxxxxxxxxxxxxxxx
# Date 1167640405 -19800
# Node ID 3aeb6af71f7bbc38cf0131840a21d0ee715123f1
# Parent  bec95280b565d0e9d6a58480ed17b0963f180e1b
Allow the kernel to use a poll mechanism when idle=poll is specified on the command line.
Signed-off-by: Amitabha Roy <amitabha.roy@xxxxxxxxx>

diff -r bec95280b565 -r 3aeb6af71f7b linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c	Fri Dec 01 11:54:53 2006 +0000
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c	Mon Jan 01 14:03:25 2007 +0530
@@ -101,7 +101,21 @@ void enable_hlt(void)
 
 EXPORT_SYMBOL(enable_hlt);
 
-/* XXX XEN doesn't use default_idle(), poll_idle(). Use xen_idle() instead. */
+/* Xen will use either  xen_idle() or poll_idle() */
+static void poll_idle(void)
+{
+	local_irq_enable();
+
+	asm volatile(
+		"2:"
+		"testl %0, %1;"
+		"rep; nop;"
+		"je 2b;"
+		: : "i"(_TIF_NEED_RESCHED), "m" (current_thread_info()->flags));
+}
+
+
+
 void xen_idle(void)
 {
 	local_irq_disable();
@@ -162,7 +176,7 @@ void cpu_idle(void)
 				play_dead();
 
 			__get_cpu_var(irq_stat).idle_timestamp = jiffies;
-			xen_idle();
+			pm_idle();
 		}
 		preempt_enable_no_resched();
 		schedule();
@@ -198,8 +212,23 @@ void cpu_idle_wait(void)
 }
 EXPORT_SYMBOL_GPL(cpu_idle_wait);
 
-/* XXX XEN doesn't use mwait_idle(), select_idle_routine(), idle_setup(). */
-/* Always use xen_idle() instead. */
+/* XEN does idle_setup() to decide if the kernel should poll or call into 
+ * the hypervisor when it has nothing else to do
+.*/
+
+static int __init idle_setup (char * str){
+  if(!strncmp(str,"poll",4)){
+    printk("Using polling idle threads. \n");
+    pm_idle=poll_idle;
+  }
+  else{
+    pm_idle=xen_idle;
+  }
+  return 1;
+}
+
+__setup("idle=", idle_setup);
+
 void __devinit select_idle_routine(const struct cpuinfo_x86 *c) {}
 
 void show_regs(struct pt_regs * regs)