Hi Jonathan,
First, thanks for your feedback and for your patch.
On Wed, Aug 27, 2014 at 02:42:43AM +1000, Jonathan Gray wrote:
> Rather than calling acpi_setfan() again would it make
> sense to remove the cached state value and move
> the state reading to just before the method is called?
>
> That said I'm not familiar with the acpitz code and
> haven't gone off to look at the spec.
At first reading I am quite disappointed to remove caching.
So I have:
- checked in others acpi termal-zone implementation to see if caching
is using or not for active cooling.
- try to measure some values on my host.
Others implementations checked:
- netbsd : caching used (sys/dev/acpi/acpi_tz.c, l.368)
- freebsd : caching used (head/sys/dev/acpica/acpi_thermal.c, l.564)
- linux : caching seems not be used (but not 100% sure)
(please note I am not expert in theses kernels implementations, so I
could be wrong).
Some measures:
I first try to measure the cost of acpi_setfan in term of time:
something between 9998432ns et 14574920ns (0.0099 and 0.015 s). It
seems not being a heavy operation (too my eyes).
Secondly, the number of call of acpi_setfan, with and without caching.
The test kernel is build with caching enable. The without-caching
counter is incremented every time acpi_setfan would be call without
caching, and with-caching counter incremented only when acpi_setfan is
called (the patch below was applied: an unknown state would result
acpi_setfan calling).
During 1h09 :
- without caching: 3388 calls
- with caching: 742 calls
The cache is used at 78% of time.
So, even if your patch resolve the initial problem (the fan don't keep
running whereas state is unknown), I would prefer to keep the cache in
place. But if you think the impact of not use this cache is negligible,
it is ok for me.
I join a very conservative patch which just allow calling
acpi_setfan(sc,i,"_OFF") if cache is unknown.
Thanks.
--
Sébastien Marie
Index: dev/acpi/acpitz.c
===================================================================
RCS file: /cvs/src/sys/dev/acpi/acpitz.c,v
retrieving revision 1.47
diff -u -p -r1.47 acpitz.c
--- dev/acpi/acpitz.c 12 Jul 2014 02:44:49 -0000 1.47
+++ dev/acpi/acpitz.c 27 Aug 2014 12:38:36 -0000
@@ -424,7 +424,7 @@ acpitz_refresh(void *arg)
acpitz_setfan(sc, i, "_ON_");
} else if (sc->sc_ac[i] != -1) {
/* turn off fan i */
- if (sc->sc_ac_stat[i] > 0)
+ if (sc->sc_ac_stat[i] == -1 || sc->sc_ac_stat[i] > 0)
acpitz_setfan(sc, i, "_OFF");
}
}