• H. Peter Anvin's avatar
    x86, hotplug: Use mwait to offline a processor, fix the legacy case · ea530692
    H. Peter Anvin authored
    The code in native_play_dead() has a number of problems:
    
    1. We should use MWAIT when available, to put ourselves into a deeper
       sleep state.
    2. We use the existence of CLFLUSH to determine if WBINVD is safe, but
       that is totally bogus -- WBINVD is 486+, whereas CLFLUSH is a much
       later addition.
    3. We should do WBINVD inside the loop, just in case of something like
       setting an A bit on page tables.  Pointed out by Arjan van de Ven.
    
    This code is based in part of a previous patch by Venki Pallipadi, but
    unlike that patch this one keeps all the detection code local instead
    of pre-caching a bunch of information.  We're shutting down the CPU;
    there is absolutely no hurry.
    
    This patch moves all the code to C and deletes the global
    wbinvd_halt() which is broken anyway.
    Originally-by: default avatarVenkatesh Pallipadi <venkatesh.pallipadi@intel.com>
    Signed-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
    Reviewed-by: default avatarArjan van de Ven <arjan@linux.intel.com>
    Cc: Len Brown <lenb@kernel.org>
    Cc: Venkatesh Pallipadi <venki@google.com>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.hl>
    LKML-Reference: <20090522232230.162239000@intel.com>
    ea530692
smpboot.c 35.5 KB