[PATCH -next 8/8] rcutorture: Add --kill-previous option to terminate previous kvm.sh runs

Joel Fernandes posted 8 patches 1 month, 1 week ago
[PATCH -next 8/8] rcutorture: Add --kill-previous option to terminate previous kvm.sh runs
Posted by Joel Fernandes 1 month, 1 week ago
When kvm.sh is killed, its child processes (make, gcc, qemu, etc.) may
continue running. This prevents new kvm.sh instances from starting even
though the parent is gone.

Add a --kill-previous option that uses fuser(1) to terminate all
processes holding the flock file before attempting to acquire it. This
provides a clean way to recover from stale/zombie kvm.sh runs which
sometimes may have lots of qemu and compiler processes still disturbing.

Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com>
---
 tools/testing/selftests/rcutorture/bin/kvm.sh | 25 ++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/rcutorture/bin/kvm.sh b/tools/testing/selftests/rcutorture/bin/kvm.sh
index d1fbd092e22a..65b04b832733 100755
--- a/tools/testing/selftests/rcutorture/bin/kvm.sh
+++ b/tools/testing/selftests/rcutorture/bin/kvm.sh
@@ -80,6 +80,7 @@ usage () {
 	echo "       --kasan"
 	echo "       --kconfig Kconfig-options"
 	echo "       --kcsan"
+	echo "       --kill-previous"
 	echo "       --kmake-arg kernel-make-arguments"
 	echo "       --mac nn:nn:nn:nn:nn:nn"
 	echo "       --memory megabytes|nnnG"
@@ -206,6 +207,9 @@ do
 	--kcsan)
 		TORTURE_KCONFIG_KCSAN_ARG="$debuginfo CONFIG_KCSAN=y CONFIG_KCSAN_STRICT=y CONFIG_KCSAN_REPORT_ONCE_IN_MS=100000 CONFIG_KCSAN_VERBOSE=y CONFIG_DEBUG_LOCK_ALLOC=y CONFIG_PROVE_LOCKING=y"; export TORTURE_KCONFIG_KCSAN_ARG
 		;;
+	--kill-previous)
+		TORTURE_KILL_PREVIOUS=1
+		;;
 	--kmake-arg|--kmake-args)
 		checkarg --kmake-arg "(kernel make arguments)" $# "$2" '.*' '^error$'
 		TORTURE_KMAKE_ARG="`echo "$TORTURE_KMAKE_ARG $2" | sed -e 's/^ *//' -e 's/ *$//'`"
@@ -278,6 +282,25 @@ done
 # Prevent concurrent kvm.sh runs on the same source tree.  The flock
 # is automatically released when the script exits, even if killed.
 TORTURE_LOCK="$RCUTORTURE/.kvm.sh.lock"
+
+# Terminate any processes holding the lock file, if requested.
+if test -n "$TORTURE_KILL_PREVIOUS"
+then
+	if test -e "$TORTURE_LOCK"
+	then
+		echo "Killing processes holding $TORTURE_LOCK..."
+		if fuser -k "$TORTURE_LOCK" >/dev/null 2>&1
+		then
+			sleep 2
+			echo "Previous kvm.sh processes killed."
+		else
+			echo "No processes were holding the lock."
+		fi
+	else
+		echo "No lock file exists, nothing to kill."
+	fi
+fi
+
 if test -z "$dryrun"
 then
 	# Create a file descriptor and flock it, so that when kvm.sh (and its
@@ -287,7 +310,7 @@ then
 	then
 		echo "ERROR: Another kvm.sh instance is already running on this tree."
 		echo "       Lock file: $TORTURE_LOCK"
-		echo "       To run kvm.sh, kill all existing kvm.sh runs first."
+		echo "       To run kvm.sh, kill all existing kvm.sh runs first (--kill-previous)."
 		exit 1
 	fi
 fi
