new file mode 100755
@@ -0,0 +1,82 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-3.0+
+# Copyright (C) 2024 Yu Kuai
+#
+# Test bps limit work correctly for big IO of blk-throttle, regression test for
+# commie 111be8839817 ("block-throttle: avoid double charge")
+
+. tests/throtl/rc
+
+DESCRIPTION="bps limit over IO split"
+QUICK=1
+
+CG=/sys/fs/cgroup
+TEST_DIR=$CG/blktests_throtl
+devname=nullb0
+dev=""
+
+set_up_test() {
+ if ! _init_null_blk max_sectors=8; then
+ return 1;
+ fi
+
+ dev=$(cat /sys/block/$devname/dev)
+ echo +io > $CG/cgroup.subtree_control
+ mkdir $TEST_DIR
+
+ return 0;
+}
+
+clean_up_test() {
+ rmdir $TEST_DIR
+ echo -io > $CG/cgroup.subtree_control
+ _exit_null_blk
+}
+
+config_throtl() {
+ echo "$dev $*" > $TEST_DIR/io.max
+}
+
+remove_config() {
+ echo "$dev rbps=max wbps=max riops=max wiops=max" > $TEST_DIR/io.max
+}
+
+test_io() {
+ config_throtl "$1"
+
+ {
+ sleep 0.1
+ start_time=$(date +%s.%N)
+
+ if [ "$2" == "read" ]; then
+ dd if=/dev/$devname of=/dev/null bs=1M count=1 iflag=direct status=none
+ elif [ "$2" == "write" ]; then
+ dd of=/dev/$devname if=/dev/zero bs=1M count=1 oflag=direct status=none
+ fi
+
+ end_time=$(date +%s.%N)
+ elapsed=$(echo "$end_time - $start_time" | bc)
+ printf "%.0f\n" "$elapsed"
+ } &
+
+ pid=$!
+ echo $! > $TEST_DIR/cgroup.procs
+ wait $pid
+
+ remove_config
+}
+
+test() {
+ echo "Running ${TEST_NAME}"
+
+ if ! set_up_test; then
+ return 1;
+ fi
+
+ limit=$((1024 * 1024))
+ test_io wbps=$limit write
+ test_io rbps=$limit read
+
+ clean_up_test
+ echo "Test complete"
+}
new file mode 100644
@@ -0,0 +1,4 @@
+Running throtl/003
+1
+1
+Test complete