[PATCH 1/1] cpuidle: menu: fixed wrapping timers at 4.294 seconds

Stefan Bader stefan.bader at canonical.com
Wed Jun 22 12:41:26 UTC 2011


On 22.06.2011 11:40, Colin King wrote:
> From: Tero Kristo <tero.kristo at nokia.com>
> 
> 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 at kernel.org # .32.x through .39.x
> Signed-off-by: Tero Kristo <tero.kristo at nokia.com>
> Signed-off-by: Len Brown <len.brown at intel.com>
> ---
>  drivers/cpuidle/governors/menu.c |    4 +++-
>  1 files changed, 3 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c
> index f508690..c47f3d0 100644
> --- a/drivers/cpuidle/governors/menu.c
> +++ b/drivers/cpuidle/governors/menu.c
> @@ -237,6 +237,7 @@ static int menu_select(struct cpuidle_device *dev)
>  	unsigned int power_usage = -1;
>  	int i;
>  	int multiplier;
> +	struct timespec t;
>  
>  	if (data->needs_update) {
>  		menu_update(dev);
> @@ -251,8 +252,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);

Clean pick and also queued for upstream stable.

Acked-by: Stefan Bader <stefan.bader at canonical.com>




More information about the kernel-team mailing list