-- 
2.34.1
Re: [PATCH -next 8/8] rcutorture: Add --kill-previous option to terminate previous kvm.sh runs
Posted by Paul E. McKenney 1 month, 1 week ago
On Thu, Jan 01, 2026 at 11:34:17AM -0500, Joel Fernandes wrote:
> When kvm.sh is killed, its child processes (make, gcc, qemu, etc.) may
> continue running. This prevents new kvm.sh instances from starting even
> though the parent is gone.
> 
> Add a --kill-previous option that uses fuser(1) to terminate all
> processes holding the flock file before attempting to acquire it. This
> provides a clean way to recover from stale/zombie kvm.sh runs which
> sometimes may have lots of qemu and compiler processes still disturbing.
> 
> Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com>

For #7 and #8:

Tested-by: Paul E. McKenney <paulmck@kernel.org>

One way to kill the current/previous run without starting a new one is
to use the --dryrun argument.

							Thanx, Paul

> ---
>  tools/testing/selftests/rcutorture/bin/kvm.sh | 25 ++++++++++++++++++-
>  1 file changed, 24 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/testing/selftests/rcutorture/bin/kvm.sh b/tools/testing/selftests/rcutorture/bin/kvm.sh
> index d1fbd092e22a..65b04b832733 100755
> --- a/tools/testing/selftests/rcutorture/bin/kvm.sh
> +++ b/tools/testing/selftests/rcutorture/bin/kvm.sh
> @@ -80,6 +80,7 @@ usage () {
>  	echo "       --kasan"
>  	echo "       --kconfig Kconfig-options"
>  	echo "       --kcsan"
> +	echo "       --kill-previous"
>  	echo "       --kmake-arg kernel-make-arguments"
>  	echo "       --mac nn:nn:nn:nn:nn:nn"
>  	echo "       --memory megabytes|nnnG"
> @@ -206,6 +207,9 @@ do
>  	--kcsan)
>  		TORTURE_KCONFIG_KCSAN_ARG="$debuginfo CONFIG_KCSAN=y CONFIG_KCSAN_STRICT=y CONFIG_KCSAN_REPORT_ONCE_IN_MS=100000 CONFIG_KCSAN_VERBOSE=y CONFIG_DEBUG_LOCK_ALLOC=y CONFIG_PROVE_LOCKING=y"; export TORTURE_KCONFIG_KCSAN_ARG
>  		;;
> +	--kill-previous)
> +		TORTURE_KILL_PREVIOUS=1
> +		;;
>  	--kmake-arg|--kmake-args)
>  		checkarg --kmake-arg "(kernel make arguments)" $# "$2" '.*' '^error$'
>  		TORTURE_KMAKE_ARG="`echo "$TORTURE_KMAKE_ARG $2" | sed -e 's/^ *//' -e 's/ *$//'`"
> @@ -278,6 +282,25 @@ done
>  # Prevent concurrent kvm.sh runs on the same source tree.  The flock
>  # is automatically released when the script exits, even if killed.
>  TORTURE_LOCK="$RCUTORTURE/.kvm.sh.lock"
> +
> +# Terminate any processes holding the lock file, if requested.
> +if test -n "$TORTURE_KILL_PREVIOUS"
> +then
> +	if test -e "$TORTURE_LOCK"
> +	then
> +		echo "Killing processes holding $TORTURE_LOCK..."
> +		if fuser -k "$TORTURE_LOCK" >/dev/null 2>&1
> +		then
> +			sleep 2
> +			echo "Previous kvm.sh processes killed."
> +		else
> +			echo "No processes were holding the lock."
> +		fi
> +	else
> +		echo "No lock file exists, nothing to kill."
> +	fi
> +fi
> +
>  if test -z "$dryrun"
>  then
>  	# Create a file descriptor and flock it, so that when kvm.sh (and its
> @@ -287,7 +310,7 @@ then
>  	then
>  		echo "ERROR: Another kvm.sh instance is already running on this tree."
>  		echo "       Lock file: $TORTURE_LOCK"
> -		echo "       To run kvm.sh, kill all existing kvm.sh runs first."
> +		echo "       To run kvm.sh, kill all existing kvm.sh runs first (--kill-previous)."
>  		exit 1
>  	fi
>  fi
> -- 
> 2.34.1
>