blob: 80b7b3470dbebd64185253ecb17a0ef404a0422c [file] [log] [blame]
#!/bin/bash
#
# rcudelay.sh: Run a series of RCU, refcount, and rwlock reader-delay tests
#
# Usage: bash rcudelay.sh [ lastdelay [ ncpus [ ncpus ... ] ] ]
#
# Run this in a recent Linux-kernel source tree. On large systems,
# it may be necessary to adjust this script, for example, the
# taskset CPU list and the --cpus argument. (If for no other reason
# than kernel build times can be very long when restricted to a
# single CPU.)
#
# Note: "lastdelay" is in nanoseconds. The script starts at 100ns
# and steps logarithmically, as in 100, 200, 500, 1000, ...
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, you can access it online at
# http://www.gnu.org/licenses/gpl-2.0.html.
#
# Copyright (c) 2020 Paul E. McKenney, Facebook.
if test -r kernel/rcu/refperf*.c > /dev/null 2>&1
then
:
else
echo No 'rcuperf*.c': Need recent Linux kernel source tree.
exit 1
fi
if test -x tools/testing/selftests/rcutorture/bin/kvm-recheck-refperf*.sh > /dev/null 2>&1
then
:
else
echo No 'kvm-recheck-rcuperf*.c': Need recent Linux kernel source tree.
exit 1
fi
T=/tmp/rcudelay.sh.$$
trap 'rm -f $T' 0 2
lastdelay=${1-30}
shift > /dev/null 2>&1
maxcpu="`grep '^processor' /proc/cpuinfo | tail -1 | awk '{ print $3 }'`"
if test -z "$1"
then
cpus=$((maxcpu + 1))
else
cpus=$*
fi
primlist="`grep '\.name[ ]*=' kernel/rcu/refperf*.c |
sed -e 's/^[^"]*"//' -e 's/".*$//'`"
incr=1
for ncpus in $cpus
do
if ((ncpus > 100))
then
holdoff=20
else
holdoff=10
fi
if ((ncpus * 2 >= maxcpu))
then
holdoff=$((holdoff * 2))
fi
endcpu=$((ncpus - 1))
if test "$endcpu" -le 0
then
cpulist=0
else
cpulist=0-$endcpu
fi
curdelay=100
while ((curdelay <= lastdelay))
do
for prim in $primlist
do
taskset -c $cpulist tools/testing/selftests/rcutorture/bin/kvm.sh --cpus $ncpus --duration 10 --torture refperf --configs NOPREEMPT --bootargs "refperf.perf_type=$prim refperf.nreaders=$ncpus refperf.loops=10000 refperf.holdoff=$holdoff refperf.readdelay=$curdelay" --kconfig "CONFIG_NR_CPUS=$((maxcpu + 1))" --trust-make > $T 2>&1
ret=$?
fstr=""
resdir="`grep -m 1 '^Results directory: ' $T | sed -e 's/^Results directory: *//'`"
if test "$ret" != 0
then
fstr=" FAILED $T"
else
if test -d "$resdir"
then
rm -rf "$resdir"
fi
fi
echo Run for $prim with $ncpus CPUs and delay $curdelay$fstr
grep -E '^Points: | reader duration:' $T
done
curdelay=`echo $curdelay | sed -e 's/5/10/' -e t -e 's/2/5/' -e t -e 's/1/2/'`
done
done