Date: Thu, 25 Aug 2005 04:05:12 +0900 From: Hajimu UMEMOTO <ume@freebsd.org> To: Giorgos Keramidas <keramida@freebsd.org> Cc: freebsd-current@freebsd.org Subject: Re: Recent CURRENT/i386 + acpi_thermal panic Message-ID: <ygebr3njguv.wl%ume@mahoroba.org> In-Reply-To: <20050824163054.GA646@orion.daedalusnetworks.priv> References: <20050824163054.GA646@orion.daedalusnetworks.priv>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi,
>>>>> On Wed, 24 Aug 2005 19:30:54 +0300
>>>>> Giorgos Keramidas <keramida@freebsd.org> said:
keramida> Recent CURRENT/i386 panics randomly at boot time at (manual copy of the
keramida> console output, so there may be some errors in the numbers copied):
keramida> msleep(c1a761d4,0,54,c0986ce0,0) at msleep+0x6e
keramida> acpi_tz_cooling_thread(c1a76100,d5248d38,c1a76100,c09770bc,0 at acpi_tz_cooling_thread+0x58
Umm, the fifth argument to msleep() is zero. It means sc->tz_zone.tsp
is zero. But, it is tested not to zero before invoking
acpi_tz_cooling_thread(). Perhaps, it is cleared some where later.
keramida> Any ideas why this happens "most of the time", every time I boot?
Does this patch work for you for workaround? It changes to use an
initial value of sc->tz_zone.tsp, and don't use updated value.
Index: acpi_thermal.c
diff -u -p acpi_thermal.c.orig acpi_thermal.c
--- acpi_thermal.c.orig Thu Aug 18 02:01:25 2005
+++ acpi_thermal.c Thu Aug 25 03:41:53 2005
@@ -117,6 +117,7 @@ struct acpi_tz_softc {
int tz_cooling_active;
int tz_cooling_updated;
int tz_cooling_saved_freq;
+ int tz_cooling_tsp;
};
#define CPUFREQ_MAX_LEVELS 64 /* XXX cpufreq should export this */
@@ -282,6 +283,8 @@ acpi_tz_attach(device_t dev)
OID_AUTO, "_ACx", CTLFLAG_RD, &sc->tz_zone.ac,
sizeof(sc->tz_zone.ac), "IK", "");
+ sc->tz_cooling_tsp = sc->tz_zone.tsp;
+
/*
* Create thread to service all of the thermal zones. Register
* our power profile event handler.
@@ -299,7 +302,7 @@ acpi_tz_attach(device_t dev)
/* Create a thread to handle passive cooling for each zone if enabled. */
if (sc->tz_cooling_enabled) {
- if (acpi_tz_cooling_is_available(sc)) {
+ if (acpi_tz_cooling_is_available(sc) && sc->tz_cooling_tsp > 0) {
error = acpi_tz_cooling_thread_start(sc);
if (error != 0) {
sc->tz_cooling_enabled = FALSE;
@@ -665,7 +668,7 @@ acpi_tz_cooling_sysctl(SYSCTL_HANDLER_AR
return (EINVAL);
if (enabled) {
- if (acpi_tz_cooling_is_available(sc))
+ if (acpi_tz_cooling_is_available(sc) && sc->tz_cooling_tsp > 0)
error = acpi_tz_cooling_thread_start(sc);
else
error = ENODEV;
@@ -1003,7 +1006,7 @@ acpi_tz_cooling_thread(void *arg)
}
temperature = sc->tz_temperature;
tsleep(&sc->tz_cooling_proc, PZERO, "cooling",
- hz * sc->tz_zone.tsp / 10);
+ hz * sc->tz_cooling_tsp / 10);
}
if (sc->tz_cooling_active) {
acpi_tz_cpufreq_restore(sc);
Sincerely,
--
Hajimu UMEMOTO @ Internet Mutual Aid Society Yokohama, Japan
ume@mahoroba.org ume@{,jp.}FreeBSD.org
http://www.imasy.org/~ume/
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?ygebr3njguv.wl%ume>
