linux/block
Yu Kuai 29cb955934 blk-throttle: fix lower bps rate by throtl_trim_slice()
The bio submission time may be a few jiffies more than the expected
waiting time, due to 'extra_bytes' can't be divided in
tg_within_bps_limit(), and also due to timer wakeup delay.
In this case, adjust slice_start to jiffies will discard the extra wait time,
causing lower rate than expected.

Current in-tree code already covers deviation by rounddown(), but turns
out it is not enough, because jiffies - slice_start can be a multiple of
throtl_slice.

For example, assume bps_limit is 1000bytes, 1 jiffes is 10ms, and
slice is 20ms(2 jiffies), expected rate is 1000 / 1000 * 20 = 20 bytes
per slice.

If user issues two 21 bytes IO, then wait time will be 30ms for the
first IO:

bytes_allowed = 20, extra_bytes = 1;
jiffy_wait = 1 + 2 = 3 jiffies

and consider
extra 1 jiffies by timer, throtl_trim_slice() will be called at:

jiffies = 40ms
slice_start = 0ms, slice_end= 40ms
bytes_disp = 21

In this case, before the patch, real rate in the first two slices is
10.5 bytes per slice, and slice will be updated to:

jiffies = 40ms
slice_start = 40ms, slice_end = 60ms,
bytes_disp = 0;

Hence the second IO will have to wait another 30ms;

With the patch, the real rate in the first slice is 20 bytes per slice,
which is the same as expected, and slice will be updated:

jiffies=40ms,
slice_start = 20ms, slice_end = 60ms,
bytes_disp = 1;

And now, there is still 19 bytes allowed in the second slice, and the
second IO will only have to wait 10ms;

This problem will cause blktests throtl/001 failure in case of
CONFIG_HZ_100=y, fix it by preserving one extra finished slice in
throtl_trim_slice().

