aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFenghua Yu <fenghua.yu@intel.com>2013-10-23 21:30:12 -0400
committerIngo Molnar <mingo@kernel.org>2013-11-07 04:12:37 -0500
commit522e66464467543c0d88d023336eec4df03ad40b (patch)
treec71b6dafc9aefc97d4a65f2a6c1f2ef0799e5197
parent5e01dc7b26d9f24f39abace5da98ccbd6a5ceb52 (diff)
x86/apic: Disable I/O APIC before shutdown of the local APIC
In reboot and crash path, when we shut down the local APIC, the I/O APIC is still active. This may cause issues because external interrupts can still come in and disturb the local APIC during shutdown process. To quiet external interrupts, disable I/O APIC before shutdown local APIC. Signed-off-by: Fenghua Yu <fenghua.yu@intel.com> Link: http://lkml.kernel.org/r/1382578212-4677-1-git-send-email-fenghua.yu@intel.com Cc: <stable@kernel.org> [ I suppose the 'issue' is a hang during shutdown. It's a fine change nevertheless. ] Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--arch/x86/kernel/crash.c2
-rw-r--r--arch/x86/kernel/reboot.c8
2 files changed, 5 insertions, 5 deletions
diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c
index e0e0841eef45..18677a90d6a3 100644
--- a/arch/x86/kernel/crash.c
+++ b/arch/x86/kernel/crash.c
@@ -127,12 +127,12 @@ void native_machine_crash_shutdown(struct pt_regs *regs)
127 cpu_emergency_vmxoff(); 127 cpu_emergency_vmxoff();
128 cpu_emergency_svm_disable(); 128 cpu_emergency_svm_disable();
129 129
130 lapic_shutdown();
131#ifdef CONFIG_X86_IO_APIC 130#ifdef CONFIG_X86_IO_APIC
132 /* Prevent crash_kexec() from deadlocking on ioapic_lock. */ 131 /* Prevent crash_kexec() from deadlocking on ioapic_lock. */
133 ioapic_zap_locks(); 132 ioapic_zap_locks();
134 disable_IO_APIC(); 133 disable_IO_APIC();
135#endif 134#endif
135 lapic_shutdown();
136#ifdef CONFIG_HPET_TIMER 136#ifdef CONFIG_HPET_TIMER
137 hpet_disable(); 137 hpet_disable();
138#endif 138#endif
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
index 7e920bff99a3..618ce264b237 100644
--- a/arch/x86/kernel/reboot.c
+++ b/arch/x86/kernel/reboot.c
@@ -550,6 +550,10 @@ static void native_machine_emergency_restart(void)
550void native_machine_shutdown(void) 550void native_machine_shutdown(void)
551{ 551{
552 /* Stop the cpus and apics */ 552 /* Stop the cpus and apics */
553#ifdef CONFIG_X86_IO_APIC
554 disable_IO_APIC();
555#endif
556
553#ifdef CONFIG_SMP 557#ifdef CONFIG_SMP
554 /* 558 /*
555 * Stop all of the others. Also disable the local irq to 559 * Stop all of the others. Also disable the local irq to
@@ -562,10 +566,6 @@ void native_machine_shutdown(void)
562 566
563 lapic_shutdown(); 567 lapic_shutdown();
564 568
565#ifdef CONFIG_X86_IO_APIC
566 disable_IO_APIC();
567#endif
568
569#ifdef CONFIG_HPET_TIMER 569#ifdef CONFIG_HPET_TIMER
570 hpet_disable(); 570 hpet_disable();
571#endif 571#endif