diff options
| author | xtraeme <xtraeme@NetBSD.org> | 2007-10-20 00:12:35 +0000 |
|---|---|---|
| committer | xtraeme <xtraeme@NetBSD.org> | 2007-10-20 00:12:35 +0000 |
| commit | eccf5885eafed52cf354a8f2449aeb9b70f3447b (patch) | |
| tree | 8ef2e7384d3a2eac88f4cb51bb6bfd3b5f860c5d /sys/dev | |
| parent | 99f76764526574a3ad2e7f557d674234fc6f278d (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.c | 24 | ||||
| -rw-r--r-- | sys/dev/sysmon/sysmon_envsysvar.h | 3 |
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; |
