]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - arch/x86/kernel/traps.c
x86, NMI: Remove DIE_NMI_IPI
[mv-sheeva.git] / arch / x86 / kernel / traps.c
index c7fd1cea0374012b17953fd7433881dd5a0fcb9b..23f6ac05d04c12213333f9e95b2f12002ab53d79 100644 (file)
@@ -394,6 +394,14 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs)
        unsigned char reason = 0;
        int cpu;
 
+       /*
+        * CPU-specific NMI must be processed before non-CPU-specific
+        * NMI, otherwise we may lose it, because the CPU-specific
+        * NMI can not be detected/processed on other CPUs.
+        */
+       if (notify_die(DIE_NMI, "nmi", regs, 0, 2, SIGINT) == NOTIFY_STOP)
+               return;
+
        cpu = smp_processor_id();
 
        /* Only the BSP gets external NMIs from the system. */
@@ -401,21 +409,10 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs)
                reason = get_nmi_reason();
 
        if (!(reason & NMI_REASON_MASK)) {
-               if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 2, SIGINT)
-                                                               == NOTIFY_STOP)
-                       return;
-
-#ifdef CONFIG_X86_LOCAL_APIC
-               if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT)
-                                                       == NOTIFY_STOP)
-                       return;
-#endif
                unknown_nmi_error(reason, regs);
 
                return;
        }
-       if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT) == NOTIFY_STOP)
-               return;
 
        /* AK: following checks seem to be broken on modern chipsets. FIXME */
        if (reason & NMI_REASON_SERR)