[lkml]   [2011]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[33/53] xen/pm_idle: Make pm_idle be default_idle under Xen.
    3.1-stable review patch.  If anyone has any objections, please let me know.


    From: Konrad Rzeszutek Wilk <>

    commit e5fd47bfab2df0c2184cc0bf4245d8e1bb7724fb upstream.

    The idea behind commit d91ee5863b71 ("cpuidle: replace xen access to x86
    pm_idle and default_idle") was to have one call - disable_cpuidle()
    which would make pm_idle not be molested by other code. It disallows
    cpuidle_idle_call to be set to pm_idle (which is excellent).

    But in the select_idle_routine() and idle_setup(), the pm_idle can still
    be set to either: amd_e400_idle, mwait_idle or default_idle. This
    depends on some CPU flags (MWAIT) and in AMD case on the type of CPU.

    In case of mwait_idle we can hit some instances where the hypervisor
    (Amazon EC2 specifically) sets the MWAIT and we get:

    Brought up 2 CPUs
    invalid opcode: 0000 [#1] SMP

    Pid: 0, comm: swapper Not tainted 3.1.0-0.rc6.git0.3.fc16.x86_64 #1
    RIP: e030:[<ffffffff81015d1d>] [<ffffffff81015d1d>] mwait_idle+0x6f/0xb4
    Call Trace:
    [<ffffffff8100e2ed>] cpu_idle+0xae/0xe8
    [<ffffffff8149ee78>] cpu_bringup_and_idle+0xe/0x10
    RIP [<ffffffff81015d1d>] mwait_idle+0x6f/0xb4
    RSP <ffff8801d28ddf10>

    In the case of amd_e400_idle we don't get so spectacular crashes, but we
    do end up making an MSR which is trapped in the hypervisor, and then
    follow it up with a yield hypercall. Meaning we end up going to
    hypervisor twice instead of just once.

    The previous behavior before v3.0 was that pm_idle was set to
    default_idle regardless of select_idle_routine/idle_setup.

    We want to do that, but only for one specific case: Xen. This patch
    does that.

    Fixes RH BZ #739499 and Ubuntu #881076
    Reported-by: Stefan Bader <>
    Signed-off-by: Konrad Rzeszutek Wilk <>
    Signed-off-by: Linus Torvalds <>
    Signed-off-by: Greg Kroah-Hartman <>

    arch/x86/include/asm/system.h | 1 +
    arch/x86/kernel/process.c | 8 ++++++++
    arch/x86/xen/setup.c | 2 +-
    3 files changed, 10 insertions(+), 1 deletion(-)

    --- a/arch/x86/include/asm/system.h
    +++ b/arch/x86/include/asm/system.h
    @@ -401,6 +401,7 @@ extern unsigned long arch_align_stack(un
    extern void free_init_pages(char *what, unsigned long begin, unsigned long end);

    void default_idle(void);
    +bool set_pm_idle_to_default(void);

    void stop_this_cpu(void *dummy);

    --- a/arch/x86/kernel/process.c
    +++ b/arch/x86/kernel/process.c
    @@ -403,6 +403,14 @@ void default_idle(void)

    +bool set_pm_idle_to_default(void)
    + bool ret = !!pm_idle;
    + pm_idle = default_idle;
    + return ret;
    void stop_this_cpu(void *dummy)
    --- a/arch/x86/xen/setup.c
    +++ b/arch/x86/xen/setup.c
    @@ -448,6 +448,6 @@ void __init xen_arch_setup(void)
    boot_option_idle_override = IDLE_HALT;
    + WARN_ON(set_pm_idle_to_default());

     \ /
      Last update: 2011-12-16 20:55    [W:0.022 / U:0.512 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site