diff options
author | Len Brown <len.brown@intel.com> | 2007-09-04 12:49:22 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2007-09-04 12:49:22 -0400 |
commit | 21bc42ab852549f4a547d18d77e0e4d1b24ffd96 (patch) | |
tree | b4597592729a91cf1e8f26b8b73d837de33d67c9 | |
parent | 40ffbfad6bb79a99cc7627bdaca0ee22dec526f6 (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.c | 13 |
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 | } |