Commit 63d30298 authored by Eric W. Biederman's avatar Eric W. Biederman Committed by Linus Torvalds

[PATCH] kexec: x86 shutdown APICs during crash_shutdown

In the case of a crash/panic an architecture specific function
machine_crash_shutdown is called.  This patch adds to the x86 machine_crash
function the standard kernel code for shutting down apics.

Every line of code added to that function increases the risk that we will call
code after a kernel panic that is not safe.

This patch should not make it to the stable kernel without a being reviewed a
lot more.  It is unclear how much a hardned kernel can take when it comes to
misconfigured apics.  So since a normal kernel has problems this patch does a
clean shutdown.

It is my expectation this patch will be dropped from future generations of the
kexec work.  But for the moment it is a crutch to keep from breaking
everything.
Signed-off-by: default avatarEric Biederman <ebiederm@xmission.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 2c818b45
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <asm/hardirq.h> #include <asm/hardirq.h>
#include <asm/nmi.h> #include <asm/nmi.h>
#include <asm/hw_irq.h> #include <asm/hw_irq.h>
#include <asm/apic.h>
#include <mach_ipi.h> #include <mach_ipi.h>
#define MAX_NOTE_BYTES 1024 #define MAX_NOTE_BYTES 1024
...@@ -115,6 +116,7 @@ static int crash_nmi_callback(struct pt_regs *regs, int cpu) ...@@ -115,6 +116,7 @@ static int crash_nmi_callback(struct pt_regs *regs, int cpu)
{ {
local_irq_disable(); local_irq_disable();
crash_save_this_cpu(regs, cpu); crash_save_this_cpu(regs, cpu);
disable_local_APIC();
atomic_dec(&waiting_for_crash_ipi); atomic_dec(&waiting_for_crash_ipi);
/* Assume hlt works */ /* Assume hlt works */
__asm__("hlt"); __asm__("hlt");
...@@ -153,6 +155,7 @@ static void nmi_shootdown_cpus(void) ...@@ -153,6 +155,7 @@ static void nmi_shootdown_cpus(void)
} }
/* Leave the nmi callback set */ /* Leave the nmi callback set */
disable_local_APIC();
} }
#else #else
static void nmi_shootdown_cpus(void) static void nmi_shootdown_cpus(void)
...@@ -174,5 +177,9 @@ void machine_crash_shutdown(void) ...@@ -174,5 +177,9 @@ void machine_crash_shutdown(void)
/* The kernel is broken so disable interrupts */ /* The kernel is broken so disable interrupts */
local_irq_disable(); local_irq_disable();
nmi_shootdown_cpus(); nmi_shootdown_cpus();
lapic_shutdown();
#if defined(CONFIG_X86_IO_APIC)
disable_IO_APIC();
#endif
crash_save_self(); crash_save_self();
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment