Add flock-based locking to kvm.sh to prevent multiple instances from
running concurrently on the same source tree. This prevents build
failures caused by one instance's "make clean" deleting generated files
while another instance is building causing build failures.

The lock file is placed in the rcutorture directory and added to
.gitignore.

Signed-off-by: Joel Fernandes <[email protected]>
---
 tools/testing/selftests/rcutorture/.gitignore |  1 +
 tools/testing/selftests/rcutorture/bin/kvm.sh | 17 +++++++++++++++++
 2 files changed, 18 insertions(+)

diff --git a/tools/testing/selftests/rcutorture/.gitignore 
b/tools/testing/selftests/rcutorture/.gitignore
index f6cbce77460b..b8fd42547a6e 100644
--- a/tools/testing/selftests/rcutorture/.gitignore
+++ b/tools/testing/selftests/rcutorture/.gitignore
@@ -3,3 +3,4 @@ initrd
 b[0-9]*
 res
 *.swp
+.kvm.sh.lock
diff --git a/tools/testing/selftests/rcutorture/bin/kvm.sh 
b/tools/testing/selftests/rcutorture/bin/kvm.sh
index fff15821c44c..d1fbd092e22a 100755
--- a/tools/testing/selftests/rcutorture/bin/kvm.sh
+++ b/tools/testing/selftests/rcutorture/bin/kvm.sh
@@ -275,6 +275,23 @@ do
        shift
 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"
+if test -z "$dryrun"
+then
+       # Create a file descriptor and flock it, so that when kvm.sh (and its
+       # children) exit, the flock is released by the kernel automatically.
+       exec 9>"$TORTURE_LOCK"
+       if ! flock -n 9
+       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."
+               exit 1
+       fi
+fi
+
 if test -n "$dryrun" || test -z "$TORTURE_INITRD" || 
tools/testing/selftests/rcutorture/bin/mkinitrd.sh
 then
        :
-- 
2.34.1


Reply via email to