x86, hotplug: Use mwait to offline a processor, fix the legacy case
authorH. Peter Anvin <hpa@linux.intel.com>
Fri, 17 Sep 2010 22:39:11 +0000 (15:39 -0700)
committerH. Peter Anvin <hpa@linux.intel.com>
Fri, 17 Sep 2010 22:39:11 +0000 (15:39 -0700)
commitea53069231f9317062910d6e772cca4ce93de8c8
tree0a78cf38c59c92114473925c74a3cf86ed1e543b
parentbc83cccc761953f878088cdfa682de0970b5561f
x86, hotplug: Use mwait to offline a processor, fix the legacy case

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: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Reviewed-by: Arjan 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>
arch/x86/include/asm/processor.h
arch/x86/kernel/smpboot.c