From 5e517ef09f48f0d7840b1a7163770aa04e6a9002 Mon Sep 17 00:00:00 2001 From: Nilay Shroff Date: Wed, 18 Dec 2024 19:13:22 +0530 Subject: [PATCH] throtl: fix the race between submitting IO and setting cgroup.procs The throttle test cases uses _throtl_issue_io function to submit IO to the device. This function typically runs in the background process however before this function starts execution and submit IO, we need to set the PID of the background process into cgroup.procs. The current implementation adds sleep 0.1 before _throtl_issue_io and it's assumed that during this sleep time of 0.1 second, we shall be able to write the PID of the background process to cgroup.procs. However this may not be always true as background process might starts running after sleep of 0.1 seconds (and hence start submitting IO) before we could actually write the PID of background process into cgroup.procs from the parent shell. This commit helps fix the above race condition by writing pid of the background/child process using $BASHPID into cgroup.procs. The $BASHPID returns the pid of the current bash process. So we leverage $BASHPID to first write the pid of the background/child job/process into cgroup.procs from within the child sub-shell and then start submitting IO. This way we eliminate the need of any communication between parent shell and the background/child shell process and that helps avoid the race. Signed-off-by: Nilay Shroff Reviewed-by: Yu Kuai Signed-off-by: Shin'ichiro Kawasaki --- tests/throtl/004 | 7 ++----- tests/throtl/005 | 7 ++----- tests/throtl/rc | 7 ++----- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/tests/throtl/004 b/tests/throtl/004 index 6e286123..d1461b99 100755 --- a/tests/throtl/004 +++ b/tests/throtl/004 @@ -21,16 +21,13 @@ test() { _throtl_set_limits wbps=$((1024 * 1024)) { - sleep 0.1 + echo "$BASHPID" > "$CGROUP2_DIR/$THROTL_DIR/cgroup.procs" _throtl_issue_io write 10M 1 } & - local pid=$! - echo "$pid" > "$CGROUP2_DIR/$THROTL_DIR/cgroup.procs" - sleep 0.6 echo 0 > "/sys/kernel/config/nullb/$THROTL_DEV/power" - wait "$pid" + wait $! _clean_up_throtl echo "Test complete" diff --git a/tests/throtl/005 b/tests/throtl/005 index 07782589..86e52b3a 100755 --- a/tests/throtl/005 +++ b/tests/throtl/005 @@ -20,16 +20,13 @@ test() { _throtl_set_limits wbps=$((512 * 1024)) { - sleep 0.1 + echo "$BASHPID" > "$CGROUP2_DIR/$THROTL_DIR/cgroup.procs" _throtl_issue_io write 1M 1 } & - local pid=$! - echo "$pid" > "$CGROUP2_DIR/$THROTL_DIR/cgroup.procs" - sleep 1 _throtl_set_limits wbps=$((256 * 1024)) - wait $pid + wait $! _throtl_remove_limits _clean_up_throtl diff --git a/tests/throtl/rc b/tests/throtl/rc index 330e6b93..df54cb91 100644 --- a/tests/throtl/rc +++ b/tests/throtl/rc @@ -97,18 +97,15 @@ _throtl_issue_io() { # IO and then print time elapsed to the second, blk-throttle limits should be # set before this function. _throtl_test_io() { - local pid { local rw=$1 local bs=$2 local count=$3 - sleep 0.1 + echo "$BASHPID" > "$CGROUP2_DIR/$THROTL_DIR/cgroup.procs" _throtl_issue_io "$rw" "$bs" "$count" } & - pid=$! - echo "$pid" > "$CGROUP2_DIR/$THROTL_DIR/cgroup.procs" - wait $pid + wait $! }