diff options
author | Javi Merino <javi.merino@arm.com> | 2015-05-02 05:15:24 -0400 |
---|---|---|
committer | Eduardo Valentin <edubezval@gmail.com> | 2015-05-11 21:57:44 -0400 |
commit | ea54cac9065112724f3432e0574ba3e346fd695d (patch) | |
tree | 1d8fab906d5d50ee2ebf374ac480b1559fdfd077 /drivers/thermal | |
parent | 488c7455d74ce0c354ea833c7fbbb6ba0a2330e9 (diff) |
thermal: power_allocator: round the division when divvying up power
In situations where there is an uneven number of cooling devices, the
division of power among them can lead to a milliwatt being dropped on
the floor due to rounding errors. This doesn't sound like a lot, but
some devices only grant the lowest cooling device state for their
maximum power. So for instance, if the granted_power is the maximum
power and all devices are getting their maximum power, one would get
max_power - 1, making it choose cooling device state 1, instead of 0.
Round the division to make the calculation more accurate.
Cc: Zhang Rui <rui.zhang@intel.com>
Cc: Eduardo Valentin <edubezval@gmail.com>
Signed-off-by: Javi Merino <javi.merino@arm.com>
Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
Diffstat (limited to 'drivers/thermal')
-rw-r--r-- | drivers/thermal/power_allocator.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/thermal/power_allocator.c b/drivers/thermal/power_allocator.c index 3ca7530deac6..4672250b329f 100644 --- a/drivers/thermal/power_allocator.c +++ b/drivers/thermal/power_allocator.c | |||
@@ -196,7 +196,8 @@ static void divvy_up_power(u32 *req_power, u32 *max_power, int num_actors, | |||
196 | for (i = 0; i < num_actors; i++) { | 196 | for (i = 0; i < num_actors; i++) { |
197 | u64 req_range = req_power[i] * power_range; | 197 | u64 req_range = req_power[i] * power_range; |
198 | 198 | ||
199 | granted_power[i] = div_u64(req_range, total_req_power); | 199 | granted_power[i] = DIV_ROUND_CLOSEST_ULL(req_range, |
200 | total_req_power); | ||
200 | 201 | ||
201 | if (granted_power[i] > max_power[i]) { | 202 | if (granted_power[i] > max_power[i]) { |
202 | extra_power += granted_power[i] - max_power[i]; | 203 | extra_power += granted_power[i] - max_power[i]; |