# HG changeset patch # User root@xxxxxxxxxxxxxxxxxxxxx # Date 1167751141 -19800 # Node ID 7b571c2e65eb86e73f7a2c8cb67e8acb2d129d82 # Parent 711c31232d71608fe4ea9f4f22ca2620d3faf8ff Added support for idle=poll kernel option. Signed-off-by: Amitabha Roy diff -r 711c31232d71 -r 7b571c2e65eb linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c --- a/linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c Tue Jan 02 10:57:50 2007 +0000 +++ b/linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c Tue Jan 02 20:49:01 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,9 +212,28 @@ 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. */ -void __devinit select_idle_routine(const struct cpuinfo_x86 *c) {} +/* 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) { + if(!pm_idle){ + pm_idle=xen_idle; + } +} void show_regs(struct pt_regs * regs) { diff -r 711c31232d71 -r 7b571c2e65eb linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c --- a/linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c Tue Jan 02 10:57:50 2007 +0000 +++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c Tue Jan 02 20:49:01 2007 +0530 @@ -119,7 +119,22 @@ void exit_idle(void) __exit_idle(); } -/* 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(); @@ -171,7 +186,7 @@ void cpu_idle (void) if (cpu_is_offline(smp_processor_id())) play_dead(); enter_idle(); - xen_idle(); + pm_idle(); __exit_idle(); } @@ -210,9 +225,28 @@ 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. */ -void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) {} +void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) +{ + if (!pm_idle){ + pm_idle=xen_idle; + } +} + +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); + /* Prints also some state that isn't saved in the pt_regs */ void __show_regs(struct pt_regs * regs)