diff options
-rw-r--r-- | drivers/cpuidle/governors/menu.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c index 68104434ebb5..73655aeb3a60 100644 --- a/drivers/cpuidle/governors/menu.c +++ b/drivers/cpuidle/governors/menu.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/hrtimer.h> | 18 | #include <linux/hrtimer.h> |
19 | #include <linux/tick.h> | 19 | #include <linux/tick.h> |
20 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
21 | #include <linux/math64.h> | ||
21 | 22 | ||
22 | #define BUCKETS 12 | 23 | #define BUCKETS 12 |
23 | #define RESOLUTION 1024 | 24 | #define RESOLUTION 1024 |
@@ -169,6 +170,12 @@ static DEFINE_PER_CPU(struct menu_device, menu_devices); | |||
169 | 170 | ||
170 | static void menu_update(struct cpuidle_device *dev); | 171 | static void menu_update(struct cpuidle_device *dev); |
171 | 172 | ||
173 | /* This implements DIV_ROUND_CLOSEST but avoids 64 bit division */ | ||
174 | static u64 div_round64(u64 dividend, u32 divisor) | ||
175 | { | ||
176 | return div_u64(dividend + (divisor / 2), divisor); | ||
177 | } | ||
178 | |||
172 | /** | 179 | /** |
173 | * menu_select - selects the next idle state to enter | 180 | * menu_select - selects the next idle state to enter |
174 | * @dev: the CPU | 181 | * @dev: the CPU |
@@ -209,9 +216,8 @@ static int menu_select(struct cpuidle_device *dev) | |||
209 | data->correction_factor[data->bucket] = RESOLUTION * DECAY; | 216 | data->correction_factor[data->bucket] = RESOLUTION * DECAY; |
210 | 217 | ||
211 | /* Make sure to round up for half microseconds */ | 218 | /* Make sure to round up for half microseconds */ |
212 | data->predicted_us = DIV_ROUND_CLOSEST( | 219 | data->predicted_us = div_round64(data->expected_us * data->correction_factor[data->bucket], |
213 | data->expected_us * data->correction_factor[data->bucket], | 220 | RESOLUTION * DECAY); |
214 | RESOLUTION * DECAY); | ||
215 | 221 | ||
216 | /* | 222 | /* |
217 | * We want to default to C1 (hlt), not to busy polling | 223 | * We want to default to C1 (hlt), not to busy polling |