Merge branch 'for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu into core/rcu
Pull the v5.9 RCU bits from Paul E. McKenney: - Documentation updates - Miscellaneous fixes - kfree_rcu updates - RCU tasks updates - Read-side scalability tests - SRCU updates - Torture-test updates Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
@@ -32,11 +32,11 @@ if test -z "$TORTURE_TRUST_MAKE"
|
||||
then
|
||||
make clean > $resdir/Make.clean 2>&1
|
||||
fi
|
||||
make $TORTURE_DEFCONFIG > $resdir/Make.defconfig.out 2>&1
|
||||
make $TORTURE_KMAKE_ARG $TORTURE_DEFCONFIG > $resdir/Make.defconfig.out 2>&1
|
||||
mv .config .config.sav
|
||||
sh $T/upd.sh < .config.sav > .config
|
||||
cp .config .config.new
|
||||
yes '' | make oldconfig > $resdir/Make.oldconfig.out 2> $resdir/Make.oldconfig.err
|
||||
yes '' | make $TORTURE_KMAKE_ARG oldconfig > $resdir/Make.oldconfig.out 2> $resdir/Make.oldconfig.err
|
||||
|
||||
# verify new config matches specification.
|
||||
configcheck.sh .config $c
|
||||
|
16
tools/testing/selftests/rcutorture/bin/console-badness.sh
Executable file
16
tools/testing/selftests/rcutorture/bin/console-badness.sh
Executable file
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
# Scan standard input for error messages, dumping any found to standard
|
||||
# output.
|
||||
#
|
||||
# Usage: console-badness.sh
|
||||
#
|
||||
# Copyright (C) 2020 Facebook, Inc.
|
||||
#
|
||||
# Authors: Paul E. McKenney <paulmck@kernel.org>
|
||||
|
||||
egrep 'Badness|WARNING:|Warn|BUG|===========|Call Trace:|Oops:|detected stalls on CPUs/tasks:|self-detected stall on CPU|Stall ended before state dump start|\?\?\? Writer stall state|rcu_.*kthread starved for|!!!' |
|
||||
grep -v 'ODEBUG: ' |
|
||||
grep -v 'This means that this is a DEBUG kernel and it is' |
|
||||
grep -v 'Warning: unable to open an initial console'
|
@@ -215,9 +215,6 @@ identify_qemu_args () {
|
||||
then
|
||||
echo -device spapr-vlan,netdev=net0,mac=$TORTURE_QEMU_MAC
|
||||
echo -netdev bridge,br=br0,id=net0
|
||||
elif test -n "$TORTURE_QEMU_INTERACTIVE"
|
||||
then
|
||||
echo -net nic -net user
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
@@ -234,7 +231,7 @@ identify_qemu_args () {
|
||||
# Returns the number of virtual CPUs available to the aggregate of the
|
||||
# guest OSes.
|
||||
identify_qemu_vcpus () {
|
||||
lscpu | grep '^CPU(s):' | sed -e 's/CPU(s)://'
|
||||
lscpu | grep '^CPU(s):' | sed -e 's/CPU(s)://' -e 's/[ ]*//g'
|
||||
}
|
||||
|
||||
# print_bug
|
||||
@@ -275,3 +272,21 @@ specify_qemu_cpus () {
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
# specify_qemu_net qemu-args
|
||||
#
|
||||
# Appends a string containing "-net none" to qemu-args, unless the incoming
|
||||
# qemu-args already contains "-smp" or unless the TORTURE_QEMU_INTERACTIVE
|
||||
# environment variable is set, in which case the string that is be added is
|
||||
# instead "-net nic -net user".
|
||||
specify_qemu_net () {
|
||||
if echo $1 | grep -q -e -net
|
||||
then
|
||||
echo $1
|
||||
elif test -n "$TORTURE_QEMU_INTERACTIVE"
|
||||
then
|
||||
echo $1 -net nic -net user
|
||||
else
|
||||
echo $1 -net none
|
||||
fi
|
||||
}
|
||||
|
@@ -46,6 +46,12 @@ do
|
||||
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]*//'`
|
||||
|
@@ -9,6 +9,12 @@
|
||||
#
|
||||
# Authors: Paul E. McKenney <paulmck@linux.ibm.com>
|
||||
|
||||
if test -f "$TORTURE_STOPFILE"
|
||||
then
|
||||
echo "kvm-build.sh early exit due to run STOP request"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
config_template=${1}
|
||||
if test -z "$config_template" -o ! -f "$config_template" -o ! -r "$config_template"
|
||||
then
|
||||
|
108
tools/testing/selftests/rcutorture/bin/kvm-check-branches.sh
Executable file
108
tools/testing/selftests/rcutorture/bin/kvm-check-branches.sh
Executable file
@@ -0,0 +1,108 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
# Run a group of kvm.sh tests on the specified commits. This currently
|
||||
# unconditionally does three-minute runs on each scenario in CFLIST,
|
||||
# taking advantage of all available CPUs and trusting the "make" utility.
|
||||
# In the short term, adjustments can be made by editing this script and
|
||||
# CFLIST. If some adjustments appear to have ongoing value, this script
|
||||
# might grow some command-line arguments.
|
||||
#
|
||||
# Usage: kvm-check-branches.sh commit1 commit2..commit3 commit4 ...
|
||||
#
|
||||
# This script considers its arguments one at a time. If more elaborate
|
||||
# specification of commits is needed, please use "git rev-list" to
|
||||
# produce something that this simple script can understand. The reason
|
||||
# for retaining the simplicity is that it allows the user to more easily
|
||||
# see which commit came from which branch.
|
||||
#
|
||||
# This script creates a yyyy.mm.dd-hh.mm.ss-group entry in the "res"
|
||||
# directory. The calls to kvm.sh create the usual entries, but this script
|
||||
# moves them under the yyyy.mm.dd-hh.mm.ss-group entry, each in its own
|
||||
# directory numbered in run order, that is, "0001", "0002", and so on.
|
||||
# For successful runs, the large build artifacts are removed. Doing this
|
||||
# reduces the disk space required by about two orders of magnitude for
|
||||
# successful runs.
|
||||
#
|
||||
# Copyright (C) Facebook, 2020
|
||||
#
|
||||
# Authors: Paul E. McKenney <paulmck@kernel.org>
|
||||
|
||||
if ! git status > /dev/null 2>&1
|
||||
then
|
||||
echo '!!!' This script needs to run in a git archive. 1>&2
|
||||
echo '!!!' Giving up. 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Remember where we started so that we can get back and the end.
|
||||
curcommit="`git status | head -1 | awk '{ print $NF }'`"
|
||||
|
||||
nfail=0
|
||||
ntry=0
|
||||
resdir="tools/testing/selftests/rcutorture/res"
|
||||
ds="`date +%Y.%m.%d-%H.%M.%S`-group"
|
||||
if ! test -e $resdir
|
||||
then
|
||||
mkdir $resdir || :
|
||||
fi
|
||||
mkdir $resdir/$ds
|
||||
echo Results directory: $resdir/$ds
|
||||
|
||||
KVM="`pwd`/tools/testing/selftests/rcutorture"; export KVM
|
||||
PATH=${KVM}/bin:$PATH; export PATH
|
||||
. functions.sh
|
||||
cpus="`identify_qemu_vcpus`"
|
||||
echo Using up to $cpus CPUs.
|
||||
|
||||
# Each pass through this loop does one command-line argument.
|
||||
for gitbr in $@
|
||||
do
|
||||
echo ' --- git branch ' $gitbr
|
||||
|
||||
# Each pass through this loop tests one commit.
|
||||
for i in `git rev-list "$gitbr"`
|
||||
do
|
||||
ntry=`expr $ntry + 1`
|
||||
idir=`awk -v ntry="$ntry" 'END { printf "%04d", ntry; }' < /dev/null`
|
||||
echo ' --- commit ' $i from branch $gitbr
|
||||
date
|
||||
mkdir $resdir/$ds/$idir
|
||||
echo $gitbr > $resdir/$ds/$idir/gitbr
|
||||
echo $i >> $resdir/$ds/$idir/gitbr
|
||||
|
||||
# Test the specified commit.
|
||||
git checkout $i > $resdir/$ds/$idir/git-checkout.out 2>&1
|
||||
echo git checkout return code: $? "(Commit $ntry: $i)"
|
||||
kvm.sh --cpus $cpus --duration 3 --trust-make > $resdir/$ds/$idir/kvm.sh.out 2>&1
|
||||
ret=$?
|
||||
echo kvm.sh return code $ret for commit $i from branch $gitbr
|
||||
|
||||
# Move the build products to their resting place.
|
||||
runresdir="`grep -m 1 '^Results directory:' < $resdir/$ds/$idir/kvm.sh.out | sed -e 's/^Results directory://'`"
|
||||
mv $runresdir $resdir/$ds/$idir
|
||||
rrd="`echo $runresdir | sed -e 's,^.*/,,'`"
|
||||
echo Run results: $resdir/$ds/$idir/$rrd
|
||||
if test "$ret" -ne 0
|
||||
then
|
||||
# Failure, so leave all evidence intact.
|
||||
nfail=`expr $nfail + 1`
|
||||
else
|
||||
# Success, so remove large files to save about 1GB.
|
||||
( cd $resdir/$ds/$idir/$rrd; rm -f */vmlinux */bzImage */System.map */Module.symvers )
|
||||
fi
|
||||
done
|
||||
done
|
||||
date
|
||||
|
||||
# Go back to the original commit.
|
||||
git checkout "$curcommit"
|
||||
|
||||
if test $nfail -ne 0
|
||||
then
|
||||
echo '!!! ' $nfail failures in $ntry 'runs!!!'
|
||||
exit 1
|
||||
else
|
||||
echo No failures in $ntry runs.
|
||||
exit 0
|
||||
fi
|
71
tools/testing/selftests/rcutorture/bin/kvm-recheck-refscale.sh
Executable file
71
tools/testing/selftests/rcutorture/bin/kvm-recheck-refscale.sh
Executable file
@@ -0,0 +1,71 @@
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
# Analyze a given results directory for refscale performance measurements.
|
||||
#
|
||||
# Usage: kvm-recheck-refscale.sh resdir
|
||||
#
|
||||
# Copyright (C) IBM Corporation, 2016
|
||||
#
|
||||
# Authors: Paul E. McKenney <paulmck@linux.ibm.com>
|
||||
|
||||
i="$1"
|
||||
if test -d "$i" -a -r "$i"
|
||||
then
|
||||
:
|
||||
else
|
||||
echo Unreadable results directory: $i
|
||||
exit 1
|
||||
fi
|
||||
PATH=`pwd`/tools/testing/selftests/rcutorture/bin:$PATH; export PATH
|
||||
. functions.sh
|
||||
|
||||
configfile=`echo $i | sed -e 's/^.*\///'`
|
||||
|
||||
sed -e 's/^\[[^]]*]//' < $i/console.log | tr -d '\015' |
|
||||
awk -v configfile="$configfile" '
|
||||
/^[ ]*Runs Time\(ns\) *$/ {
|
||||
if (dataphase + 0 == 0) {
|
||||
dataphase = 1;
|
||||
# print configfile, $0;
|
||||
}
|
||||
next;
|
||||
}
|
||||
|
||||
/[^ ]*[0-9][0-9]* [0-9][0-9]*\.[0-9][0-9]*$/ {
|
||||
if (dataphase == 1) {
|
||||
# print $0;
|
||||
readertimes[++n] = $2;
|
||||
sum += $2;
|
||||
}
|
||||
next;
|
||||
}
|
||||
|
||||
{
|
||||
if (dataphase == 1)
|
||||
dataphase == 2;
|
||||
next;
|
||||
}
|
||||
|
||||
END {
|
||||
print configfile " results:";
|
||||
newNR = asort(readertimes);
|
||||
if (newNR <= 0) {
|
||||
print "No refscale records found???"
|
||||
exit;
|
||||
}
|
||||
medianidx = int(newNR / 2);
|
||||
if (newNR == medianidx * 2)
|
||||
medianvalue = (readertimes[medianidx - 1] + readertimes[medianidx]) / 2;
|
||||
else
|
||||
medianvalue = readertimes[medianidx];
|
||||
points = "Points:";
|
||||
for (i = 1; i <= newNR; i++)
|
||||
points = points " " readertimes[i];
|
||||
print points;
|
||||
print "Average reader duration: " sum / newNR " nanoseconds";
|
||||
print "Minimum reader duration: " readertimes[1];
|
||||
print "Median reader duration: " medianvalue;
|
||||
print "Maximum reader duration: " readertimes[newNR];
|
||||
print "Computed from refscale printk output.";
|
||||
}'
|
@@ -31,6 +31,7 @@ do
|
||||
head -1 $resdir/log
|
||||
fi
|
||||
TORTURE_SUITE="`cat $i/../TORTURE_SUITE`"
|
||||
configfile=`echo $i | sed -e 's,^.*/,,'`
|
||||
rm -f $i/console.log.*.diags
|
||||
kvm-recheck-${TORTURE_SUITE}.sh $i
|
||||
if test -f "$i/qemu-retval" && test "`cat $i/qemu-retval`" -ne 0 && test "`cat $i/qemu-retval`" -ne 137
|
||||
@@ -43,7 +44,8 @@ do
|
||||
then
|
||||
echo QEMU killed
|
||||
fi
|
||||
configcheck.sh $i/.config $i/ConfigFragment
|
||||
configcheck.sh $i/.config $i/ConfigFragment > $T 2>&1
|
||||
cat $T
|
||||
if test -r $i/Make.oldconfig.err
|
||||
then
|
||||
cat $i/Make.oldconfig.err
|
||||
@@ -55,15 +57,15 @@ do
|
||||
cat $i/Warnings
|
||||
fi
|
||||
else
|
||||
if test -f "$i/qemu-cmd"
|
||||
then
|
||||
print_bug qemu failed
|
||||
echo " $i"
|
||||
elif test -f "$i/buildonly"
|
||||
if test -f "$i/buildonly"
|
||||
then
|
||||
echo Build-only run, no boot/test
|
||||
configcheck.sh $i/.config $i/ConfigFragment
|
||||
parse-build.sh $i/Make.out $configfile
|
||||
elif test -f "$i/qemu-cmd"
|
||||
then
|
||||
print_bug qemu failed
|
||||
echo " $i"
|
||||
else
|
||||
print_bug Build failed
|
||||
echo " $i"
|
||||
@@ -72,7 +74,11 @@ do
|
||||
done
|
||||
if test -f "$rd/kcsan.sum"
|
||||
then
|
||||
if test -s "$rd/kcsan.sum"
|
||||
if grep -q CONFIG_KCSAN=y $T
|
||||
then
|
||||
echo "Compiler or architecture does not support KCSAN!"
|
||||
echo Did you forget to switch your compiler with '--kmake-arg CC=<cc-that-supports-kcsan>'?
|
||||
elif test -s "$rd/kcsan.sum"
|
||||
then
|
||||
echo KCSAN summary in $rd/kcsan.sum
|
||||
else
|
||||
|
@@ -124,7 +124,6 @@ seconds=$4
|
||||
qemu_args=$5
|
||||
boot_args=$6
|
||||
|
||||
cd $KVM
|
||||
kstarttime=`gawk 'BEGIN { print systime() }' < /dev/null`
|
||||
if test -z "$TORTURE_BUILDONLY"
|
||||
then
|
||||
@@ -141,6 +140,7 @@ then
|
||||
cpu_count=$TORTURE_ALLOTED_CPUS
|
||||
fi
|
||||
qemu_args="`specify_qemu_cpus "$QEMU" "$qemu_args" "$cpu_count"`"
|
||||
qemu_args="`specify_qemu_net "$qemu_args"`"
|
||||
|
||||
# Generate architecture-specific and interaction-specific qemu arguments
|
||||
qemu_args="$qemu_args `identify_qemu_args "$QEMU" "$resdir/console.log"`"
|
||||
@@ -152,6 +152,7 @@ qemu_append="`identify_qemu_append "$QEMU"`"
|
||||
boot_args="`configfrag_boot_params "$boot_args" "$config_template"`"
|
||||
# Generate kernel-version-specific boot parameters
|
||||
boot_args="`per_version_boot_params "$boot_args" $resdir/.config $seconds`"
|
||||
echo $QEMU $qemu_args -m $TORTURE_QEMU_MEM -kernel $KERNEL -append \"$qemu_append $boot_args\" > $resdir/qemu-cmd
|
||||
|
||||
if test -n "$TORTURE_BUILDONLY"
|
||||
then
|
||||
@@ -159,9 +160,16 @@ then
|
||||
touch $resdir/buildonly
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Decorate qemu-cmd with redirection, backgrounding, and PID capture
|
||||
sed -e 's/$/ 2>\&1 \&/' < $resdir/qemu-cmd > $T/qemu-cmd
|
||||
echo 'echo $! > $resdir/qemu_pid' >> $T/qemu-cmd
|
||||
|
||||
# In case qemu refuses to run...
|
||||
echo "NOTE: $QEMU either did not run or was interactive" > $resdir/console.log
|
||||
echo $QEMU $qemu_args -m $TORTURE_QEMU_MEM -kernel $KERNEL -append \"$qemu_append $boot_args\" > $resdir/qemu-cmd
|
||||
( $QEMU $qemu_args -m $TORTURE_QEMU_MEM -kernel $KERNEL -append "$qemu_append $boot_args" > $resdir/qemu-output 2>&1 & echo $! > $resdir/qemu_pid; wait `cat $resdir/qemu_pid`; echo $? > $resdir/qemu-retval ) &
|
||||
|
||||
# Attempt to run qemu
|
||||
( . $T/qemu-cmd; wait `cat $resdir/qemu_pid`; echo $? > $resdir/qemu-retval ) &
|
||||
commandcompleted=0
|
||||
sleep 10 # Give qemu's pid a chance to reach the file
|
||||
if test -s "$resdir/qemu_pid"
|
||||
@@ -181,7 +189,7 @@ do
|
||||
kruntime=`gawk 'BEGIN { print systime() - '"$kstarttime"' }' < /dev/null`
|
||||
if test -z "$qemu_pid" || kill -0 "$qemu_pid" > /dev/null 2>&1
|
||||
then
|
||||
if test $kruntime -ge $seconds
|
||||
if test $kruntime -ge $seconds -o -f "$TORTURE_STOPFILE"
|
||||
then
|
||||
break;
|
||||
fi
|
||||
@@ -210,10 +218,19 @@ then
|
||||
fi
|
||||
if test $commandcompleted -eq 0 -a -n "$qemu_pid"
|
||||
then
|
||||
echo Grace period for qemu job at pid $qemu_pid
|
||||
if ! test -f "$TORTURE_STOPFILE"
|
||||
then
|
||||
echo Grace period for qemu job at pid $qemu_pid
|
||||
fi
|
||||
oldline="`tail $resdir/console.log`"
|
||||
while :
|
||||
do
|
||||
if test -f "$TORTURE_STOPFILE"
|
||||
then
|
||||
echo "PID $qemu_pid killed due to run STOP request" >> $resdir/Warnings 2>&1
|
||||
kill -KILL $qemu_pid
|
||||
break
|
||||
fi
|
||||
kruntime=`gawk 'BEGIN { print systime() - '"$kstarttime"' }' < /dev/null`
|
||||
if kill -0 $qemu_pid > /dev/null 2>&1
|
||||
then
|
||||
|
51
tools/testing/selftests/rcutorture/bin/kvm-transform.sh
Executable file
51
tools/testing/selftests/rcutorture/bin/kvm-transform.sh
Executable file
@@ -0,0 +1,51 @@
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
# Transform a qemu-cmd file to allow reuse.
|
||||
#
|
||||
# Usage: kvm-transform.sh bzImage console.log < qemu-cmd-in > qemu-cmd-out
|
||||
#
|
||||
# bzImage: Kernel and initrd from the same prior kvm.sh run.
|
||||
# console.log: File into which to place console output.
|
||||
#
|
||||
# The original qemu-cmd file is provided on standard input.
|
||||
# The transformed qemu-cmd file is on standard output.
|
||||
# The transformation assumes that the qemu command is confined to a
|
||||
# single line. It also assumes no whitespace in filenames.
|
||||
#
|
||||
# Copyright (C) 2020 Facebook, Inc.
|
||||
#
|
||||
# Authors: Paul E. McKenney <paulmck@kernel.org>
|
||||
|
||||
image="$1"
|
||||
if test -z "$image"
|
||||
then
|
||||
echo Need kernel image file.
|
||||
exit 1
|
||||
fi
|
||||
consolelog="$2"
|
||||
if test -z "$consolelog"
|
||||
then
|
||||
echo "Need console log file name."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
awk -v image="$image" -v consolelog="$consolelog" '
|
||||
{
|
||||
line = "";
|
||||
for (i = 1; i <= NF; i++) {
|
||||
if (line == "")
|
||||
line = $i;
|
||||
else
|
||||
line = line " " $i;
|
||||
if ($i == "-serial") {
|
||||
i++;
|
||||
line = line " file:" consolelog;
|
||||
}
|
||||
if ($i == "-kernel") {
|
||||
i++;
|
||||
line = line " " image;
|
||||
}
|
||||
}
|
||||
print line;
|
||||
}'
|
@@ -73,6 +73,10 @@ usage () {
|
||||
while test $# -gt 0
|
||||
do
|
||||
case "$1" in
|
||||
--allcpus)
|
||||
cpus=$TORTURE_ALLOTED_CPUS
|
||||
max_cpus=$TORTURE_ALLOTED_CPUS
|
||||
;;
|
||||
--bootargs|--bootarg)
|
||||
checkarg --bootargs "(list of kernel boot arguments)" "$#" "$2" '.*' '^--'
|
||||
TORTURE_BOOTARGS="$2"
|
||||
@@ -180,13 +184,14 @@ do
|
||||
shift
|
||||
;;
|
||||
--torture)
|
||||
checkarg --torture "(suite name)" "$#" "$2" '^\(lock\|rcu\|rcuperf\)$' '^--'
|
||||
checkarg --torture "(suite name)" "$#" "$2" '^\(lock\|rcu\|rcuperf\|refscale\)$' '^--'
|
||||
TORTURE_SUITE=$2
|
||||
shift
|
||||
if test "$TORTURE_SUITE" = rcuperf
|
||||
if test "$TORTURE_SUITE" = rcuperf || test "$TORTURE_SUITE" = refscale
|
||||
then
|
||||
# If you really want jitter for rcuperf, specify
|
||||
# it after specifying rcuperf. (But why?)
|
||||
# If you really want jitter for refscale or
|
||||
# rcuperf, specify it after specifying the rcuperf
|
||||
# or the refscale. (But why jitter in these cases?)
|
||||
jitter=0
|
||||
fi
|
||||
;;
|
||||
@@ -333,6 +338,8 @@ then
|
||||
mkdir -p "$resdir" || :
|
||||
fi
|
||||
mkdir $resdir/$ds
|
||||
TORTURE_RESDIR="$resdir/$ds"; export TORTURE_RESDIR
|
||||
TORTURE_STOPFILE="$resdir/$ds/STOP"; export TORTURE_STOPFILE
|
||||
echo Results directory: $resdir/$ds
|
||||
echo $scriptname $args
|
||||
touch $resdir/$ds/log
|
||||
@@ -497,3 +504,7 @@ fi
|
||||
# Tracing: trace_event=rcu:rcu_grace_period,rcu:rcu_future_grace_period,rcu:rcu_grace_period_init,rcu:rcu_nocb_wake,rcu:rcu_preempt_task,rcu:rcu_unlock_preempted_task,rcu:rcu_quiescent_state_report,rcu:rcu_fqs,rcu:rcu_callback,rcu:rcu_kfree_callback,rcu:rcu_batch_start,rcu:rcu_invoke_callback,rcu:rcu_invoke_kfree_callback,rcu:rcu_batch_end,rcu:rcu_torture_read,rcu:rcu_barrier
|
||||
# Function-graph tracing: ftrace=function_graph ftrace_graph_filter=sched_setaffinity,migration_cpu_stop
|
||||
# Also --kconfig "CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y"
|
||||
# Control buffer size: --bootargs trace_buf_size=3k
|
||||
# Get trace-buffer dumps on all oopses: --bootargs ftrace_dump_on_oops
|
||||
# Ditto, but dump only the oopsing CPU: --bootargs ftrace_dump_on_oops=orig_cpu
|
||||
# Heavy-handed way to also dump on warnings: --bootargs panic_on_warn
|
||||
|
@@ -33,8 +33,8 @@ then
|
||||
fi
|
||||
cat /dev/null > $file.diags
|
||||
|
||||
# Check for proper termination, except that rcuperf runs don't indicate this.
|
||||
if test "$TORTURE_SUITE" != rcuperf
|
||||
# Check for proper termination, except for rcuperf and refscale.
|
||||
if test "$TORTURE_SUITE" != rcuperf && test "$TORTURE_SUITE" != refscale
|
||||
then
|
||||
# check for abject failure
|
||||
|
||||
@@ -44,11 +44,23 @@ then
|
||||
tail -1 |
|
||||
awk '
|
||||
{
|
||||
for (i=NF-8;i<=NF;i++)
|
||||
normalexit = 1;
|
||||
for (i=NF-8;i<=NF;i++) {
|
||||
if (i <= 0 || i !~ /^[0-9]*$/) {
|
||||
bangstring = $0;
|
||||
gsub(/^\[[^]]*] /, "", bangstring);
|
||||
print bangstring;
|
||||
normalexit = 0;
|
||||
exit 0;
|
||||
}
|
||||
sum+=$i;
|
||||
}
|
||||
}
|
||||
END { print sum }'`
|
||||
print_bug $title FAILURE, $nerrs instances
|
||||
END {
|
||||
if (normalexit)
|
||||
print sum " instances"
|
||||
}'`
|
||||
print_bug $title FAILURE, $nerrs
|
||||
exit
|
||||
fi
|
||||
|
||||
@@ -104,10 +116,7 @@ then
|
||||
fi
|
||||
fi | tee -a $file.diags
|
||||
|
||||
egrep 'Badness|WARNING:|Warn|BUG|===========|Call Trace:|Oops:|detected stalls on CPUs/tasks:|self-detected stall on CPU|Stall ended before state dump start|\?\?\? Writer stall state|rcu_.*kthread starved for' < $file |
|
||||
grep -v 'ODEBUG: ' |
|
||||
grep -v 'This means that this is a DEBUG kernel and it is' |
|
||||
grep -v 'Warning: unable to open an initial console' > $T.diags
|
||||
console-badness.sh < $file > $T.diags
|
||||
if test -s $T.diags
|
||||
then
|
||||
print_warning "Assertion failure in $file $title"
|
||||
|
@@ -0,0 +1,2 @@
|
||||
NOPREEMPT
|
||||
PREEMPT
|
@@ -0,0 +1,2 @@
|
||||
CONFIG_RCU_REF_SCALE_TEST=y
|
||||
CONFIG_PRINTK_TIME=y
|
@@ -0,0 +1,18 @@
|
||||
CONFIG_SMP=y
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
CONFIG_PREEMPT_VOLUNTARY=n
|
||||
CONFIG_PREEMPT=n
|
||||
#CHECK#CONFIG_PREEMPT_RCU=n
|
||||
CONFIG_HZ_PERIODIC=n
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NO_HZ_FULL=n
|
||||
CONFIG_RCU_FAST_NO_HZ=n
|
||||
CONFIG_HOTPLUG_CPU=n
|
||||
CONFIG_SUSPEND=n
|
||||
CONFIG_HIBERNATION=n
|
||||
CONFIG_RCU_NOCB_CPU=n
|
||||
CONFIG_DEBUG_LOCK_ALLOC=n
|
||||
CONFIG_PROVE_LOCKING=n
|
||||
CONFIG_RCU_BOOST=n
|
||||
CONFIG_DEBUG_OBJECTS_RCU_HEAD=n
|
||||
CONFIG_RCU_EXPERT=y
|
18
tools/testing/selftests/rcutorture/configs/refscale/PREEMPT
Normal file
18
tools/testing/selftests/rcutorture/configs/refscale/PREEMPT
Normal file
@@ -0,0 +1,18 @@
|
||||
CONFIG_SMP=y
|
||||
CONFIG_PREEMPT_NONE=n
|
||||
CONFIG_PREEMPT_VOLUNTARY=n
|
||||
CONFIG_PREEMPT=y
|
||||
#CHECK#CONFIG_PREEMPT_RCU=y
|
||||
CONFIG_HZ_PERIODIC=n
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NO_HZ_FULL=n
|
||||
CONFIG_RCU_FAST_NO_HZ=n
|
||||
CONFIG_HOTPLUG_CPU=n
|
||||
CONFIG_SUSPEND=n
|
||||
CONFIG_HIBERNATION=n
|
||||
CONFIG_RCU_NOCB_CPU=n
|
||||
CONFIG_DEBUG_LOCK_ALLOC=n
|
||||
CONFIG_PROVE_LOCKING=n
|
||||
CONFIG_RCU_BOOST=n
|
||||
CONFIG_DEBUG_OBJECTS_RCU_HEAD=n
|
||||
CONFIG_RCU_EXPERT=y
|
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
# Torture-suite-dependent shell functions for the rest of the scripts.
|
||||
#
|
||||
# Copyright (C) IBM Corporation, 2015
|
||||
#
|
||||
# Authors: Paul E. McKenney <paulmck@linux.ibm.com>
|
||||
|
||||
# per_version_boot_params bootparam-string config-file seconds
|
||||
#
|
||||
# Adds per-version torture-module parameters to kernels supporting them.
|
||||
per_version_boot_params () {
|
||||
echo $1 refscale.shutdown=1 \
|
||||
refscale.verbose=1
|
||||
}
|
Reference in New Issue
Block a user