aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLen Brown <len.brown@intel.com>2007-09-04 12:49:22 -0400
committerLen Brown <len.brown@intel.com>2007-09-04 12:49:22 -0400
commit21bc42ab852549f4a547d18d77e0e4d1b24ffd96 (patch)
treeb4597592729a91cf1e8f26b8b73d837de33d67c9
parent40ffbfad6bb79a99cc7627bdaca0ee22dec526f6 (diff)
ACPI: thermal: use round_jiffies when thermal zone polling is enabled
Properly functioning systems do not use thermal zone polling, they use event-based notification. However, some users enable periodic thermal zone polling to work around bugs on their platforms, and at least one platform exists with a real _TZP that requests polling. While thermal zone polling (_TZP) is specified in units to 0.1 seconds, it actually has a maximum granularity of 1 second. Thus, we can safely round up the _TZP timeout to occur on the next 1-second boundary. This will batch it with other 1-second-granularity timers in the system and thus potentially extend processor idle duration. Note that the same timer is used both for _TZP and for passive processor thermal throttling. We can not round up the timeout when it is used for passive thermal throttling. Also, we can not make this a deferrable timer, as temperature is just as relevant during idle as it is during non-idle. Signed-off-by: Len Brown <len.brown@intel.com>
-rw-r--r--drivers/acpi/thermal.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
index bc6d5866ef98..15d5fdc66a96 100644
--- a/drivers/acpi/thermal.c
+++ b/drivers/acpi/thermal.c
@@ -711,6 +711,7 @@ static void acpi_thermal_check(void *data)
711 int result = 0; 711 int result = 0;
712 struct acpi_thermal *tz = data; 712 struct acpi_thermal *tz = data;
713 unsigned long sleep_time = 0; 713 unsigned long sleep_time = 0;
714 unsigned long timeout_jiffies = 0;
714 int i = 0; 715 int i = 0;
715 struct acpi_thermal_state state; 716 struct acpi_thermal_state state;
716 717
@@ -787,10 +788,13 @@ static void acpi_thermal_check(void *data)
787 * a thermal event occurs). Note that _TSP and _TZD values are 788 * a thermal event occurs). Note that _TSP and _TZD values are
788 * given in 1/10th seconds (we must covert to milliseconds). 789 * given in 1/10th seconds (we must covert to milliseconds).
789 */ 790 */
790 if (tz->state.passive) 791 if (tz->state.passive) {
791 sleep_time = tz->trips.passive.tsp * 100; 792 sleep_time = tz->trips.passive.tsp * 100;
792 else if (tz->polling_frequency > 0) 793 timeout_jiffies = jiffies + (HZ * sleep_time) / 1000;
794 } else if (tz->polling_frequency > 0) {
793 sleep_time = tz->polling_frequency * 100; 795 sleep_time = tz->polling_frequency * 100;
796 timeout_jiffies = round_jiffies(jiffies + (HZ * sleep_time) / 1000);
797 }
794 798
795 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s: temperature[%lu] sleep[%lu]\n", 799 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s: temperature[%lu] sleep[%lu]\n",
796 tz->name, tz->temperature, sleep_time)); 800 tz->name, tz->temperature, sleep_time));
@@ -804,12 +808,11 @@ static void acpi_thermal_check(void *data)
804 del_timer(&(tz->timer)); 808 del_timer(&(tz->timer));
805 } else { 809 } else {
806 if (timer_pending(&(tz->timer))) 810 if (timer_pending(&(tz->timer)))
807 mod_timer(&(tz->timer), 811 mod_timer(&(tz->timer), timeout_jiffies);
808 jiffies + (HZ * sleep_time) / 1000);
809 else { 812 else {
810 tz->timer.data = (unsigned long)tz; 813 tz->timer.data = (unsigned long)tz;
811 tz->timer.function = acpi_thermal_run; 814 tz->timer.function = acpi_thermal_run;
812 tz->timer.expires = jiffies + (HZ * sleep_time) / 1000; 815 tz->timer.expires = timeout_jiffies;
813 add_timer(&(tz->timer)); 816 add_timer(&(tz->timer));
814 } 817 }
815 } 818 }