Skip to content

Commit 9671f30

Browse files
committed
doc: Add rcutorture scripting to torture.txt
For testing mainline, the kvm.sh rcutorture script is the preferred approach to testing. This commit therefore adds it to the torture.txt documentation. Signed-off-by: Paul E. McKenney <[email protected]>
1 parent 06a649b commit 9671f30

File tree

1 file changed

+140
-7
lines changed

1 file changed

+140
-7
lines changed

Documentation/RCU/torture.txt

Lines changed: 140 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,14 @@ using a dynamically allocated srcu_struct (hence "srcud-" rather than
124124
debugging. The final "T" entry contains the totals of the counters.
125125

126126

127-
USAGE
127+
USAGE ON SPECIFIC KERNEL BUILDS
128128

129-
The following script may be used to torture RCU:
129+
It is sometimes desirable to torture RCU on a specific kernel build,
130+
for example, when preparing to put that kernel build into production.
131+
In that case, the kernel should be built with CONFIG_RCU_TORTURE_TEST=m
132+
so that the test can be started using modprobe and terminated using rmmod.
133+
134+
For example, the following script may be used to torture RCU:
130135

131136
#!/bin/sh
132137

@@ -142,8 +147,136 @@ checked for such errors. The "rmmod" command forces a "SUCCESS",
142147
two are self-explanatory, while the last indicates that while there
143148
were no RCU failures, CPU-hotplug problems were detected.
144149

145-
However, the tools/testing/selftests/rcutorture/bin/kvm.sh script
146-
provides better automation, including automatic failure analysis.
147-
It assumes a qemu/kvm-enabled platform, and runs guest OSes out of initrd.
148-
See tools/testing/selftests/rcutorture/doc/initrd.txt for instructions
149-
on setting up such an initrd.
150+
151+
USAGE ON MAINLINE KERNELS
152+
153+
When using rcutorture to test changes to RCU itself, it is often
154+
necessary to build a number of kernels in order to test that change
155+
across a broad range of combinations of the relevant Kconfig options
156+
and of the relevant kernel boot parameters. In this situation, use
157+
of modprobe and rmmod can be quite time-consuming and error-prone.
158+
159+
Therefore, the tools/testing/selftests/rcutorture/bin/kvm.sh
160+
script is available for mainline testing for x86, arm64, and
161+
powerpc. By default, it will run the series of tests specified by
162+
tools/testing/selftests/rcutorture/configs/rcu/CFLIST, with each test
163+
running for 30 minutes within a guest OS using a minimal userspace
164+
supplied by an automatically generated initrd. After the tests are
165+
complete, the resulting build products and console output are analyzed
166+
for errors and the results of the runs are summarized.
167+
168+
On larger systems, rcutorture testing can be accelerated by passing the
169+
--cpus argument to kvm.sh. For example, on a 64-CPU system, "--cpus 43"
170+
would use up to 43 CPUs to run tests concurrently, which as of v5.4 would
171+
complete all the scenarios in two batches, reducing the time to complete
172+
from about eight hours to about one hour (not counting the time to build
173+
the sixteen kernels). The "--dryrun sched" argument will not run tests,
174+
but rather tell you how the tests would be scheduled into batches. This
175+
can be useful when working out how many CPUs to specify in the --cpus
176+
argument.
177+
178+
Not all changes require that all scenarios be run. For example, a change
179+
to Tree SRCU might run only the SRCU-N and SRCU-P scenarios using the
180+
--configs argument to kvm.sh as follows: "--configs 'SRCU-N SRCU-P'".
181+
Large systems can run multiple copies of of the full set of scenarios,
182+
for example, a system with 448 hardware threads can run five instances
183+
of the full set concurrently. To make this happen:
184+
185+
kvm.sh --cpus 448 --configs '5*CFLIST'
186+
187+
Alternatively, such a system can run 56 concurrent instances of a single
188+
eight-CPU scenario:
189+
190+
kvm.sh --cpus 448 --configs '56*TREE04'
191+
192+
Or 28 concurrent instances of each of two eight-CPU scenarios:
193+
194+
kvm.sh --cpus 448 --configs '28*TREE03 28*TREE04'
195+
196+
Of course, each concurrent instance will use memory, which can be
197+
limited using the --memory argument, which defaults to 512M. Small
198+
values for memory may require disabling the callback-flooding tests
199+
using the --bootargs parameter discussed below.
200+
201+
Sometimes additional debugging is useful, and in such cases the --kconfig
202+
parameter to kvm.sh may be used, for example, "--kconfig 'CONFIG_KASAN=y'".
203+
204+
Kernel boot arguments can also be supplied, for example, to control
205+
rcutorture's module parameters. For example, to test a change to RCU's
206+
CPU stall-warning code, use "--bootargs 'rcutorture.stall_cpu=30'".
207+
This will of course result in the scripting reporting a failure, namely
208+
the resuling RCU CPU stall warning. As noted above, reducing memory may
209+
require disabling rcutorture's callback-flooding tests:
210+
211+
kvm.sh --cpus 448 --configs '56*TREE04' --memory 128M \
212+
--bootargs 'rcutorture.fwd_progress=0'
213+
214+
Sometimes all that is needed is a full set of kernel builds. This is
215+
what the --buildonly argument does.
216+
217+
Finally, the --trust-make argument allows each kernel build to reuse what
218+
it can from the previous kernel build.
219+
220+
There are additional more arcane arguments that are documented in the
221+
source code of the kvm.sh script.
222+
223+
If a run contains failures, the number of buildtime and runtime failures
224+
is listed at the end of the kvm.sh output, which you really should redirect
225+
to a file. The build products and console output of each run is kept in
226+
tools/testing/selftests/rcutorture/res in timestamped directories. A
227+
given directory can be supplied to kvm-find-errors.sh in order to have
228+
it cycle you through summaries of errors and full error logs. For example:
229+
230+
tools/testing/selftests/rcutorture/bin/kvm-find-errors.sh \
231+
tools/testing/selftests/rcutorture/res/2020.01.20-15.54.23
232+
233+
However, it is often more convenient to access the files directly.
234+
Files pertaining to all scenarios in a run reside in the top-level
235+
directory (2020.01.20-15.54.23 in the example above), while per-scenario
236+
files reside in a subdirectory named after the scenario (for example,
237+
"TREE04"). If a given scenario ran more than once (as in "--configs
238+
'56*TREE04'" above), the directories corresponding to the second and
239+
subsequent runs of that scenario include a sequence number, for example,
240+
"TREE04.2", "TREE04.3", and so on.
241+
242+
The most frequently used file in the top-level directory is testid.txt.
243+
If the test ran in a git repository, then this file contains the commit
244+
that was tested and any uncommitted changes in diff format.
245+
246+
The most frequently used files in each per-scenario-run directory are:
247+
248+
.config: This file contains the Kconfig options.
249+
250+
Make.out: This contains build output for a specific scenario.
251+
252+
console.log: This contains the console output for a specific scenario.
253+
This file may be examined once the kernel has booted, but
254+
it might not exist if the build failed.
255+
256+
vmlinux: This contains the kernel, which can be useful with tools like
257+
objdump and gdb.
258+
259+
A number of additional files are available, but are less frequently used.
260+
Many are intended for debugging of rcutorture itself or of its scripting.
261+
262+
As of v5.4, a successful run with the default set of scenarios produces
263+
the following summary at the end of the run on a 12-CPU system:
264+
265+
SRCU-N ------- 804233 GPs (148.932/s) [srcu: g10008272 f0x0 ]
266+
SRCU-P ------- 202320 GPs (37.4667/s) [srcud: g1809476 f0x0 ]
267+
SRCU-t ------- 1122086 GPs (207.794/s) [srcu: g0 f0x0 ]
268+
SRCU-u ------- 1111285 GPs (205.794/s) [srcud: g1 f0x0 ]
269+
TASKS01 ------- 19666 GPs (3.64185/s) [tasks: g0 f0x0 ]
270+
TASKS02 ------- 20541 GPs (3.80389/s) [tasks: g0 f0x0 ]
271+
TASKS03 ------- 19416 GPs (3.59556/s) [tasks: g0 f0x0 ]
272+
TINY01 ------- 836134 GPs (154.84/s) [rcu: g0 f0x0 ] n_max_cbs: 34198
273+
TINY02 ------- 850371 GPs (157.476/s) [rcu: g0 f0x0 ] n_max_cbs: 2631
274+
TREE01 ------- 162625 GPs (30.1157/s) [rcu: g1124169 f0x0 ]
275+
TREE02 ------- 333003 GPs (61.6672/s) [rcu: g2647753 f0x0 ] n_max_cbs: 35844
276+
TREE03 ------- 306623 GPs (56.782/s) [rcu: g2975325 f0x0 ] n_max_cbs: 1496497
277+
CPU count limited from 16 to 12
278+
TREE04 ------- 246149 GPs (45.5831/s) [rcu: g1695737 f0x0 ] n_max_cbs: 434961
279+
TREE05 ------- 314603 GPs (58.2598/s) [rcu: g2257741 f0x2 ] n_max_cbs: 193997
280+
TREE07 ------- 167347 GPs (30.9902/s) [rcu: g1079021 f0x0 ] n_max_cbs: 478732
281+
CPU count limited from 16 to 12
282+
TREE09 ------- 752238 GPs (139.303/s) [rcu: g13075057 f0x0 ] n_max_cbs: 99011

0 commit comments

Comments
 (0)