mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
blk-iocost: abort weight transfer on invalid donation weights
transfer_surpluses() warns and then keeps going when the donation
calculation produced invalid weights. The following propagation can then
divide by a zero hweight_inuse, so the warning is immediately followed by a
divide error.
When the check trips, abandon this period's donation transfer and release
the walk lists. This trades one period without donation for not crashing;
the invalid state is not expected on the normal path.
Developed with assistance from Claude Code (Anthropic): the assistant
analysed the failure path, drafted the change and ran the checks listed
below. The author reviewed the result and remains responsible for it.
Fixes: e08d02aa5f ("blk-iocost: implement Andy's method for donation weight updates")
Cc: stable@vger.kernel.org
Signed-off-by: Kunhai Dai <daikunhai@didiglobal.com>
Tested-by: Tao Cui <cuitao@kylinos.cn>
Reviewed-by: Tao Cui <cuitao@kylinos.cn>
Acked-by: Tejun Heo <tj@kernel.org>
Link: https://patch.msgid.link/20261019125412.3123895-2-daikunhai@didiglobal.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
08ebf69c78
commit
c810ee88cd
|
|
@ -1961,6 +1961,7 @@ static void transfer_surpluses(struct list_head *surpluses, struct ioc_now *now)
|
|||
pr_cont(": active=%u donating=%u after=%u\n",
|
||||
iocg->hweight_active, iocg->hweight_donating,
|
||||
iocg->hweight_after_donation);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2059,6 +2060,7 @@ static void transfer_surpluses(struct list_head *surpluses, struct ioc_now *now)
|
|||
__propagate_weights(iocg, iocg->active, inuse, true, now);
|
||||
}
|
||||
|
||||
out:
|
||||
/* walk list should be dissolved after use */
|
||||
list_for_each_entry_safe(iocg, tiocg, &inner_walk, walk_list)
|
||||
list_del_init(&iocg->walk_list);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user