summaryrefslogtreecommitdiff
path: root/sys/dev/sysmon
diff options
context:
space:
mode:
authordyoung <dyoung@NetBSD.org>2008-01-02 10:15:53 +0000
committerdyoung <dyoung@NetBSD.org>2008-01-02 10:15:53 +0000
commit09767a906c0e3daea5d898bd1115e4c8a8d3d7c4 (patch)
tree5c3a6c2eeaf5321c4f2e71778ec6bb11a367ff9b /sys/dev/sysmon
parent9e7635573ecd0edc37f8ddba8debbabfa92810e9 (diff)
In sysmon_envsys_create(), initialize the callout structure. Stops
panics with a DIAGNOSTIC kernel. In sysmon_envsys_find_40(), wait until an envsys is not busy before settings its busy flag, in the pattern of sysmon_envsys_find().
Diffstat (limited to 'sys/dev/sysmon')
-rw-r--r--sys/dev/sysmon/sysmon_envsys.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/dev/sysmon/sysmon_envsys.c b/sys/dev/sysmon/sysmon_envsys.c
index f91931b6c20..a40e9a32d34 100644
--- a/sys/dev/sysmon/sysmon_envsys.c
+++ b/sys/dev/sysmon/sysmon_envsys.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmon_envsys.c,v 1.77 2008/01/02 03:06:02 dyoung Exp $ */
+/* $NetBSD: sysmon_envsys.c,v 1.78 2008/01/02 10:15:53 dyoung Exp $ */
/*-
* Copyright (c) 2007 Juan Romero Pardines.
@@ -64,7 +64,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.77 2008/01/02 03:06:02 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.78 2008/01/02 10:15:53 dyoung Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -520,6 +520,7 @@ sysmon_envsys_create(void)
sme = kmem_zalloc(sizeof(*sme), KM_SLEEP);
TAILQ_INIT(&sme->sme_sensors_list);
LIST_INIT(&sme->sme_events_list);
+ callout_init(&sme->sme_callout, 0);
return sme;
}
@@ -976,9 +977,14 @@ sysmon_envsys_find_40(u_int idx)
KASSERT(mutex_owned(&sme_mtx));
+again:
LIST_FOREACH(sme, &sysmon_envsys_list, sme_list) {
if (idx >= sme->sme_fsensor &&
idx < (sme->sme_fsensor + sme->sme_nsensors)) {
+ if (sme->sme_flags & SME_FLAG_BUSY) {
+ cv_wait(&sme_cv, &sme_mtx);
+ goto again;
+ }
sme->sme_flags |= SME_FLAG_BUSY;
break;
}