Module Name: src
Committed By: matt
Date: Fri Jan 7 02:31:01 UTC 2011
Modified Files:
src/sys/dev/sysmon [matt-nb5-pq3]: sysmon_wdog.c sysmonvar.h
Log Message:
Allow kernel ticklers to turn themselves on at boot.
To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.24.36.1 src/sys/dev/sysmon/sysmon_wdog.c
cvs rdiff -u -r1.27 -r1.27.20.1 src/sys/dev/sysmon/sysmonvar.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/sysmon/sysmon_wdog.c
diff -u src/sys/dev/sysmon/sysmon_wdog.c:1.24 src/sys/dev/sysmon/sysmon_wdog.c:1.24.36.1
--- src/sys/dev/sysmon/sysmon_wdog.c:1.24 Sun Dec 16 21:07:45 2007
+++ src/sys/dev/sysmon/sysmon_wdog.c Fri Jan 7 02:31:00 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmon_wdog.c,v 1.24 2007/12/16 21:07:45 dyoung Exp $ */
+/* $NetBSD: sysmon_wdog.c,v 1.24.36.1 2011/01/07 02:31:00 matt Exp $ */
/*-
* Copyright (c) 2000 Zembu Labs, Inc.
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysmon_wdog.c,v 1.24 2007/12/16 21:07:45 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysmon_wdog.c,v 1.24.36.1 2011/01/07 02:31:00 matt Exp $");
#include <sys/param.h>
#include <sys/conf.h>
@@ -64,11 +64,13 @@
static struct sysmon_wdog *sysmon_armed_wdog;
static callout_t sysmon_wdog_callout;
static void *sysmon_wdog_sdhook;
+static void *sysmon_wdog_cphook;
struct sysmon_wdog *sysmon_wdog_find(const char *);
void sysmon_wdog_release(struct sysmon_wdog *);
int sysmon_wdog_setmode(struct sysmon_wdog *, int, u_int);
void sysmon_wdog_ktickle(void *);
+void sysmon_wdog_critpoll(void *);
void sysmon_wdog_shutdown(void *);
void sysmon_wdog_ref(struct sysmon_wdog *);
@@ -78,6 +80,13 @@
mutex_init(&sysmon_wdog_list_mtx, MUTEX_DEFAULT, IPL_NONE);
mutex_init(&sysmon_wdog_mtx, MUTEX_DEFAULT, IPL_SOFTCLOCK);
cv_init(&sysmon_wdog_cv, "wdogref");
+ sysmon_wdog_sdhook = shutdownhook_establish(sysmon_wdog_shutdown, NULL);
+ if (sysmon_wdog_sdhook == NULL)
+ printf("WARNING: unable to register watchdog shutdown hook\n");
+ sysmon_wdog_cphook = critpollhook_establish(sysmon_wdog_critpoll, NULL);
+ if (sysmon_wdog_cphook == NULL)
+ printf("WARNING: unable to register watchdog critpoll hook\n");
+ callout_init(&sysmon_wdog_callout, 0);
}
/*
@@ -89,17 +98,6 @@
sysmonopen_wdog(dev_t dev, int flag, int mode, struct lwp *l)
{
- mutex_enter(&sysmon_wdog_list_mtx);
- if (sysmon_wdog_sdhook == NULL) {
- sysmon_wdog_sdhook =
- shutdownhook_establish(sysmon_wdog_shutdown, NULL);
- if (sysmon_wdog_sdhook == NULL)
- printf("WARNING: unable to register watchdog "
- "shutdown hook\n");
- callout_init(&sysmon_wdog_callout, 0);
- }
- mutex_exit(&sysmon_wdog_list_mtx);
-
return 0;
}
@@ -323,6 +321,27 @@
}
/*
+ * sysmon_wdog_critpoll:
+ *
+ * Perform critical operations during long polling periods
+ */
+void
+sysmon_wdog_critpoll(void *arg)
+{
+ struct sysmon_wdog *smw = sysmon_armed_wdog;
+
+ if (smw == NULL)
+ return;
+
+ if ((smw->smw_mode & WDOG_MODE_MASK) == WDOG_MODE_KTICKLE) {
+ if ((*smw->smw_tickle)(smw) != 0) {
+ printf("WARNING: KERNEL TICKLE OF WATCHDOG %s "
+ "FAILED!\n", smw->smw_name);
+ }
+ }
+}
+
+/*
* sysmon_wdog_find:
*
* Find a watchdog device. We increase the reference
Index: src/sys/dev/sysmon/sysmonvar.h
diff -u src/sys/dev/sysmon/sysmonvar.h:1.27 src/sys/dev/sysmon/sysmonvar.h:1.27.20.1
--- src/sys/dev/sysmon/sysmonvar.h:1.27 Tue Jun 3 15:00:57 2008
+++ src/sys/dev/sysmon/sysmonvar.h Fri Jan 7 02:31:00 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmonvar.h,v 1.27 2008/06/03 15:00:57 jmcneill Exp $ */
+/* $NetBSD: sysmonvar.h,v 1.27.20.1 2011/01/07 02:31:00 matt Exp $ */
/*-
* Copyright (c) 2000 Zembu Labs, Inc.
@@ -150,6 +150,7 @@
int sysmonclose_wdog(dev_t, int, int, struct lwp *);
int sysmonioctl_wdog(dev_t, u_long, void *, int, struct lwp *);
+int sysmon_wdog_setmode(struct sysmon_wdog *, int, u_int);
int sysmon_wdog_register(struct sysmon_wdog *);
int sysmon_wdog_unregister(struct sysmon_wdog *);