mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
blk-iocost: fix divide-by-zero in transfer_surpluses()
Conceptually, root_iocg->hweight_donating must be less than WEIGHT_ONE but
all hweight calculations round up and thus it may end up >= WEIGHT_ONE
triggering divide-by-zero and other issues. Bound the value to avoid
surprises.
Fixes: e08d02aa5f
("blk-iocost: implement Andy's method for donation weight updates")
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
0806e60f31
commit
769b628de0
@ -1881,15 +1881,21 @@ static void transfer_surpluses(struct list_head *surpluses, struct ioc_now *now)
|
||||
|
||||
/*
|
||||
* Calculate the global donation rate (gamma) - the rate to adjust
|
||||
* non-donating budgets by. No need to use 64bit multiplication here as
|
||||
* the first operand is guaranteed to be smaller than WEIGHT_ONE
|
||||
* (1<<16).
|
||||
* non-donating budgets by.
|
||||
*
|
||||
* No need to use 64bit multiplication here as the first operand is
|
||||
* guaranteed to be smaller than WEIGHT_ONE (1<<16).
|
||||
*
|
||||
* We know that there are beneficiary nodes and the sum of the donating
|
||||
* hweights can't be whole; however, due to the round-ups during hweight
|
||||
* calculations, root_iocg->hweight_donating might still end up equal to
|
||||
* or greater than whole. Limit the range when calculating the divider.
|
||||
*
|
||||
* gamma = (1 - t_r') / (1 - t_r)
|
||||
*/
|
||||
gamma = DIV_ROUND_UP(
|
||||
(WEIGHT_ONE - root_iocg->hweight_after_donation) * WEIGHT_ONE,
|
||||
WEIGHT_ONE - root_iocg->hweight_donating);
|
||||
WEIGHT_ONE - min_t(u32, root_iocg->hweight_donating, WEIGHT_ONE - 1));
|
||||
|
||||
/*
|
||||
* Calculate adjusted hwi, child_adjusted_sum and inuse for the inner
|
||||
|
Loading…
Reference in New Issue
Block a user