diff options
| -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) { |
