x86, UV: Make kdump avoid stack dumps

UV NMI callback's should not write stack dumps when a kdump is to be written.

When invoking the crash kernel to write a dump, kdump_nmi_shootdown_cpus()
uses NMI's to get all the cpu's to save their register context and halt.

But the NMI interrupt handler runs a callback list. This patch sets a flag
to prevent any of those callbacks from interfering with the halt of the cpu.

For UV, which currently has the only callback to which this is relevant, the
uv_handle_nmi() callback should not do dumping of stacks.

The 'in_crash_kexec' flag is defined as an extern in kdebug.h firstly
because x2apic_uv_x.c includes it. Secondly because some future callback
might need the flag to know that it should not enter the debugger.
(Such a scenario was in fact present in the 2.6.32 kernel, SuSE distribution,
where a call to kdb needed to be avoided.)

Signed-off-by: Cliff Wickman <cpw@sgi.com>
LKML-Reference: <E1ObLvt-0005UZ-Va@eag09.americas.sgi.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>

authored by Cliff Wickman and committed by H. Peter Anvin 5edd19af 93a7ca0c

+8
+1
arch/x86/include/asm/kdebug.h
··· 33 33 extern void show_regs(struct pt_regs *regs); 34 34 extern unsigned long oops_begin(void); 35 35 extern void oops_end(unsigned long, struct pt_regs *, int signr); 36 + extern int in_crash_kexec; 36 37 37 38 #endif /* _ASM_X86_KDEBUG_H */
+4
arch/x86/kernel/apic/x2apic_uv_x.c
··· 604 604 { 605 605 if (reason != DIE_NMI_IPI) 606 606 return NOTIFY_OK; 607 + 608 + if (in_crash_kexec) 609 + /* do nothing if entering the crash kernel */ 610 + return NOTIFY_OK; 607 611 /* 608 612 * Use a lock so only one cpu prints at a time 609 613 * to prevent intermixed output.
+3
arch/x86/kernel/crash.c
··· 28 28 #include <asm/reboot.h> 29 29 #include <asm/virtext.h> 30 30 31 + int in_crash_kexec; 32 + 31 33 #if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC) 32 34 33 35 static void kdump_nmi_callback(int cpu, struct die_args *args) ··· 63 61 64 62 static void kdump_nmi_shootdown_cpus(void) 65 63 { 64 + in_crash_kexec = 1; 66 65 nmi_shootdown_cpus(kdump_nmi_callback); 67 66 68 67 disable_local_APIC();