Skip site navigation (1)Skip section navigation (2)
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>