Source: MontaVista Software, Inc. George Anzinger 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 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 #include #include +#include #include #include #include #include +#include #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();