summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorxtraeme <xtraeme@NetBSD.org>2007-10-20 00:12:35 +0000
committerxtraeme <xtraeme@NetBSD.org>2007-10-20 00:12:35 +0000
commiteccf5885eafed52cf354a8f2449aeb9b70f3447b (patch)
tree8ef2e7384d3a2eac88f4cb51bb6bfd3b5f860c5d /sys/dev
parent99f76764526574a3ad2e7f557d674234fc6f278d (diff)
performance fix: in the workqueue handler only refresh the sensor once,
not multiple times for the same sensor and clear its state after all events were processed.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/sysmon/sysmon_envsys_events.c24
-rw-r--r--sys/dev/sysmon/sysmon_envsysvar.h3
2 files changed, 19 insertions, 8 deletions
diff --git a/sys/dev/sysmon/sysmon_envsys_events.c b/sys/dev/sysmon/sysmon_envsys_events.c
index 326f2b141df..3584dfb76e8 100644
--- a/sys/dev/sysmon/sysmon_envsys_events.c
+++ b/sys/dev/sysmon/sysmon_envsys_events.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmon_envsys_events.c,v 1.41 2007/10/13 16:00:46 xtraeme Exp $ */
+/* $NetBSD: sysmon_envsys_events.c,v 1.42 2007/10/20 00:12:35 xtraeme Exp $ */
/*-
* Copyright (c) 2007 Juan Romero Pardines.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_events.c,v 1.41 2007/10/13 16:00:46 xtraeme Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_events.c,v 1.42 2007/10/20 00:12:35 xtraeme Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -463,6 +463,12 @@ sme_events_check(void *arg)
see->type));
workqueue_enqueue(seewq, &see->see_wk, NULL);
}
+ /*
+ * Now that the events list was checked, reset the refresh value.
+ */
+ LIST_FOREACH(see, &sme_events_list, see_list)
+ see->refreshed = false;
+
if (!sysmon_low_power)
callout_schedule(&seeco, SME_EVTIMO);
}
@@ -504,13 +510,17 @@ sme_events_worker(struct work *wk, void *arg)
edata = &sme->sme_sensor_data[see->snum];
/*
- * refresh the sensor that was marked with a critical
- * event.
+ * refresh the sensor that was marked with a critical event
+ * only if it wasn't refreshed before or if the driver doesn't
+ * use its own method for refreshing.
*/
if ((sme->sme_flags & SME_DISABLE_GTREDATA) == 0) {
- error = (*sme->sme_gtredata)(sme, edata);
- if (error)
- goto out;
+ if (!see->refreshed) {
+ error = (*sme->sme_gtredata)(sme, edata);
+ if (error)
+ goto out;
+ see->refreshed = true;
+ }
}
DPRINTFOBJ(("%s: desc=%s sensor=%d units=%d value_cur=%d\n",
diff --git a/sys/dev/sysmon/sysmon_envsysvar.h b/sys/dev/sysmon/sysmon_envsysvar.h
index 819f7ffaabe..9b2d1c542b0 100644
--- a/sys/dev/sysmon/sysmon_envsysvar.h
+++ b/sys/dev/sysmon/sysmon_envsysvar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmon_envsysvar.h,v 1.20 2007/10/07 04:11:16 xtraeme Exp $ */
+/* $NetBSD: sysmon_envsysvar.h,v 1.21 2007/10/20 00:12:35 xtraeme Exp $ */
/*-
* Copyright (c) 2007 Juan Romero Pardines.
@@ -76,6 +76,7 @@ typedef struct sme_event {
int snum; /* sensor number */
int evsent; /* event already sent */
int see_flags; /* see above */
+ bool refreshed; /* data was refreshed */
#define SME_EVENT_WORKING 0x0001 /* This event is busy */
} sme_event_t;