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
|
* Calculate the global donation rate (gamma) - the rate to adjust
|
||||||
* non-donating budgets by. No need to use 64bit multiplication here as
|
* non-donating budgets by.
|
||||||
* the first operand is guaranteed to be smaller than WEIGHT_ONE
|
*
|
||||||
* (1<<16).
|
* 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 = (1 - t_r') / (1 - t_r)
|
||||||
*/
|
*/
|
||||||
gamma = DIV_ROUND_UP(
|
gamma = DIV_ROUND_UP(
|
||||||
(WEIGHT_ONE - root_iocg->hweight_after_donation) * WEIGHT_ONE,
|
(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
|
* Calculate adjusted hwi, child_adjusted_sum and inuse for the inner
|
||||||
|
Loading…
Reference in New Issue
Block a user