When bisecting RCU issues, it is often the case that the first error in an unsuccessful run will happen quickly, but that a successful run must go on for some time in order to obtain a sufficiently low false-negative error rate. In many cases, a bisection requires multiple concurrent runs, in which case the first failure in any run indicates failure, pure and simple. In such cases, it would speed things up greatly if the first failure terminated all runs. This commit therefore adds scripting that checks for a file named "STOP" in the top-level results directory, terminating the run when it appears. Note that in-progress builds will continue until completion, but future builds and all runs will be cut short. Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
103 lines
2.2 KiB
Bash
Executable File
103 lines
2.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0+
|
|
#
|
|
# Alternate sleeping and spinning on randomly selected CPUs. The purpose
|
|
# of this script is to inflict random OS jitter on a concurrently running
|
|
# test.
|
|
#
|
|
# Usage: jitter.sh me duration [ sleepmax [ spinmax ] ]
|
|
#
|
|
# me: Random-number-generator seed salt.
|
|
# duration: Time to run in seconds.
|
|
# sleepmax: Maximum microseconds to sleep, defaults to one second.
|
|
# spinmax: Maximum microseconds to spin, defaults to one millisecond.
|
|
#
|
|
# Copyright (C) IBM Corporation, 2016
|
|
#
|
|
# Authors: Paul E. McKenney <paulmck@linux.ibm.com>
|
|
|
|
me=$(($1 * 1000))
|
|
duration=$2
|
|
sleepmax=${3-1000000}
|
|
spinmax=${4-1000}
|
|
|
|
n=1
|
|
|
|
starttime=`gawk 'BEGIN { print systime(); }' < /dev/null`
|
|
|
|
nohotplugcpus=
|
|
for i in /sys/devices/system/cpu/cpu[0-9]*
|
|
do
|
|
if test -f $i/online
|
|
then
|
|
:
|
|
else
|
|
curcpu=`echo $i | sed -e 's/^[^0-9]*//'`
|
|
nohotplugcpus="$nohotplugcpus $curcpu"
|
|
fi
|
|
done
|
|
|
|
while :
|
|
do
|
|
# Check for done.
|
|
t=`gawk -v s=$starttime 'BEGIN { print systime() - s; }' < /dev/null`
|
|
if test "$t" -gt "$duration"
|
|
then
|
|
exit 0;
|
|
fi
|
|
|
|
# Check for stop request.
|
|
if test -f "$TORTURE_STOPFILE"
|
|
then
|
|
exit 1;
|
|
fi
|
|
|
|
# Set affinity to randomly selected online CPU
|
|
if cpus=`grep 1 /sys/devices/system/cpu/*/online 2>&1 |
|
|
sed -e 's,/[^/]*$,,' -e 's/^[^0-9]*//'`
|
|
then
|
|
:
|
|
else
|
|
cpus=
|
|
fi
|
|
# Do not leave out non-hot-pluggable CPUs
|
|
cpus="$cpus $nohotplugcpus"
|
|
|
|
cpumask=`awk -v cpus="$cpus" -v me=$me -v n=$n 'BEGIN {
|
|
srand(n + me + systime());
|
|
ncpus = split(cpus, ca);
|
|
curcpu = ca[int(rand() * ncpus + 1)];
|
|
mask = lshift(1, curcpu);
|
|
if (mask + 0 <= 0)
|
|
mask = 1;
|
|
printf("%#x\n", mask);
|
|
}' < /dev/null`
|
|
n=$(($n+1))
|
|
if ! taskset -p $cpumask $$ > /dev/null 2>&1
|
|
then
|
|
echo taskset failure: '"taskset -p ' $cpumask $$ '"'
|
|
exit 1
|
|
fi
|
|
|
|
# Sleep a random duration
|
|
sleeptime=`awk -v me=$me -v n=$n -v sleepmax=$sleepmax 'BEGIN {
|
|
srand(n + me + systime());
|
|
printf("%06d", int(rand() * sleepmax));
|
|
}' < /dev/null`
|
|
n=$(($n+1))
|
|
sleep .$sleeptime
|
|
|
|
# Spin a random duration
|
|
limit=`awk -v me=$me -v n=$n -v spinmax=$spinmax 'BEGIN {
|
|
srand(n + me + systime());
|
|
printf("%06d", int(rand() * spinmax));
|
|
}' < /dev/null`
|
|
n=$(($n+1))
|
|
for i in {1..$limit}
|
|
do
|
|
echo > /dev/null
|
|
done
|
|
done
|
|
|
|
exit 1
|