IPMI driver update part 3, watchdog/NMI interaction fixes
PATCH 1/1 IPMI driver update part 3, watchdog/NMI interaction fixes
There are some interactions between IPMI NMI timeouts and the other operations of the IPMI driver. This make sure those interactions are handled properly.
Signed-off-by Corey Minyard <[email protected]>
drivers/char/ipmi/ipmi_watchdog.c +11 -7
@@ -259,7 +259,7 @@ data[1 ] =0 ;WDOG_SET_TIMEOUT_ACT (data[1 ], ipmi_watchdog_state); -if (pretimeout >0 ) { +if ((pretimeout >0 ) && (ipmi_watchdog_state !=WDOG_TIMEOUT_NONE )) {WDOG_SET_PRETIMEOUT_ACT (data[1 ], preaction_val); data[2 ] = pretimeout; }else {
@@ -817,15 +817,19 @@static int ipmi_nmi (void *dev_id,struct pt_regs *regs,int cpu,int handled) { +/* If we are not expecting a timeout, ignore it. */ +if (ipmi_watchdog_state ==WDOG_TIMEOUT_NONE ) +return NOTIFY_DONE ; +/* If no one else handled the NMI, we assume it was the IPMI watchdog. */ -if ((!handled) && (preop_val ==WDOG_PREOP_PANIC )) +if ((!handled) && (preop_val ==WDOG_PREOP_PANIC )) { +/* On some machines, the heartbeat will give +an error and not work unless we re-enable +the timer. So do so. */ + pretimeout_since_last_heartbeat =1 ;panic (PFX "pre-timeout" ); - -/* On some machines, the heartbeat will give -an error and not work unless we re-enable -the timer. So do so. */ - pretimeout_since_last_heartbeat =1 ; + }return NOTIFY_DONE ; }