Don't try to stop the IPMI watchdog timer if it is not running.

Starting or stopping the IPMI watchdog is rather expensive with the
current implementation as all IPMI requests are bounced via thread.
This is not viable during shutdown or dumps, and this avoids headache
in the common case that the watchdog is not enabled.  The IPMI watchdog
should probably be reworked to not use a separate thread to fix this
in the case when the watchdog timer is enabled.

MFC after:	2 weeks
This commit is contained in:
John Baldwin 2012-08-07 12:40:31 +00:00
parent 06f2b92916
commit 1710852ebd
2 changed files with 5 additions and 3 deletions

View File

@ -653,11 +653,12 @@ ipmi_wd_event(void *arg, unsigned int cmd, int *error)
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;

View File

@ -105,6 +105,7 @@ struct ipmi_softc {
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;