Skip to content

Commit

Permalink
cpuidle: Fix incorrect optimization
Browse files Browse the repository at this point in the history
commit 672917d ("cpuidle: menu governor: reduce latency on exit")
added an optimization, where the analysis on the past idle period moved
from the end of idle, to the beginning of the new idle.

Unfortunately, this optimization had a bug where it zeroed one key
variable for new use, that is needed for the analysis.  The fix is
simple, zero the variable after doing the work from the previous idle.

During the audit of the code that found this issue, another issue was
also found; the ->measured_us data structure member is never set, a
local variable is always used instead.

Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Cc: Corrado Zoccolo <czoccolo@gmail.com>
Cc: stable@kernel.org
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
fenrus75 authored and torvalds committed May 10, 2010
1 parent f1c448e commit 1c6fe03
Showing 1 changed file with 4 additions and 5 deletions.
9 changes: 4 additions & 5 deletions drivers/cpuidle/governors/menu.c
Expand Up @@ -100,7 +100,6 @@ struct menu_device {
int needs_update;

unsigned int expected_us;
unsigned int measured_us;
u64 predicted_us;
unsigned int exit_us;
unsigned int bucket;
Expand Down Expand Up @@ -187,14 +186,14 @@ static int menu_select(struct cpuidle_device *dev)
int i;
int multiplier;

data->last_state_idx = 0;
data->exit_us = 0;

if (data->needs_update) {
menu_update(dev);
data->needs_update = 0;
}

data->last_state_idx = 0;
data->exit_us = 0;

/* Special case when user has set very strict latency requirement */
if (unlikely(latency_req == 0))
return 0;
Expand Down Expand Up @@ -294,7 +293,7 @@ static void menu_update(struct cpuidle_device *dev)
new_factor = data->correction_factor[data->bucket]
* (DECAY - 1) / DECAY;

if (data->expected_us > 0 && data->measured_us < MAX_INTERESTING)
if (data->expected_us > 0 && measured_us < MAX_INTERESTING)
new_factor += RESOLUTION * measured_us / data->expected_us;
else
/*
Expand Down

0 comments on commit 1c6fe03

Please sign in to comment.