Andrew,
I have been doing some work on kgdb to pull a few of it "fingers" out of various places in the kernel. This is the final location where we have a kgdb intercept not covered by a notify.

On a related issue, I feel very queasy with sending nmi interrupts and non-nmi events to the same notify code. Would you be open to a patch to create a seperate notify list for nmi events?


-
George Anzinger   [email protected]
HRT (High-res-timers):  http://sourceforge.net/projects/high-res-timers/
Source: MontaVista Software, Inc. George Anzinger <[email protected]>
Type: Enhancement 
Description:
        This patch adds a notify to the nmi watchdog to notify that
        the system is about to be taken down by the watchdog.  If the
        notify is handled with a NOTIFY_STOP return, the system is
        given a new lease on life.

        This give debug code a chance to a) catch watchdog timeouts and
        b) possibly allow the system to continue, realizing that 
        the time out may be due to debugger activities such as single 
        stepping which is usually done with "other" cpus held.

Signed-off-by: George Anzinger<[email protected]>

 nmi.c |   15 ++++++++++++---
 1 files changed, 12 insertions(+), 3 deletions(-)

Index: linux-2.6.13-rc/arch/i386/kernel/nmi.c
===================================================================
--- linux-2.6.13-rc.orig/arch/i386/kernel/nmi.c
+++ linux-2.6.13-rc/arch/i386/kernel/nmi.c
@@ -26,11 +26,13 @@
 #include <linux/nmi.h>
 #include <linux/sysdev.h>
 #include <linux/sysctl.h>
+#include <linux/notifier.h>
 
 #include <asm/smp.h>
 #include <asm/mtrr.h>
 #include <asm/mpspec.h>
 #include <asm/nmi.h>
+#include <asm/kdebug.h>
 
 #include "mach_traps.h"
 
@@ -494,8 +496,15 @@ void nmi_watchdog_tick (struct pt_regs *
                 * wait a few IRQs (5 seconds) before doing the oops ...
                 */
                alert_counter[cpu]++;
-               if (alert_counter[cpu] == 5*nmi_hz)
-                       die_nmi(regs, "NMI Watchdog detected LOCKUP");
+               if (alert_counter[cpu] == 5*nmi_hz) {
+                       if (notify_die(DIE_NMIWATCHDOG, "nmi_ipi_watchdog", 
+                                      regs, 0, 0, SIGINT) == NOTIFY_STOP) {
+                               last_irq_sums[cpu] = sum;
+                               alert_counter[cpu] = 0;
+                       } else {
+                               die_nmi(regs, "NMI Watchdog detected LOCKUP");
+                       }
+               }
        } else {
                last_irq_sums[cpu] = sum;
                alert_counter[cpu] = 0;
@@ -555,7 +564,7 @@ int proc_unknown_nmi_panic(ctl_table *ta
                        return -EBUSY;
                } else {
                        set_nmi_callback(unknown_nmi_panic_callback);
-               }
+               } 
        } else {
                release_lapic_nmi();
                unset_nmi_callback();

Reply via email to