[PATCH] ipmi: fix watchdog timeout panic handling

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

 



If a panic came from the IPMI watchdog pretimeout and that was reported
via an NMI, it would also be reported via the standard IPMI flags,
which would get picked up when reporting panic events and cause another
panic.  This adds an atomic to avoid calling panic twice.

Signed-off-by: Corey Minyard <[email protected]>

Index: linux-2.6.14-rc4/drivers/char/ipmi/ipmi_watchdog.c
===================================================================
--- linux-2.6.14-rc4.orig/drivers/char/ipmi/ipmi_watchdog.c
+++ linux-2.6.14-rc4/drivers/char/ipmi/ipmi_watchdog.c
@@ -49,6 +49,7 @@
 #include <linux/poll.h>
 #include <linux/string.h>
 #include <linux/ctype.h>
+#include <asm/atomic.h>
 #ifdef CONFIG_X86_LOCAL_APIC
 #include <asm/apic.h>
 #endif
@@ -288,6 +289,8 @@ static int ipmi_start_timer_on_heartbeat
 static unsigned char ipmi_version_major;
 static unsigned char ipmi_version_minor;
 
+/* If a pretimeout occurs, this is used to allow only one panic to happen. */
+static atomic_t preop_panic_excl = ATOMIC_INIT(-1);
 
 static int ipmi_heartbeat(void);
 static void panic_halt_ipmi_heartbeat(void);
@@ -833,9 +836,10 @@ static void ipmi_wdog_msg_handler(struct
 static void ipmi_wdog_pretimeout_handler(void *handler_data)
 {
 	if (preaction_val != WDOG_PRETIMEOUT_NONE) {
-		if (preop_val == WDOG_PREOP_PANIC)
-			panic("Watchdog pre-timeout");
-		else if (preop_val == WDOG_PREOP_GIVE_DATA) {
+		if (preop_val == WDOG_PREOP_PANIC) {
+			if (atomic_inc_and_test(&preop_panic_excl))
+				panic("Watchdog pre-timeout");
+		} else if (preop_val == WDOG_PREOP_GIVE_DATA) {
 			spin_lock(&ipmi_read_lock);
 			data_to_read = 1;
 			wake_up_interruptible(&read_q);
@@ -909,7 +913,8 @@ ipmi_nmi(void *dev_id, struct pt_regs *r
 		   an error and not work unless we re-enable
 		   the timer.   So do so. */
 		pretimeout_since_last_heartbeat = 1;
-		panic(PFX "pre-timeout");
+		if (atomic_inc_and_test(&preop_panic_excl))
+			panic(PFX "pre-timeout");
 	}
 
 	return NOTIFY_DONE;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux