[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen stable-4.2] x86/crash: disable the watchdog NMIs on the crashing cpu



commit 122ce1427fd43143c3a2613cf77c4b04012a2f2b
Author:     David Vrabel <david.vrabel@xxxxxxxxxx>
AuthorDate: Mon Dec 2 15:55:16 2013 +0100
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Mon Dec 2 15:55:16 2013 +0100

    x86/crash: disable the watchdog NMIs on the crashing cpu
    
    nmi_shootdown_cpus() is called during a crash to park all the other
    CPUs.  This changes the NMI trap handlers which means there's no point
    in having the watchdog still running.
    
    This also disables the watchdog before executing any crash kexec image
    and prevents the image from receiving unexpected NMIs.
    
    Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
    
    PVOps Linux as a kexec image shoots itself in the foot otherwise.
    
    On a Core2 system, Linux declares a firmware bug and tries to invert some 
bits
    in the performance counter register.  It ends up setting the number of 
retired
    instructions to generate another NMI to fewer instructions than the NMI
    interrupt path itself, and ceases to make any useful progress.
    
    The call to disable_lapic_nmi_watchdog() must be this late into the kexec 
path
    to be sure that this cpu is the one which will execute the kexec image.
    Otherwise there are race conditions where the NMIs might be disabled on the
    wrong cpu, resulting in the kexec image still receiving NMIs.
    
    Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
    master commit: 2a16fcd5ba0244fef764886211452acc69c0ed00
    master date: 2013-11-22 14:48:12 +0100
---
 xen/arch/x86/crash.c       |    1 +
 xen/arch/x86/nmi.c         |    2 +-
 xen/include/asm-x86/apic.h |    1 +
 3 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/xen/arch/x86/crash.c b/xen/arch/x86/crash.c
index 88cba19..24e2e49 100644
--- a/xen/arch/x86/crash.c
+++ b/xen/arch/x86/crash.c
@@ -59,6 +59,7 @@ static void nmi_shootdown_cpus(void)
 {
     unsigned long msecs;
 
+    disable_lapic_nmi_watchdog();
     local_irq_disable();
 
     crashing_cpu = smp_processor_id();
diff --git a/xen/arch/x86/nmi.c b/xen/arch/x86/nmi.c
index 92a141e..c7fafc4 100644
--- a/xen/arch/x86/nmi.c
+++ b/xen/arch/x86/nmi.c
@@ -164,7 +164,7 @@ static void nmi_timer_fn(void *unused)
     set_timer(&this_cpu(nmi_timer), NOW() + MILLISECS(1000));
 }
 
-static void disable_lapic_nmi_watchdog(void)
+void disable_lapic_nmi_watchdog(void)
 {
     if (nmi_active <= 0)
         return;
diff --git a/xen/include/asm-x86/apic.h b/xen/include/asm-x86/apic.h
index 4e6bea9..c677510 100644
--- a/xen/include/asm-x86/apic.h
+++ b/xen/include/asm-x86/apic.h
@@ -206,6 +206,7 @@ extern void smp_local_timer_interrupt (struct cpu_user_regs 
*regs);
 extern void setup_boot_APIC_clock (void);
 extern void setup_secondary_APIC_clock (void);
 extern void setup_apic_nmi_watchdog (void);
+extern void disable_lapic_nmi_watchdog(void);
 extern int reserve_lapic_nmi(void);
 extern void release_lapic_nmi(void);
 extern void self_nmi(void);
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.2

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.