aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Gleixner <[email protected]>2015-01-14 18:31:33 +0100
committerThomas Gleixner <[email protected]>2015-01-15 11:24:22 +0100
commitf7ccadac2d3fe373d14a5917c86c499770ebbffc (patch)
tree0af9fc8a597e065f05cb6b3ebd17e7516bb12296
parente3a981d61d156c1a9ea0aac253d2d3f33c081906 (diff)
x86/apic: Clear stale x2apic mode
If x2apic got disabled on the kernel command line, then the following issue can happen: enable_IR_x2apic() .... x2apic_mode = 1; enable_x2apic(); if (x2apic_disabled) { __disable_x2apic(); return; } That leaves X2APIC disabled in hardware, but x2apic_mode stays 1. So all other code which checks x2apic_mode gets the wrong information. Set x2apic_mode to 0 after disabling it in hardware. This is just a hotfix. The proper solution is to rework this code so it has seperate functions for the initial setup on the boot processor and the secondary cpus, but that's beyond the scope of this fix. Signed-off-by: Thomas Gleixner <[email protected]> Cc: Jiang Liu <[email protected]> Cc: Tony Luck <[email protected]> Cc: [email protected] Cc: H. Peter Anvin <[email protected]> Cc: Joerg Roedel <[email protected]> Cc: Benjamin Herrenschmidt <[email protected]> Cc: Yinghai Lu <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: David Rientjes <[email protected]> Cc: HATAYAMA Daisuke <[email protected]> Cc: Jan Beulich <[email protected]> Cc: Richard Weinberger <[email protected]> Cc: Oren Twaig <[email protected]>
-rw-r--r--arch/x86/kernel/apic/apic.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index 141f1031013d..8a81a681836e 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -1559,6 +1559,7 @@ void enable_x2apic(void)
rdmsrl(MSR_IA32_APICBASE, msr);
if (x2apic_disabled) {
__disable_x2apic(msr);
+ x2apic_mode = 0;
return;
}