Commit f511ce14 authored by Paul E. McKenney's avatar Paul E. McKenney

Merge branch 'scftorture.2020.08.24a' into HEAD

scftorture.2020.08.24a: Torture tests for smp_call_function() and friends.
parents cfb2c107 4e88ec4a
...@@ -4157,41 +4157,41 @@ ...@@ -4157,41 +4157,41 @@
rcu_node tree with an eye towards determining rcu_node tree with an eye towards determining
why a new grace period has not yet started. why a new grace period has not yet started.
rcuperf.gp_async= [KNL] rcuscale.gp_async= [KNL]
Measure performance of asynchronous Measure performance of asynchronous
grace-period primitives such as call_rcu(). grace-period primitives such as call_rcu().
rcuperf.gp_async_max= [KNL] rcuscale.gp_async_max= [KNL]
Specify the maximum number of outstanding Specify the maximum number of outstanding
callbacks per writer thread. When a writer callbacks per writer thread. When a writer
thread exceeds this limit, it invokes the thread exceeds this limit, it invokes the
corresponding flavor of rcu_barrier() to allow corresponding flavor of rcu_barrier() to allow
previously posted callbacks to drain. previously posted callbacks to drain.
rcuperf.gp_exp= [KNL] rcuscale.gp_exp= [KNL]
Measure performance of expedited synchronous Measure performance of expedited synchronous
grace-period primitives. grace-period primitives.
rcuperf.holdoff= [KNL] rcuscale.holdoff= [KNL]
Set test-start holdoff period. The purpose of Set test-start holdoff period. The purpose of
this parameter is to delay the start of the this parameter is to delay the start of the
test until boot completes in order to avoid test until boot completes in order to avoid
interference. interference.
rcuperf.kfree_rcu_test= [KNL] rcuscale.kfree_rcu_test= [KNL]
Set to measure performance of kfree_rcu() flooding. Set to measure performance of kfree_rcu() flooding.
rcuperf.kfree_nthreads= [KNL] rcuscale.kfree_nthreads= [KNL]
The number of threads running loops of kfree_rcu(). The number of threads running loops of kfree_rcu().
rcuperf.kfree_alloc_num= [KNL] rcuscale.kfree_alloc_num= [KNL]
Number of allocations and frees done in an iteration. Number of allocations and frees done in an iteration.
rcuperf.kfree_loops= [KNL] rcuscale.kfree_loops= [KNL]
Number of loops doing rcuperf.kfree_alloc_num number Number of loops doing rcuscale.kfree_alloc_num number
of allocations and frees. of allocations and frees.
rcuperf.nreaders= [KNL] rcuscale.nreaders= [KNL]
Set number of RCU readers. The value -1 selects Set number of RCU readers. The value -1 selects
N, where N is the number of CPUs. A value N, where N is the number of CPUs. A value
"n" less than -1 selects N-n+1, where N is again "n" less than -1 selects N-n+1, where N is again
...@@ -4200,23 +4200,23 @@ ...@@ -4200,23 +4200,23 @@
A value of "n" less than or equal to -N selects A value of "n" less than or equal to -N selects
a single reader. a single reader.
rcuperf.nwriters= [KNL] rcuscale.nwriters= [KNL]
Set number of RCU writers. The values operate Set number of RCU writers. The values operate
the same as for rcuperf.nreaders. the same as for rcuscale.nreaders.
N, where N is the number of CPUs N, where N is the number of CPUs
rcuperf.perf_type= [KNL] rcuscale.perf_type= [KNL]
Specify the RCU implementation to test. Specify the RCU implementation to test.
rcuperf.shutdown= [KNL] rcuscale.shutdown= [KNL]
Shut the system down after performance tests Shut the system down after performance tests
complete. This is useful for hands-off automated complete. This is useful for hands-off automated
testing. testing.
rcuperf.verbose= [KNL] rcuscale.verbose= [KNL]
Enable additional printk() statements. Enable additional printk() statements.
rcuperf.writer_holdoff= [KNL] rcuscale.writer_holdoff= [KNL]
Write-side holdoff between grace periods, Write-side holdoff between grace periods,
in microseconds. The default of zero says in microseconds. The default of zero says
no holdoff. no holdoff.
...@@ -4502,8 +4502,8 @@ ...@@ -4502,8 +4502,8 @@
refscale.shutdown= [KNL] refscale.shutdown= [KNL]
Shut down the system at the end of the performance Shut down the system at the end of the performance
test. This defaults to 1 (shut it down) when test. This defaults to 1 (shut it down) when
rcuperf is built into the kernel and to 0 (leave refscale is built into the kernel and to 0 (leave
it running) when rcuperf is built as a module. it running) when refscale is built as a module.
refscale.verbose= [KNL] refscale.verbose= [KNL]
Enable additional printk() statements. Enable additional printk() statements.
...@@ -4649,6 +4649,98 @@ ...@@ -4649,6 +4649,98 @@
Format: integer between 0 and 10 Format: integer between 0 and 10
Default is 0. Default is 0.
scftorture.holdoff= [KNL]
Number of seconds to hold off before starting
test. Defaults to zero for module insertion and
to 10 seconds for built-in smp_call_function()
tests.
scftorture.longwait= [KNL]
Request ridiculously long waits randomly selected
up to the chosen limit in seconds. Zero (the
default) disables this feature. Please note
that requesting even small non-zero numbers of
seconds can result in RCU CPU stall warnings,
softlockup complaints, and so on.
scftorture.nthreads= [KNL]
Number of kthreads to spawn to invoke the
smp_call_function() family of functions.
The default of -1 specifies a number of kthreads
equal to the number of CPUs.
scftorture.onoff_holdoff= [KNL]
Number seconds to wait after the start of the
test before initiating CPU-hotplug operations.
scftorture.onoff_interval= [KNL]
Number seconds to wait between successive
CPU-hotplug operations. Specifying zero (which
is the default) disables CPU-hotplug operations.
scftorture.shutdown_secs= [KNL]
The number of seconds following the start of the
test after which to shut down the system. The
default of zero avoids shutting down the system.
Non-zero values are useful for automated tests.
scftorture.stat_interval= [KNL]
The number of seconds between outputting the
current test statistics to the console. A value
of zero disables statistics output.
scftorture.stutter_cpus= [KNL]
The number of jiffies to wait between each change
to the set of CPUs under test.
scftorture.use_cpus_read_lock= [KNL]
Use use_cpus_read_lock() instead of the default
preempt_disable() to disable CPU hotplug
while invoking one of the smp_call_function*()
functions.
scftorture.verbose= [KNL]
Enable additional printk() statements.
scftorture.weight_single= [KNL]
The probability weighting to use for the
smp_call_function_single() function with a zero
"wait" parameter. A value of -1 selects the
default if all other weights are -1. However,
if at least one weight has some other value, a
value of -1 will instead select a weight of zero.
scftorture.weight_single_wait= [KNL]
The probability weighting to use for the
smp_call_function_single() function with a
non-zero "wait" parameter. See weight_single.
scftorture.weight_many= [KNL]
The probability weighting to use for the
smp_call_function_many() function with a zero
"wait" parameter. See weight_single.
Note well that setting a high probability for
this weighting can place serious IPI load
on the system.
scftorture.weight_many_wait= [KNL]
The probability weighting to use for the
smp_call_function_many() function with a
non-zero "wait" parameter. See weight_single
and weight_many.
scftorture.weight_all= [KNL]
The probability weighting to use for the
smp_call_function_all() function with a zero
"wait" parameter. See weight_single and
weight_many.
scftorture.weight_all_wait= [KNL]
The probability weighting to use for the
smp_call_function_all() function with a
non-zero "wait" parameter. See weight_single
and weight_many.
skew_tick= [KNL] Offset the periodic timer tick per cpu to mitigate skew_tick= [KNL] Offset the periodic timer tick per cpu to mitigate
xtime_lock contention on larger systems, and/or RCU lock xtime_lock contention on larger systems, and/or RCU lock
contention on all systems with CONFIG_MAXSMP set. contention on all systems with CONFIG_MAXSMP set.
......
...@@ -17510,8 +17510,9 @@ S: Supported ...@@ -17510,8 +17510,9 @@ S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git dev T: git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git dev
F: Documentation/RCU/torture.rst F: Documentation/RCU/torture.rst
F: kernel/locking/locktorture.c F: kernel/locking/locktorture.c
F: kernel/rcu/rcuperf.c F: kernel/rcu/rcuscale.c
F: kernel/rcu/rcutorture.c F: kernel/rcu/rcutorture.c
F: kernel/rcu/refscale.c
F: kernel/torture.c F: kernel/torture.c
TOSHIBA ACPI EXTRAS DRIVER TOSHIBA ACPI EXTRAS DRIVER
......
...@@ -133,6 +133,8 @@ KASAN_SANITIZE_stackleak.o := n ...@@ -133,6 +133,8 @@ KASAN_SANITIZE_stackleak.o := n
KCSAN_SANITIZE_stackleak.o := n KCSAN_SANITIZE_stackleak.o := n
KCOV_INSTRUMENT_stackleak.o := n KCOV_INSTRUMENT_stackleak.o := n
obj-$(CONFIG_SCF_TORTURE_TEST) += scftorture.o
$(obj)/configs.o: $(obj)/config_data.gz $(obj)/configs.o: $(obj)/config_data.gz
targets += config_data.gz targets += config_data.gz
......
...@@ -23,7 +23,7 @@ config TORTURE_TEST ...@@ -23,7 +23,7 @@ config TORTURE_TEST
tristate tristate
default n default n
config RCU_PERF_TEST config RCU_SCALE_TEST
tristate "performance tests for RCU" tristate "performance tests for RCU"
depends on DEBUG_KERNEL depends on DEBUG_KERNEL
select TORTURE_TEST select TORTURE_TEST
......
...@@ -11,7 +11,7 @@ obj-y += update.o sync.o ...@@ -11,7 +11,7 @@ obj-y += update.o sync.o
obj-$(CONFIG_TREE_SRCU) += srcutree.o obj-$(CONFIG_TREE_SRCU) += srcutree.o
obj-$(CONFIG_TINY_SRCU) += srcutiny.o obj-$(CONFIG_TINY_SRCU) += srcutiny.o
obj-$(CONFIG_RCU_TORTURE_TEST) += rcutorture.o obj-$(CONFIG_RCU_TORTURE_TEST) += rcutorture.o
obj-$(CONFIG_RCU_PERF_TEST) += rcuperf.o obj-$(CONFIG_RCU_SCALE_TEST) += rcuscale.o
obj-$(CONFIG_RCU_REF_SCALE_TEST) += refscale.o obj-$(CONFIG_RCU_REF_SCALE_TEST) += refscale.o
obj-$(CONFIG_TREE_RCU) += tree.o obj-$(CONFIG_TREE_RCU) += tree.o
obj-$(CONFIG_TINY_RCU) += tiny.o obj-$(CONFIG_TINY_RCU) += tiny.o
......
This diff is collapsed.
...@@ -927,7 +927,7 @@ static bool can_stop_idle_tick(int cpu, struct tick_sched *ts) ...@@ -927,7 +927,7 @@ static bool can_stop_idle_tick(int cpu, struct tick_sched *ts)
if (ratelimit < 10 && if (ratelimit < 10 &&
(local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK)) { (local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK)) {
pr_warn("NOHZ: local_softirq_pending %02x\n", pr_warn("NOHZ tick-stop error: Non-RCU local softirq work is pending, handler #%02x!!!\n",
(unsigned int) local_softirq_pending()); (unsigned int) local_softirq_pending());
ratelimit++; ratelimit++;
} }
......
...@@ -1367,6 +1367,16 @@ config WW_MUTEX_SELFTEST ...@@ -1367,6 +1367,16 @@ config WW_MUTEX_SELFTEST
Say M if you want these self tests to build as a module. Say M if you want these self tests to build as a module.
Say N if you are unsure. Say N if you are unsure.
config SCF_TORTURE_TEST
tristate "torture tests for smp_call_function*()"
depends on DEBUG_KERNEL
select TORTURE_TEST
help
This option provides a kernel module that runs torture tests
on the smp_call_function() family of primitives. The kernel
module may be built after the fact on the running kernel to
be tested, if desired.
endmenu # lock debugging endmenu # lock debugging
config TRACE_IRQFLAGS config TRACE_IRQFLAGS
......
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
# Analyze a given results directory for rcuperf performance measurements, # Analyze a given results directory for rcuscale performance measurements,
# looking for ftrace data. Exits with 0 if data was found, analyzed, and # looking for ftrace data. Exits with 0 if data was found, analyzed, and
# printed. Intended to be invoked from kvm-recheck-rcuperf.sh after # printed. Intended to be invoked from kvm-recheck-rcuscale.sh after
# argument checking. # argument checking.
# #
# Usage: kvm-recheck-rcuperf-ftrace.sh resdir # Usage: kvm-recheck-rcuscale-ftrace.sh resdir
# #
# Copyright (C) IBM Corporation, 2016 # Copyright (C) IBM Corporation, 2016
# #
......
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
# Analyze a given results directory for rcuperf performance measurements. # Analyze a given results directory for rcuscale scalability measurements.
# #
# Usage: kvm-recheck-rcuperf.sh resdir # Usage: kvm-recheck-rcuscale.sh resdir
# #
# Copyright (C) IBM Corporation, 2016 # Copyright (C) IBM Corporation, 2016
# #
...@@ -20,7 +20,7 @@ fi ...@@ -20,7 +20,7 @@ fi
PATH=`pwd`/tools/testing/selftests/rcutorture/bin:$PATH; export PATH PATH=`pwd`/tools/testing/selftests/rcutorture/bin:$PATH; export PATH
. functions.sh . functions.sh
if kvm-recheck-rcuperf-ftrace.sh $i if kvm-recheck-rcuscale-ftrace.sh $i
then then
# ftrace data was successfully analyzed, call it good! # ftrace data was successfully analyzed, call it good!
exit 0 exit 0
...@@ -30,12 +30,12 @@ configfile=`echo $i | sed -e 's/^.*\///'` ...@@ -30,12 +30,12 @@ configfile=`echo $i | sed -e 's/^.*\///'`
sed -e 's/^\[[^]]*]//' < $i/console.log | sed -e 's/^\[[^]]*]//' < $i/console.log |
awk ' awk '
/-perf: .* gps: .* batches:/ { /-scale: .* gps: .* batches:/ {
ngps = $9; ngps = $9;
nbatches = $11; nbatches = $11;
} }
/-perf: .*writer-duration/ { /-scale: .*writer-duration/ {
gptimes[++n] = $5 / 1000.; gptimes[++n] = $5 / 1000.;
sum += $5 / 1000.; sum += $5 / 1000.;
} }
...@@ -43,7 +43,7 @@ awk ' ...@@ -43,7 +43,7 @@ awk '
END { END {
newNR = asort(gptimes); newNR = asort(gptimes);
if (newNR <= 0) { if (newNR <= 0) {
print "No rcuperf records found???" print "No rcuscale records found???"
exit; exit;
} }
pct50 = int(newNR * 50 / 100); pct50 = int(newNR * 50 / 100);
...@@ -79,5 +79,5 @@ END { ...@@ -79,5 +79,5 @@ END {
print "99th percentile grace-period duration: " gptimes[pct99]; print "99th percentile grace-period duration: " gptimes[pct99];
print "Maximum grace-period duration: " gptimes[newNR]; print "Maximum grace-period duration: " gptimes[newNR];
print "Grace periods: " ngps + 0 " Batches: " nbatches + 0 " Ratio: " ngps / nbatches; print "Grace periods: " ngps + 0 " Batches: " nbatches + 0 " Ratio: " ngps / nbatches;
print "Computed from rcuperf printk output."; print "Computed from rcuscale printk output.";
}' }'
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0+
#
# Analyze a given results directory for rcutorture progress.
#
# Usage: kvm-recheck-rcu.sh resdir
#
# Copyright (C) Facebook, 2020
#
# Authors: Paul E. McKenney <paulmck@kernel.org>
i="$1"
if test -d "$i" -a -r "$i"
then
:
else
echo Unreadable results directory: $i
exit 1
fi
. functions.sh
configfile=`echo $i | sed -e 's/^.*\///'`
nscfs="`grep 'scf_invoked_count ver:' $i/console.log 2> /dev/null | tail -1 | sed -e 's/^.* scf_invoked_count ver: //' -e 's/ .*$//' | tr -d '\015'`"
if test -z "$nscfs"
then
echo "$configfile ------- "
else
dur="`sed -e 's/^.* scftorture.shutdown_secs=//' -e 's/ .*$//' < $i/qemu-cmd 2> /dev/null`"
if test -z "$dur"
then
rate=""
else
nscfss=`awk -v nscfs=$nscfs -v dur=$dur '
BEGIN { print nscfs / dur }' < /dev/null`
rate=" ($nscfss/s)"
fi
echo "${configfile} ------- ${nscfs} SCF handler invocations$rate"
fi
...@@ -71,7 +71,7 @@ usage () { ...@@ -71,7 +71,7 @@ usage () {
echo " --qemu-args qemu-arguments" echo " --qemu-args qemu-arguments"
echo " --qemu-cmd qemu-system-..." echo " --qemu-cmd qemu-system-..."
echo " --results absolute-pathname" echo " --results absolute-pathname"
echo " --torture lock|rcu|rcuperf|refscale|scf" echo " --torture lock|rcu|rcuscale|refscale|scf"
echo " --trust-make" echo " --trust-make"
exit 1 exit 1
} }
...@@ -198,13 +198,13 @@ do ...@@ -198,13 +198,13 @@ do
shift shift
;; ;;
--torture) --torture)
checkarg --torture "(suite name)" "$#" "$2" '^\(lock\|rcu\|rcuperf\|refscale\)$' '^--' checkarg --torture "(suite name)" "$#" "$2" '^\(lock\|rcu\|rcuscale\|refscale\|scf\)$' '^--'
TORTURE_SUITE=$2 TORTURE_SUITE=$2
shift shift
if test "$TORTURE_SUITE" = rcuperf || test "$TORTURE_SUITE" = refscale if test "$TORTURE_SUITE" = rcuscale || test "$TORTURE_SUITE" = refscale
then then
# If you really want jitter for refscale or # If you really want jitter for refscale or
# rcuperf, specify it after specifying the rcuperf # rcuscale, specify it after specifying the rcuscale
# or the refscale. (But why jitter in these cases?) # or the refscale. (But why jitter in these cases?)
jitter=0 jitter=0
fi fi
......
...@@ -33,8 +33,8 @@ then ...@@ -33,8 +33,8 @@ then
fi fi
cat /dev/null > $file.diags cat /dev/null > $file.diags
# Check for proper termination, except for rcuperf and refscale. # Check for proper termination, except for rcuscale and refscale.
if test "$TORTURE_SUITE" != rcuperf && test "$TORTURE_SUITE" != refscale if test "$TORTURE_SUITE" != rcuscale && test "$TORTURE_SUITE" != refscale
then then
# check for abject failure # check for abject failure
...@@ -67,6 +67,7 @@ then ...@@ -67,6 +67,7 @@ then
grep --binary-files=text 'torture:.*ver:' $file | grep --binary-files=text 'torture:.*ver:' $file |
egrep --binary-files=text -v '\(null\)|rtc: 000000000* ' | egrep --binary-files=text -v '\(null\)|rtc: 000000000* ' |
sed -e 's/^(initramfs)[^]]*] //' -e 's/^\[[^]]*] //' | sed -e 's/^(initramfs)[^]]*] //' -e 's/^\[[^]]*] //' |
sed -e 's/^.*ver: //' |
awk ' awk '
BEGIN { BEGIN {
ver = 0; ver = 0;
...@@ -74,13 +75,13 @@ then ...@@ -74,13 +75,13 @@ then
} }
{ {
if (!badseq && ($5 + 0 != $5 || $5 <= ver)) { if (!badseq && ($1 + 0 != $1 || $1 <= ver)) {
badseqno1 = ver; badseqno1 = ver;
badseqno2 = $5; badseqno2 = $1;
badseqnr = NR; badseqnr = NR;
badseq = 1; badseq = 1;
} }
ver = $5 ver = $1
} }
END { END {
......
...@@ -11,6 +11,6 @@ ...@@ -11,6 +11,6 @@
# #
# Adds per-version torture-module parameters to kernels supporting them. # Adds per-version torture-module parameters to kernels supporting them.
per_version_boot_params () { per_version_boot_params () {
echo $1 rcuperf.shutdown=1 \ echo $1 rcuscale.shutdown=1 \
rcuperf.verbose=1 rcuscale.verbose=1
} }
CONFIG_SCF_TORTURE_TEST=y
CONFIG_PRINTK_TIME=y
CONFIG_SMP=y
CONFIG_PREEMPT_NONE=y
CONFIG_PREEMPT_VOLUNTARY=n
CONFIG_PREEMPT=n
CONFIG_HZ_PERIODIC=n
CONFIG_NO_HZ_IDLE=n
CONFIG_NO_HZ_FULL=y
CONFIG_DEBUG_LOCK_ALLOC=n
CONFIG_PROVE_LOCKING=n
CONFIG_SMP=y
CONFIG_PREEMPT_NONE=n
CONFIG_PREEMPT_VOLUNTARY=n
CONFIG_PREEMPT=y
CONFIG_HZ_PERIODIC=n
CONFIG_NO_HZ_IDLE=y
CONFIG_NO_HZ_FULL=n
CONFIG_DEBUG_LOCK_ALLOC=y
CONFIG_PROVE_LOCKING=y
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0+
#
# Torture-suite-dependent shell functions for the rest of the scripts.
#
# Copyright (C) Facebook, 2020
#
# Authors: Paul E. McKenney <paulmck@kernel.org>
# scftorture_param_onoff bootparam-string config-file
#
# Adds onoff scftorture module parameters to kernels having it.
scftorture_param_onoff () {
if ! bootparam_hotplug_cpu "$1" && configfrag_hotplug_cpu "$2"
then
echo CPU-hotplug kernel, adding scftorture onoff. 1>&2
echo scftorture.onoff_interval=1000 scftorture.onoff_holdoff=30
fi
}
# 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 `scftorture_param_onoff "$1" "$2"` \
scftorture.stat_interval=15 \
scftorture.shutdown_secs=$3 \
scftorture.verbose=1 \
scf
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment