Skip to content

Commit

Permalink
throtl: fix the race between submitting IO and setting cgroup.procs
Browse files Browse the repository at this point in the history
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 <nilay@linux.ibm.com>
Reviewed-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
  • Loading branch information
shroffni authored and kawasaki committed Jan 16, 2025
1 parent 65ea613 commit 5e517ef
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 15 deletions.
7 changes: 2 additions & 5 deletions tests/throtl/004
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
7 changes: 2 additions & 5 deletions tests/throtl/005
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 2 additions & 5 deletions tests/throtl/rc
Original file line number Diff line number Diff line change
Expand Up @@ -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 $!
}

0 comments on commit 5e517ef

Please # to comment.