| From dfed9a2db60ca5fb238a2d03c689f414e41495e5 Mon Sep 17 00:00:00 2001 |
| From: Tero Kristo <tero.kristo@nokia.com> |
| Date: Thu, 24 Feb 2011 17:19:23 +0200 |
| Subject: [PATCH] cpuidle: menu: fixed wrapping timers at 4.294 seconds |
| |
| 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. |
| |
| cc: stable@kernel.org # .32.x through .39.x |
| Signed-off-by: Tero Kristo <tero.kristo@nokia.com> |
| Signed-off-by: Len Brown <len.brown@intel.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| --- |
| drivers/cpuidle/governors/menu.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c |
| index f8e57c6..0537437 100644 |
| --- a/drivers/cpuidle/governors/menu.c |
| +++ b/drivers/cpuidle/governors/menu.c |
| @@ -185,6 +185,7 @@ static int menu_select(struct cpuidle_device *dev) |
| 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_device *dev) |
| 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); |
| -- |
| 1.7.9.3 |
| |