diff options
Diffstat (limited to 'queue-2.6.32/cpuidle-menu-fixed-wrapping-timers-at-4.294-seconds.patch')
-rw-r--r-- | queue-2.6.32/cpuidle-menu-fixed-wrapping-timers-at-4.294-seconds.patch | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/queue-2.6.32/cpuidle-menu-fixed-wrapping-timers-at-4.294-seconds.patch b/queue-2.6.32/cpuidle-menu-fixed-wrapping-timers-at-4.294-seconds.patch new file mode 100644 index 0000000..9d08d8b --- /dev/null +++ b/queue-2.6.32/cpuidle-menu-fixed-wrapping-timers-at-4.294-seconds.patch @@ -0,0 +1,44 @@ +From 7467571f4480b273007517b26297c07154c73924 Mon Sep 17 00:00:00 2001 +From: Tero Kristo <tero.kristo@nokia.com> +Date: Thu, 24 Feb 2011 17:19:23 +0200 +Subject: cpuidle: menu: fixed wrapping timers at 4.294 seconds + +From: Tero Kristo <tero.kristo@nokia.com> + +commit 7467571f4480b273007517b26297c07154c73924 upstream. + +Cpuidle menu governor is using u32 as a temporary datatype for storing +nanosecond values which wrap around at 4.294 seconds. This causes errors +in predicted sleep times resulting in higher than should be C state +selection and increased power consumption. This also breaks cpuidle +state residency statistics. + +Signed-off-by: Tero Kristo <tero.kristo@nokia.com> +Signed-off-by: Len Brown <len.brown@intel.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + drivers/cpuidle/governors/menu.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/drivers/cpuidle/governors/menu.c ++++ b/drivers/cpuidle/governors/menu.c +@@ -185,6 +185,7 @@ static int menu_select(struct cpuidle_de + int latency_req = pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY); + int i; + int multiplier; ++ struct timespec t; + + if (data->needs_update) { + menu_update(dev); +@@ -199,8 +200,9 @@ static int menu_select(struct cpuidle_de + return 0; + + /* determine the expected residency time, round up */ ++ t = ktime_to_timespec(tick_nohz_get_sleep_length()); + data->expected_us = +- DIV_ROUND_UP((u32)ktime_to_ns(tick_nohz_get_sleep_length()), 1000); ++ t.tv_sec * USEC_PER_SEC + t.tv_nsec / NSEC_PER_USEC; + + + data->bucket = which_bucket(data->expected_us); |