summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYazen Ghannam <yazen.ghannam@amd.com>2018-04-03 09:02:28 -0500
committerBen Hutchings <ben@decadent.org.uk>2018-10-21 08:45:45 +0100
commit7c7a0627b27cfb0e638cf03d15dcd8f7fa01df06 (patch)
tree29bf843807d54fb78f6eb4ce9be2d637a35f4557
parent6143a3c2ba64d5f88860279fc050b90901ddf283 (diff)
downloadlinux-stable-7c7a0627b27cfb0e638cf03d15dcd8f7fa01df06.tar.gz
linux-stable-7c7a0627b27cfb0e638cf03d15dcd8f7fa01df06.tar.bz2
linux-stable-7c7a0627b27cfb0e638cf03d15dcd8f7fa01df06.zip
x86/smpboot: Don't use mwait_play_dead() on AMD systems
commit da6fa7ef67f07108a1b0cb9fd9e7fcaabd39c051 upstream. Recent AMD systems support using MWAIT for C1 state. However, MWAIT will not allow deeper cstates than C1 on current systems. play_dead() expects to use the deepest state available. The deepest state available on AMD systems is reached through SystemIO or HALT. If MWAIT is available, it is preferred over the other methods, so the CPU never reaches the deepest possible state. Don't try to use MWAIT to play_dead() on AMD systems. Instead, use CPUIDLE to enter the deepest state advertised by firmware. If CPUIDLE is not available then fallback to HALT. Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Borislav Petkov <bp@suse.de> Cc: Yazen Ghannam <Yazen.Ghannam@amd.com> Link: https://lkml.kernel.org/r/20180403140228.58540-1-Yazen.Ghannam@amd.com Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r--arch/x86/kernel/smpboot.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 93ffaccb2f48..f59310ac3261 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -1397,6 +1397,8 @@ static inline void mwait_play_dead(void)
void *mwait_ptr;
int i;
+ if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
+ return;
if (!this_cpu_has(X86_FEATURE_MWAIT))
return;
if (!this_cpu_has(X86_FEATURE_CLFLUSH))