[stable 9] panic on reboot: ipmi_wd_event()

John Baldwin jhb at freebsd.org
Mon Aug 6 14:40:16 UTC 2012


On Thursday, August 02, 2012 7:01:28 pm Sean Bruno wrote:
> On Thu, 2012-08-02 at 13:34 -0700, John Baldwin wrote:
> > On Wednesday, August 01, 2012 6:48:48 pm Sean Bruno wrote:
> > > On Wed, 2012-08-01 at 05:53 -0700, John Baldwin wrote:
> > > > Index: vfs_subr.c
> > > > ===================================================================
> > > > --- vfs_subr.c  (revision 238969)
> > > > +++ vfs_subr.c  (working copy)
> > > > @@ -1868,8 +1868,11 @@ sched_sync(void)
> > > >                                 continue;
> > > >                         }
> > > >  
> > > > -                       if (first_printf == 0)
> > > > +                       if (first_printf == 0) {
> > > > +                               mtx_unlock(&sync_mtx);
> > > >                                 wdog_kern_pat(WD_LASTVAL);
> > > > +                               mtx_lock(&sync_mtx);
> > > > +                       }
> > > >  
> > > >                 }
> > > >                 if (!LIST_EMPTY(gslp)) {
> > > > 
> > > > 
> > > > -- 
> > > > John Baldwin 
> > > 
> > > This definitely makes the panic go away on reboot.
> > 
> > Do you have watchdogd enabled at all?
> > 
> 
> No, we never had it enabled.

Ok, can you try this instead of the other patch.  It makes the IPMI driver not 
bother clearing the watchdog if it isn't running.

Index: dev/ipmi/ipmi.c
===================================================================
--- dev/ipmi/ipmi.c	(revision 238992)
+++ dev/ipmi/ipmi.c	(working copy)
@@ -653,11 +653,12 @@
 		if (timeout == 0)
 			timeout = 1;
 		e = ipmi_set_watchdog(sc, timeout);
-		if (e == 0)
+		if (e == 0) {
 			*error = 0;
-		else
+			sc->ipmi_watchdog_active = 1;
+		} else
 			(void)ipmi_set_watchdog(sc, 0);
-	} else {
+	} else if (atomic_readandclear_int(&sc->ipmi_watchdog_active) != 0) {
 		e = ipmi_set_watchdog(sc, 0);
 		if (e != 0 && cmd == 0)
 			*error = EOPNOTSUPP;
Index: dev/ipmi/ipmivars.h
===================================================================
--- dev/ipmi/ipmivars.h	(revision 238992)
+++ dev/ipmi/ipmivars.h	(working copy)
@@ -105,6 +105,7 @@
 	struct cdev		*ipmi_cdev;
 	TAILQ_HEAD(,ipmi_request) ipmi_pending_requests;
 	eventhandler_tag	ipmi_watchdog_tag;
+	int			ipmi_watchdog_active;
 	struct intr_config_hook	ipmi_ich;
 	struct mtx		ipmi_lock;
 	struct cv		ipmi_request_added;

-- 
John Baldwin


More information about the freebsd-stable mailing list