On Wed, Aug 16, 2023 at 09:27:08AM +0800, Yu Kuai wrote: > From: Yu Kuai <yukuai3@xxxxxxxxxx> > > Currently, 'carryover_ios/bytes' is not handled in throtl_trim_slice(), > for consequence, 'carryover_ios/bytes' will be used to throttle bio > multiple times, for example: > > 1) set iops limit to 100, and slice start is 0, slice end is 100ms; > 2) current time is 0, and 10 ios are dispatched, those io won't be > throttled and io_disp is 10; > 3) still at current time 0, update iops limit to 1000, carryover_ios is > updated to (0 - 10) = -10; > 4) in this slice(0 - 100ms), io_allowed = 100 + (-10) = 90, which means > only 90 ios can be dispatched without waiting; > 5) assume that io is throttled in slice(0 - 100ms), and > throtl_trim_slice() update silce to (100ms - 200ms). In this case, > 'carryover_ios/bytes' is not cleared and still only 90 ios can be > dispatched between 100ms - 200ms. > > Fix this problem by updating 'carryover_ios/bytes' in > throtl_trim_slice(). > > Fixes: a880ae93e5b5 ("blk-throttle: fix io hung due to configuration updates") > Reported-by: zhuxiaohui <zhuxiaohui.400@xxxxxxxxxxxxx> > Link: https://lore.kernel.org/all/20230812072116.42321-1-zhuxiaohui.400@xxxxxxxxxxxxx/ > Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx> Acked-by: Tejun Heo <tj@xxxxxxxxxx> Thanks. -- tejun