On Tue, Aug 23, 2022 at 11:31:30AM +0800, Yu Kuai wrote: > From: Yu Kuai <yukuai3@xxxxxxxxxx> > > If new configuration is submitted while a bio is throttled, then new > waiting time is recalculated regardless that the bio might already wait > for some time: > > tg_conf_updated > throtl_start_new_slice > tg_update_disptime > throtl_schedule_next_dispatch > > Then io hung can be triggered by always submmiting new configuration > before the throttled bio is dispatched. > > Fix the problem by respecting the time that throttled bio already waited. > In order to do that, add new fields to record how many bytes/io are > waited, and use it to calculate wait time for throttled bio under new > configuration. > > Some simple test: > 1) > cd /sys/fs/cgroup/blkio/ > echo $$ > cgroup.procs > echo "8:0 2048" > blkio.throttle.write_bps_device > { > sleep 2 > echo "8:0 1024" > blkio.throttle.write_bps_device > } & > dd if=/dev/zero of=/dev/sda bs=8k count=1 oflag=direct > > 2) > cd /sys/fs/cgroup/blkio/ > echo $$ > cgroup.procs > echo "8:0 1024" > blkio.throttle.write_bps_device > { > sleep 4 > echo "8:0 2048" > blkio.throttle.write_bps_device > } & > dd if=/dev/zero of=/dev/sda bs=8k count=1 oflag=direct > > test results: io finish time > before this patch with this patch > 1) 10s 6s > 2) 8s 6s > > Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx> For 2-4, Acked-by: Tejun Heo <tj@xxxxxxxxxx> Thanks. -- tejun