diff options
Diffstat (limited to 'drivers/cpuidle/governors/menu.c')
-rw-r--r-- | drivers/cpuidle/governors/menu.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c index 8d7cf3f31450..f1df59f59a37 100644 --- a/drivers/cpuidle/governors/menu.c +++ b/drivers/cpuidle/governors/menu.c | |||
@@ -15,12 +15,14 @@ | |||
15 | #include <linux/tick.h> | 15 | #include <linux/tick.h> |
16 | 16 | ||
17 | #define BREAK_FUZZ 4 /* 4 us */ | 17 | #define BREAK_FUZZ 4 /* 4 us */ |
18 | #define PRED_HISTORY_PCT 50 | ||
18 | 19 | ||
19 | struct menu_device { | 20 | struct menu_device { |
20 | int last_state_idx; | 21 | int last_state_idx; |
21 | 22 | ||
22 | unsigned int expected_us; | 23 | unsigned int expected_us; |
23 | unsigned int predicted_us; | 24 | unsigned int predicted_us; |
25 | unsigned int current_predicted_us; | ||
24 | unsigned int last_measured_us; | 26 | unsigned int last_measured_us; |
25 | unsigned int elapsed_us; | 27 | unsigned int elapsed_us; |
26 | }; | 28 | }; |
@@ -47,6 +49,12 @@ static int menu_select(struct cpuidle_device *dev) | |||
47 | data->expected_us = | 49 | data->expected_us = |
48 | (u32) ktime_to_ns(tick_nohz_get_sleep_length()) / 1000; | 50 | (u32) ktime_to_ns(tick_nohz_get_sleep_length()) / 1000; |
49 | 51 | ||
52 | /* Recalculate predicted_us based on prediction_history_pct */ | ||
53 | data->predicted_us *= PRED_HISTORY_PCT; | ||
54 | data->predicted_us += (100 - PRED_HISTORY_PCT) * | ||
55 | data->current_predicted_us; | ||
56 | data->predicted_us /= 100; | ||
57 | |||
50 | /* find the deepest idle state that satisfies our constraints */ | 58 | /* find the deepest idle state that satisfies our constraints */ |
51 | for (i = CPUIDLE_DRIVER_STATE_START + 1; i < dev->state_count; i++) { | 59 | for (i = CPUIDLE_DRIVER_STATE_START + 1; i < dev->state_count; i++) { |
52 | struct cpuidle_state *s = &dev->states[i]; | 60 | struct cpuidle_state *s = &dev->states[i]; |
@@ -97,7 +105,7 @@ static void menu_reflect(struct cpuidle_device *dev) | |||
97 | measured_us = -1; | 105 | measured_us = -1; |
98 | 106 | ||
99 | /* Predict time until next break event */ | 107 | /* Predict time until next break event */ |
100 | data->predicted_us = max(measured_us, data->last_measured_us); | 108 | data->current_predicted_us = max(measured_us, data->last_measured_us); |
101 | 109 | ||
102 | if (last_idle_us + BREAK_FUZZ < | 110 | if (last_idle_us + BREAK_FUZZ < |
103 | data->expected_us - target->exit_latency) { | 111 | data->expected_us - target->exit_latency) { |