Fixes: e43473b7f2 ("blkio: Core implementation of throttle policy")
Reported-by: Ming Lei <ming.lei@redhat.com>
Closes: https://lore.kernel.org/linux-block/20250222092823.210318-3-yukuai1@huaweicloud.com/
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Link: https://lore.kernel.org/r/20250227120645.812815-1-yukuai1@huaweicloud.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2025-03-05 16:24:30 -07:00
..
partitions block: Remove commented out code 2025-02-21 17:12:21 -07:00
badblocks.c badblocks: avoid checking invalid range in badblocks_check() 2023-12-23 18:38:08 -07:00
bdev.c block/bdev: use helper for max block size check 2024-12-18 07:22:30 -07:00
bfq-cgroup.c Revert "block, bfq: merge bfq_release_process_ref() into bfq_put_cooperator()" 2024-11-19 19:05:32 -07:00
bfq-iosched.c for-6.14/block-20250118 2025-01-20 19:38:46 -08:00
bfq-iosched.h block, bfq: remove bfq_log_bfqg() 2024-09-10 16:32:09 -06:00
bfq-wf2q.c
bio-integrity-auto.c block: split struct bio_integrity_payload 2025-03-03 11:17:52 -07:00
bio-integrity.c block: split struct bio_integrity_payload 2025-03-03 11:17:52 -07:00
bio.c block: split struct bio_integrity_payload 2025-03-03 11:17:52 -07:00
blk-cgroup-fc-appid.c block: Replace all non-returning strlcpy with strscpy 2023-06-01 09:13:31 -06:00
blk-cgroup-rwstat.c blk-cgroup: use group allocation/free of per-cpu counters API 2024-04-03 09:10:17 -06:00
blk-cgroup-rwstat.h blk-cgroup: rwstat: fix kernel-doc warnings in header file 2025-01-13 07:47:09 -07:00
blk-cgroup.c block-6.14-20250131 2025-01-31 11:49:30 -08:00
blk-cgroup.h blk-cgroup: fix kernel-doc warnings in header file 2025-01-13 07:46:55 -07:00
blk-core.c block: get rid of request queue ->sysfs_dir_lock 2025-01-29 07:16:47 -07:00
blk-crypto-fallback.c blk-crypto: add basic hardware-wrapped key support 2025-02-10 09:54:19 -07:00
blk-crypto-internal.h blk-crypto: add ioctls to create and prepare hardware-wrapped keys 2025-02-10 09:54:19 -07:00
blk-crypto-profile.c blk-crypto: add ioctls to create and prepare hardware-wrapped keys 2025-02-10 09:54:19 -07:00
blk-crypto-sysfs.c blk-crypto: show supported key types in sysfs 2025-02-10 09:54:19 -07:00
blk-crypto.c blk-crypto: add ioctls to create and prepare hardware-wrapped keys 2025-02-10 09:54:19 -07:00
blk-flush.c for-6.11/block-20240710 2024-07-15 14:20:22 -07:00
blk-ia-ranges.c block: get rid of request queue ->sysfs_dir_lock 2025-01-29 07:16:47 -07:00
blk-integrity.c for-6.14/io_uring-20250119 2025-01-20 20:27:33 -08:00
blk-ioc.c block: replace call_rcu by kfree_rcu for simple kmem_cache_free callback 2024-10-22 08:16:40 -06:00
blk-iocost.c block: introduce init_wait_func() 2025-02-11 13:04:11 -07:00
blk-iolatency.c block: force noio scope in blk_mq_freeze_queue 2025-01-31 07:20:08 -07:00
blk-ioprio.c blk-ioprio: remove per-disk structure 2024-07-28 16:47:51 -06:00
blk-ioprio.h blk-ioprio: remove per-disk structure 2024-07-28 16:47:51 -06:00
blk-lib.c block: fix detection of unsupported WRITE SAME in blkdev_issue_write_zeroes 2024-08-28 08:49:25 -06:00
blk-map.c block: remove blk_rq_bio_prep 2025-01-04 15:27:35 -07:00
blk-merge.c block: add a dma mapping iterator 2025-01-06 07:37:11 -07:00
blk-mq-cpumap.c blk-mq: create correct map for fallback case 2025-01-23 06:34:32 -07:00
blk-mq-debugfs.c block: simplify tag allocation policy selection 2025-01-06 07:37:41 -07:00
blk-mq-debugfs.h block: Replace zone_wlock debugfs entry with zone_wplugs entry 2024-04-17 08:44:03 -06:00
blk-mq-sched.c block: remove BLK_MQ_F_SHOULD_MERGE 2024-12-23 08:17:23 -07:00
blk-mq-sched.h blk-mq: make sure elevator callbacks aren't called for passthrough request 2023-05-18 19:42:54 -06:00
blk-mq-sysfs.c block: fix nr_hw_queue update racing with disk addition/removal 2025-01-29 07:16:47 -07:00
blk-mq-tag.c block: simplify tag allocation policy selection 2025-01-06 07:37:41 -07:00
blk-mq.c block: force noio scope in blk_mq_freeze_queue 2025-01-31 07:20:08 -07:00
blk-mq.h block: don't update BLK_FEAT_POLL in __blk_mq_update_nr_hw_queues 2025-01-10 07:29:23 -07:00
blk-pm.c block: force noio scope in blk_mq_freeze_queue 2025-01-31 07:20:08 -07:00
blk-pm.h
blk-rq-qos.c block: refactor rq_qos_wait() 2025-02-11 13:04:11 -07:00
blk-rq-qos.h block: skip QUEUE_FLAG_STATS and rq-qos for passthrough io 2023-12-01 18:29:18 -07:00
blk-settings.c block: mark bounce buffering as incompatible with integrity 2025-03-03 11:17:52 -07:00
blk-stat.c blk-throttle: remove CONFIG_BLK_DEV_THROTTLING_LOW 2024-05-09 09:44:55 -06:00
blk-stat.h block: delete redundant function declaration 2024-05-27 13:58:06 -06:00
blk-sysfs.c block: force noio scope in blk_mq_freeze_queue 2025-01-31 07:20:08 -07:00
blk-throttle.c blk-throttle: fix lower bps rate by throtl_trim_slice() 2025-03-05 16:24:30 -07:00
blk-throttle.h blk-throttle: remove last_low_overflow_time 2024-09-10 16:31:41 -06:00
blk-timeout.c
blk-wbt.c blk-wbt: Cleanup a comment in wb_timer_fn 2025-02-25 08:43:52 -07:00
blk-wbt.h blk-wbt: remove the separate write cache tracking 2023-12-26 09:28:10 -07:00
blk-zoned.c block: force noio scope in blk_mq_freeze_queue 2025-01-31 07:20:08 -07:00
blk.h block: split struct bio_integrity_payload 2025-03-03 11:17:52 -07:00
bounce.c block: mark bounce buffering as incompatible with integrity 2025-03-03 11:17:52 -07:00
bsg-lib.c block: remove BLK_MQ_F_NO_SCHED 2025-01-06 07:37:41 -07:00
bsg.c SCSI misc on 20230629 2023-06-30 11:57:07 -07:00
disk-events.c block: move bdev_mark_dead out of disk_check_media_change 2023-10-28 13:29:23 +02:00
early-lookup.c wrapper for access to ->bd_partno 2024-05-02 17:48:09 -04:00
elevator.c block: force noio scope in blk_mq_freeze_queue 2025-01-31 07:20:08 -07:00
elevator.h elevator: Enable const sysfs attributes 2025-01-02 13:20:29 -07:00
fops.c block: don't revert iter for -EIOCBQUEUED 2025-01-23 06:18:41 -07:00
genhd.c block: limit disk max sectors to (LLONG_MAX >> 9) 2025-01-15 15:46:56 -07:00
holder.c block: fix deadlock between bd_link_disk_holder and partition scan 2024-02-23 07:44:19 -07:00
ioctl.c blk-crypto: add ioctls to create and prepare hardware-wrapped keys 2025-02-10 09:54:19 -07:00
ioprio.c block: move __get_task_ioprio() into header file 2024-01-08 12:27:39 -07:00
Kconfig block: remove the blk_integrity_profile structure 2024-06-14 10:20:06 -06:00
Kconfig.iosched
kyber-iosched.c kyber: constify sysfs attributes 2025-01-02 13:20:29 -07:00
Makefile block: move the block layer auto-integrity code into a new file 2025-03-03 11:17:52 -07:00
mq-deadline.c block: mq-deadline: Constify sysfs attributes 2025-01-02 13:20:29 -07:00
opal_proto.h block: sed-opal: handle empty atoms when parsing response 2024-02-16 15:52:45 -07:00
sed-opal.c block: sed-opal: add ioctl IOC_OPAL_SET_SID_PW 2024-10-22 08:16:40 -06:00
t10-pi.c block: split struct bio_integrity_payload 2025-03-03 11:17:52 -07:00