xref: /openbmc/linux/tools/testing/selftests/rcutorture/bin/kvm.sh (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1c87b9c60SPaul E. McKenney#!/bin/bash
2fef141f6SPaul E. McKenney# SPDX-License-Identifier: GPL-2.0+
3c87b9c60SPaul E. McKenney#
4db92ca3aSPaul E. McKenney# Run a series of tests under KVM.  By default, this series is specified
5db92ca3aSPaul E. McKenney# by the relevant CFLIST file, but can be overridden by the --configs
6db92ca3aSPaul E. McKenney# command-line argument.
7c87b9c60SPaul E. McKenney#
83327d924SPranith Kumar# Usage: kvm.sh [ options ]
9c87b9c60SPaul E. McKenney#
10c87b9c60SPaul E. McKenney# Copyright (C) IBM Corporation, 2011
11c87b9c60SPaul E. McKenney#
12fef141f6SPaul E. McKenney# Authors: Paul E. McKenney <paulmck@linux.ibm.com>
13c87b9c60SPaul E. McKenney
14c87b9c60SPaul E. McKenneyscriptname=$0
15330a76f1SPaul E. McKenneyargs="$*"
16c87b9c60SPaul E. McKenney
17c211ae9cSPaul E. McKenneyT="`mktemp -d ${TMPDIR-/tmp}/kvm.sh.XXXXXX`"
1843e38ab3SPaul E. McKenneytrap 'rm -rf $T' 0
1943e38ab3SPaul E. McKenney
20512e3bd0SSeongJae Parkcd `dirname $scriptname`/../../../../../
21512e3bd0SSeongJae Park
2200ad25f6SPaul E. McKenney# This script knows only English.
2300ad25f6SPaul E. McKenneyLANG=en_US.UTF-8; export LANG
2400ad25f6SPaul E. McKenney
25480b1eb6SPaul E. McKenneydur=$((30*60))
26a7582815SPaul E. McKenneydryrun=""
27a7d89cfbSPaul E. McKenneyRCUTORTURE="`pwd`/tools/testing/selftests/rcutorture"; export RCUTORTURE
28a7d89cfbSPaul E. McKenneyPATH=${RCUTORTURE}/bin:$PATH; export PATH
29b22eb7ceSPaul E. McKenney. functions.sh
30b22eb7ceSPaul E. McKenney
31b22eb7ceSPaul E. McKenneyTORTURE_ALLOTED_CPUS="`identify_qemu_vcpus`"
328c55f227SPaul E. McKenneyTORTURE_DEFCONFIG=defconfig
33f189cc8cSPaul E. McKenneyTORTURE_BOOT_IMAGE=""
34a8dafbf3SPaul E. McKenneyTORTURE_BUILDONLY=
35a7d89cfbSPaul E. McKenneyTORTURE_INITRD="$RCUTORTURE/initrd"; export TORTURE_INITRD
36d62c9833SPaul E. McKenneyTORTURE_KCONFIG_ARG=""
37b67a9170SPaul E. McKenneyTORTURE_KCONFIG_GDB_ARG=""
38b67a9170SPaul E. McKenneyTORTURE_BOOT_GDB_ARG=""
39b67a9170SPaul E. McKenneyTORTURE_QEMU_GDB_ARG=""
407831b391SPaul E. McKenneyTORTURE_JITTER_START=""
417831b391SPaul E. McKenneyTORTURE_JITTER_STOP=""
4204dbcdb4SPaul E. McKenneyTORTURE_KCONFIG_KASAN_ARG=""
437226c5cbSPaul E. McKenneyTORTURE_KCONFIG_KCSAN_ARG=""
4458d280bdSPaul E. McKenneyTORTURE_KMAKE_ARG=""
45642146b1SPaul E. McKenneyTORTURE_QEMU_MEM=512
4631015625SPaul E. McKenneytorture_qemu_mem_default=1
473d78668eSPaul E. McKenneyTORTURE_REMOTE=
48542e8332SPaul E. McKenneyTORTURE_SHUTDOWN_GRACE=180
4961010e74SPaul E. McKenneyTORTURE_SUITE=rcu
50a8dafbf3SPaul E. McKenneyTORTURE_MOD=rcutorture
51b93c765fSPaul E. McKenneyTORTURE_TRUST_MAKE=""
52c87b9c60SPaul E. McKenneyresdir=""
534275be83SPaul E. McKenneyconfigs=""
5443e38ab3SPaul E. McKenneycpus=0
5590e23b6bSPaul E. McKenneyds=`date +%Y.%m.%d-%H.%M.%S`
5665cbea5bSPaul E. McKenneyjitter="-1"
57c87b9c60SPaul E. McKenney
580bcca183SPaul E. McKenneystartdate="`date`"
590bcca183SPaul E. McKenneystarttime="`get_starttime`"
600bcca183SPaul E. McKenney
61c87b9c60SPaul E. McKenneyusage () {
62c87b9c60SPaul E. McKenney	echo "Usage: $scriptname optional arguments:"
63fbb9f853SPaul Gortmaker	echo "       --allcpus"
647dca9273SPaul E. McKenney	echo "       --bootargs kernel-boot-arguments"
65f189cc8cSPaul E. McKenney	echo "       --bootimage relative-path-to-kernel-boot-image"
6611274813SPaul E. McKenney	echo "       --buildonly"
677d3bb54aSPaul E. McKenney	echo "       --configs \"config-file list w/ repeat factor (3*TINY01)\""
6843e38ab3SPaul E. McKenney	echo "       --cpus N"
69847bfd25SPaul E. McKenney	echo "       --datestamp string"
708c55f227SPaul E. McKenney	echo "       --defconfig string"
713d2cc4feSPaul E. McKenney	echo "       --dryrun batches|scenarios|sched|script"
727de1ca35SPaul E. McKenney	echo "       --duration minutes | <seconds>s | <hours>h | <days>d"
73b67a9170SPaul E. McKenney	echo "       --gdb"
7454618088SPaul E. McKenney	echo "       --help"
75315c540dSPaul E. McKenney	echo "       --interactive"
766e524a60SPaul E. McKenney	echo "       --jitter N [ maxsleep (us) [ maxspin (us) ] ]"
77b6a4fd35SPaul E. McKenney	echo "       --kasan"
78d62c9833SPaul E. McKenney	echo "       --kconfig Kconfig-options"
79b6a4fd35SPaul E. McKenney	echo "       --kcsan"
8074878fb6SPaul E. McKenney	echo "       --kmake-arg kernel-make-arguments"
81315c540dSPaul E. McKenney	echo "       --mac nn:nn:nn:nn:nn:nn"
82642146b1SPaul E. McKenney	echo "       --memory megabytes|nnnG"
8373931b5eSPaul E. McKenney	echo "       --no-initrd"
848dcd6f3fSSeongJae Park	echo "       --qemu-args qemu-arguments"
854f8a0312SPaul E. McKenney	echo "       --qemu-cmd qemu-system-..."
863d78668eSPaul E. McKenney	echo "       --remote"
8761010e74SPaul E. McKenney	echo "       --results absolute-pathname"
88b6a4fd35SPaul E. McKenney	echo "       --shutdown-grace seconds"
8998bb264bSPaul E. McKenney	echo "       --torture lock|rcu|rcuscale|refscale|scf|X*"
90b93c765fSPaul E. McKenney	echo "       --trust-make"
91c87b9c60SPaul E. McKenney	exit 1
92c87b9c60SPaul E. McKenney}
93c87b9c60SPaul E. McKenney
94c87b9c60SPaul E. McKenneywhile test $# -gt 0
95c87b9c60SPaul E. McKenneydo
96c87b9c60SPaul E. McKenney	case "$1" in
97a3ba4972SPaul E. McKenney	--allcpus)
98a3ba4972SPaul E. McKenney		cpus=$TORTURE_ALLOTED_CPUS
99a3ba4972SPaul E. McKenney		max_cpus=$TORTURE_ALLOTED_CPUS
100a3ba4972SPaul E. McKenney		;;
101a8c06024SPaul E. McKenney	--bootargs|--bootarg)
1027dca9273SPaul E. McKenney		checkarg --bootargs "(list of kernel boot arguments)" "$#" "$2" '.*' '^--'
10345261371SPaul E. McKenney		TORTURE_BOOTARGS="$TORTURE_BOOTARGS $2"
1047dca9273SPaul E. McKenney		shift
1057dca9273SPaul E. McKenney		;;
106f189cc8cSPaul E. McKenney	--bootimage)
107f189cc8cSPaul E. McKenney		checkarg --bootimage "(relative path to kernel boot image)" "$#" "$2" '[a-zA-Z0-9][a-zA-Z0-9_]*' '^--'
108f189cc8cSPaul E. McKenney		TORTURE_BOOT_IMAGE="$2"
109f189cc8cSPaul E. McKenney		shift
110f189cc8cSPaul E. McKenney		;;
111a5136f4fSPaul E. McKenney	--buildonly|--build-only)
112805ffee2SPaul E. McKenney		TORTURE_BUILDONLY=1
11311274813SPaul E. McKenney		;;
114a8c06024SPaul E. McKenney	--configs|--config)
115e633e63aSPaul E. McKenney		checkarg --configs "(list of config files)" "$#" "$2" '^[^/.a-z]\+$' '^--'
11645261371SPaul E. McKenney		configs="$configs $2"
117c87b9c60SPaul E. McKenney		shift
118c87b9c60SPaul E. McKenney		;;
11943e38ab3SPaul E. McKenney	--cpus)
12043e38ab3SPaul E. McKenney		checkarg --cpus "(number)" "$#" "$2" '^[0-9]*$' '^--'
12143e38ab3SPaul E. McKenney		cpus=$2
1227225c077SPaul E. McKenney		TORTURE_ALLOTED_CPUS="$2"
1233d78668eSPaul E. McKenney		if test -z "$TORTURE_REMOTE"
1243d78668eSPaul E. McKenney		then
125b22eb7ceSPaul E. McKenney			max_cpus="`identify_qemu_vcpus`"
126b22eb7ceSPaul E. McKenney			if test "$TORTURE_ALLOTED_CPUS" -gt "$max_cpus"
127b22eb7ceSPaul E. McKenney			then
128b22eb7ceSPaul E. McKenney				TORTURE_ALLOTED_CPUS=$max_cpus
129b22eb7ceSPaul E. McKenney			fi
1303d78668eSPaul E. McKenney		fi
13143e38ab3SPaul E. McKenney		shift
13243e38ab3SPaul E. McKenney		;;
133847bfd25SPaul E. McKenney	--datestamp)
134114e4a4bSPaul E. McKenney		checkarg --datestamp "(relative pathname)" "$#" "$2" '^[a-zA-Z0-9._/-]*$' '^--'
135847bfd25SPaul E. McKenney		ds=$2
136847bfd25SPaul E. McKenney		shift
137847bfd25SPaul E. McKenney		;;
1388c55f227SPaul E. McKenney	--defconfig)
1398c55f227SPaul E. McKenney		checkarg --defconfig "defconfigtype" "$#" "$2" '^[^/][^/]*$' '^--'
1408c55f227SPaul E. McKenney		TORTURE_DEFCONFIG=$2
1418c55f227SPaul E. McKenney		shift
1428c55f227SPaul E. McKenney		;;
143a7582815SPaul E. McKenney	--dryrun)
1443d2cc4feSPaul E. McKenney		checkarg --dryrun "batches|sched|script" $# "$2" 'batches\|scenarios\|sched\|script' '^--'
145a7582815SPaul E. McKenney		dryrun=$2
146a7582815SPaul E. McKenney		shift
147a7582815SPaul E. McKenney		;;
148c87b9c60SPaul E. McKenney	--duration)
1497de1ca35SPaul E. McKenney		checkarg --duration "(minutes)" $# "$2" '^[0-9][0-9]*\(s\|m\|h\|d\|\)$' '^error'
1507de1ca35SPaul E. McKenney		mult=60
1517de1ca35SPaul E. McKenney		if echo "$2" | grep -q 's$'
1527de1ca35SPaul E. McKenney		then
1537de1ca35SPaul E. McKenney			mult=1
1547de1ca35SPaul E. McKenney		elif echo "$2" | grep -q 'h$'
1557de1ca35SPaul E. McKenney		then
1567de1ca35SPaul E. McKenney			mult=3600
1577de1ca35SPaul E. McKenney		elif echo "$2" | grep -q 'd$'
1587de1ca35SPaul E. McKenney		then
1597de1ca35SPaul E. McKenney			mult=86400
1607de1ca35SPaul E. McKenney		fi
1617de1ca35SPaul E. McKenney		ts=`echo $2 | sed -e 's/[smhd]$//'`
1627de1ca35SPaul E. McKenney		dur=$(($ts*mult))
163c87b9c60SPaul E. McKenney		shift
164c87b9c60SPaul E. McKenney		;;
165b67a9170SPaul E. McKenney	--gdb)
1665c92d750SPaul E. McKenney		TORTURE_KCONFIG_GDB_ARG="CONFIG_DEBUG_INFO_NONE=n CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y"; export TORTURE_KCONFIG_GDB_ARG
167b67a9170SPaul E. McKenney		TORTURE_BOOT_GDB_ARG="nokaslr"; export TORTURE_BOOT_GDB_ARG
168b67a9170SPaul E. McKenney		TORTURE_QEMU_GDB_ARG="-s -S"; export TORTURE_QEMU_GDB_ARG
169b67a9170SPaul E. McKenney		;;
17054618088SPaul E. McKenney	--help|-h)
17154618088SPaul E. McKenney		usage
17254618088SPaul E. McKenney		;;
173315c540dSPaul E. McKenney	--interactive)
174a0edd47cSPaul E. McKenney		TORTURE_QEMU_INTERACTIVE=1; export TORTURE_QEMU_INTERACTIVE
175315c540dSPaul E. McKenney		;;
1766e524a60SPaul E. McKenney	--jitter)
1776e524a60SPaul E. McKenney		checkarg --jitter "(# threads [ sleep [ spin ] ])" $# "$2" '^-\{,1\}[0-9]\+\( \+[0-9]\+\)\{,2\} *$' '^error$'
1786e524a60SPaul E. McKenney		jitter="$2"
1796e524a60SPaul E. McKenney		shift
1806e524a60SPaul E. McKenney		;;
181b6a4fd35SPaul E. McKenney	--kasan)
1825c92d750SPaul E. McKenney		TORTURE_KCONFIG_KASAN_ARG="CONFIG_DEBUG_INFO_NONE=n CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y CONFIG_KASAN=y"; export TORTURE_KCONFIG_KASAN_ARG
18331015625SPaul E. McKenney		if test -n "$torture_qemu_mem_default"
18431015625SPaul E. McKenney		then
18531015625SPaul E. McKenney			TORTURE_QEMU_MEM=2G
18631015625SPaul E. McKenney		fi
187b6a4fd35SPaul E. McKenney		;;
188a5136f4fSPaul E. McKenney	--kconfig|--kconfigs)
189*5cec64e4SPaul E. McKenney		checkarg --kconfig "(Kconfig options)" $# "$2" '^\(#CHECK#\)\?CONFIG_[A-Z0-9_]\+=\([ynm]\|[0-9]\+\|"[^"]*"\)\( \(#CHECK#\)\?CONFIG_[A-Z0-9_]\+=\([ynm]\|[0-9]\+\|"[^"]*"\)\)*$' '^error$'
19045261371SPaul E. McKenney		TORTURE_KCONFIG_ARG="`echo "$TORTURE_KCONFIG_ARG $2" | sed -e 's/^ *//' -e 's/ *$//'`"
191d62c9833SPaul E. McKenney		shift
192d62c9833SPaul E. McKenney		;;
1937226c5cbSPaul E. McKenney	--kcsan)
1945c92d750SPaul E. McKenney		TORTURE_KCONFIG_KCSAN_ARG="CONFIG_DEBUG_INFO_NONE=n CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y CONFIG_KCSAN=y CONFIG_KCSAN_STRICT=y CONFIG_KCSAN_REPORT_ONCE_IN_MS=100000 CONFIG_KCSAN_VERBOSE=y CONFIG_DEBUG_LOCK_ALLOC=y CONFIG_PROVE_LOCKING=y"; export TORTURE_KCONFIG_KCSAN_ARG
1957226c5cbSPaul E. McKenney		;;
196a5136f4fSPaul E. McKenney	--kmake-arg|--kmake-args)
19774878fb6SPaul E. McKenney		checkarg --kmake-arg "(kernel make arguments)" $# "$2" '.*' '^error$'
19845261371SPaul E. McKenney		TORTURE_KMAKE_ARG="`echo "$TORTURE_KMAKE_ARG $2" | sed -e 's/^ *//' -e 's/ *$//'`"
19974878fb6SPaul E. McKenney		shift
20074878fb6SPaul E. McKenney		;;
201315c540dSPaul E. McKenney	--mac)
202315c540dSPaul E. McKenney		checkarg --mac "(MAC address)" $# "$2" '^\([0-9a-fA-F]\{2\}:\)\{5\}[0-9a-fA-F]\{2\}$' error
20358f724f7SPaul E. McKenney		TORTURE_QEMU_MAC=$2
204315c540dSPaul E. McKenney		shift
205315c540dSPaul E. McKenney		;;
206642146b1SPaul E. McKenney	--memory)
207642146b1SPaul E. McKenney		checkarg --memory "(memory size)" $# "$2" '^[0-9]\+[MG]\?$' error
208642146b1SPaul E. McKenney		TORTURE_QEMU_MEM=$2
20931015625SPaul E. McKenney		torture_qemu_mem_default=
210642146b1SPaul E. McKenney		shift
211642146b1SPaul E. McKenney		;;
21273931b5eSPaul E. McKenney	--no-initrd)
2132f66dbc1SPaul E. McKenney		TORTURE_INITRD=""; export TORTURE_INITRD
21473931b5eSPaul E. McKenney		;;
215a8c06024SPaul E. McKenney	--qemu-args|--qemu-arg)
2168dcd6f3fSSeongJae Park		checkarg --qemu-args "(qemu arguments)" $# "$2" '^-' '^error'
21745261371SPaul E. McKenney		TORTURE_QEMU_ARG="`echo "$TORTURE_QEMU_ARG $2" | sed -e 's/^ *//' -e 's/ *$//'`"
218e9ce6400SPaul E. McKenney		shift
219e9ce6400SPaul E. McKenney		;;
2204f8a0312SPaul E. McKenney	--qemu-cmd)
2214f8a0312SPaul E. McKenney		checkarg --qemu-cmd "(qemu-system-...)" $# "$2" 'qemu-system-' '^--'
222250da31eSPaul E. McKenney		TORTURE_QEMU_CMD="$2"
2234f8a0312SPaul E. McKenney		shift
2244f8a0312SPaul E. McKenney		;;
2253d78668eSPaul E. McKenney	--remote)
2263d78668eSPaul E. McKenney		TORTURE_REMOTE=1
2273d78668eSPaul E. McKenney		;;
228c87b9c60SPaul E. McKenney	--results)
229e9ce6400SPaul E. McKenney		checkarg --results "(absolute pathname)" "$#" "$2" '^/' '^error'
230c87b9c60SPaul E. McKenney		resdir=$2
231c87b9c60SPaul E. McKenney		shift
232c87b9c60SPaul E. McKenney		;;
233542e8332SPaul E. McKenney	--shutdown-grace)
234542e8332SPaul E. McKenney		checkarg --shutdown-grace "(seconds)" "$#" "$2" '^[0-9]*$' '^error'
235542e8332SPaul E. McKenney		TORTURE_SHUTDOWN_GRACE=$2
236542e8332SPaul E. McKenney		shift
237542e8332SPaul E. McKenney		;;
23861010e74SPaul E. McKenney	--torture)
23998bb264bSPaul E. McKenney		checkarg --torture "(suite name)" "$#" "$2" '^\(lock\|rcu\|rcuscale\|refscale\|scf\|X.*\)$' '^--'
24061010e74SPaul E. McKenney		TORTURE_SUITE=$2
241a8dafbf3SPaul E. McKenney		TORTURE_MOD="`echo $TORTURE_SUITE | sed -e 's/^\(lock\|rcu\|scf\)$/\1torture/'`"
24261010e74SPaul E. McKenney		shift
2434e88ec4aSPaul E. McKenney		if test "$TORTURE_SUITE" = rcuscale || test "$TORTURE_SUITE" = refscale
244adcfe76cSPaul E. McKenney		then
245f71d8311SPaul E. McKenney			# If you really want jitter for refscale or
2464e88ec4aSPaul E. McKenney			# rcuscale, specify it after specifying the rcuscale
247f71d8311SPaul E. McKenney			# or the refscale.  (But why jitter in these cases?)
248adcfe76cSPaul E. McKenney			jitter=0
249adcfe76cSPaul E. McKenney		fi
25061010e74SPaul E. McKenney		;;
251b93c765fSPaul E. McKenney	--trust-make)
252b93c765fSPaul E. McKenney		TORTURE_TRUST_MAKE="y"
253b93c765fSPaul E. McKenney		;;
254c87b9c60SPaul E. McKenney	*)
2552bcdf4e3SPaul E. McKenney		echo Unknown argument $1
256c87b9c60SPaul E. McKenney		usage
257c87b9c60SPaul E. McKenney		;;
258c87b9c60SPaul E. McKenney	esac
259c87b9c60SPaul E. McKenney	shift
260c87b9c60SPaul E. McKenneydone
261c87b9c60SPaul E. McKenney
262755cf0afSPaul E. McKenneyif test -n "$dryrun" || test -z "$TORTURE_INITRD" || tools/testing/selftests/rcutorture/bin/mkinitrd.sh
2638f15c682SConnor Shuthen
2648f15c682SConnor Shu	:
2658f15c682SConnor Shuelse
2668f15c682SConnor Shu	echo No initrd and unable to create one, aborting test >&2
2678f15c682SConnor Shu	exit 1
2688f15c682SConnor Shufi
2698f15c682SConnor Shu
270a7d89cfbSPaul E. McKenneyCONFIGFRAG=${RCUTORTURE}/configs/${TORTURE_SUITE}; export CONFIGFRAG
2714275be83SPaul E. McKenney
27225b4da74SPaul E. McKenneydefaultconfigs="`tr '\012' ' ' < $CONFIGFRAG/CFLIST`"
2734275be83SPaul E. McKenneyif test -z "$configs"
2744275be83SPaul E. McKenneythen
27525b4da74SPaul E. McKenney	configs=$defaultconfigs
2764275be83SPaul E. McKenneyfi
277c87b9c60SPaul E. McKenney
278c87b9c60SPaul E. McKenneyif test -z "$resdir"
279c87b9c60SPaul E. McKenneythen
280a7d89cfbSPaul E. McKenney	resdir=$RCUTORTURE/res
281330a76f1SPaul E. McKenneyfi
282daeda23dSPaul E. McKenney
28378ad0693SPaul E. McKenney# Create a file of test-name/#cpus pairs, sorted by decreasing #cpus.
28425b4da74SPaul E. McKenneyconfigs_derep=
285c87b9c60SPaul E. McKenneyfor CF in $configs
286c87b9c60SPaul E. McKenneydo
2877d3bb54aSPaul E. McKenney	case $CF in
288010e5773SPaul E. McKenney	[0-9]\**|[0-9][0-9]\**|[0-9][0-9][0-9]\**|[0-9][0-9][0-9][0-9]\**)
2897d3bb54aSPaul E. McKenney		config_reps=`echo $CF | sed -e 's/\*.*$//'`
2907d3bb54aSPaul E. McKenney		CF1=`echo $CF | sed -e 's/^[^*]*\*//'`
2917d3bb54aSPaul E. McKenney		;;
2927d3bb54aSPaul E. McKenney	*)
2937d3bb54aSPaul E. McKenney		config_reps=1
2947d3bb54aSPaul E. McKenney		CF1=$CF
2957d3bb54aSPaul E. McKenney		;;
2967d3bb54aSPaul E. McKenney	esac
29725b4da74SPaul E. McKenney	for ((cur_rep=0;cur_rep<$config_reps;cur_rep++))
29825b4da74SPaul E. McKenney	do
29925b4da74SPaul E. McKenney		configs_derep="$configs_derep $CF1"
30025b4da74SPaul E. McKenney	done
30125b4da74SPaul E. McKenneydone
30225b4da74SPaul E. McKenneytouch $T/cfgcpu
30325b4da74SPaul E. McKenneyconfigs_derep="`echo $configs_derep | sed -e "s/\<CFLIST\>/$defaultconfigs/g"`"
304b67a9170SPaul E. McKenneyif test -n "$TORTURE_KCONFIG_GDB_ARG"
305b67a9170SPaul E. McKenneythen
306b67a9170SPaul E. McKenney	if test "`echo $configs_derep | wc -w`" -gt 1
307b67a9170SPaul E. McKenney	then
308b67a9170SPaul E. McKenney		echo "The --config list is: $configs_derep."
309b67a9170SPaul E. McKenney		echo "Only one --config permitted with --gdb, terminating."
310b67a9170SPaul E. McKenney		exit 1
311b67a9170SPaul E. McKenney	fi
312b67a9170SPaul E. McKenneyfi
31311202817SPaul E. McKenneyecho 'BEGIN {' > $T/cfgcpu.awk
31411202817SPaul E. McKenneyfor CF1 in `echo $configs_derep | tr -s ' ' '\012' | sort -u`
31525b4da74SPaul E. McKenneydo
3167d3bb54aSPaul E. McKenney	if test -f "$CONFIGFRAG/$CF1"
317f43f8f73SPaul E. McKenney	then
31822bf64ccSPaul E. McKenney		if echo "$TORTURE_KCONFIG_ARG" | grep -q '\<CONFIG_NR_CPUS='
31922bf64ccSPaul E. McKenney		then
32022bf64ccSPaul E. McKenney			echo "$TORTURE_KCONFIG_ARG" | tr -s ' ' | tr ' ' '\012' > $T/KCONFIG_ARG
32122bf64ccSPaul E. McKenney			cpu_count=`configNR_CPUS.sh $T/KCONFIG_ARG`
32222bf64ccSPaul E. McKenney		else
3237d3bb54aSPaul E. McKenney			cpu_count=`configNR_CPUS.sh $CONFIGFRAG/$CF1`
32422bf64ccSPaul E. McKenney		fi
3257d3bb54aSPaul E. McKenney		cpu_count=`configfrag_boot_cpus "$TORTURE_BOOTARGS" "$CONFIGFRAG/$CF1" "$cpu_count"`
326c234ee4bSPaul E. McKenney		cpu_count=`configfrag_boot_maxcpus "$TORTURE_BOOTARGS" "$CONFIGFRAG/$CF1" "$cpu_count"`
32711202817SPaul E. McKenney		echo 'scenariocpu["'"$CF1"'"] = '"$cpu_count"';' >> $T/cfgcpu.awk
328f43f8f73SPaul E. McKenney	else
3297d3bb54aSPaul E. McKenney		echo "The --configs file $CF1 does not exist, terminating."
33043e38ab3SPaul E. McKenney		exit 1
331f43f8f73SPaul E. McKenney	fi
332c87b9c60SPaul E. McKenneydone
33311202817SPaul E. McKenneycat << '___EOF___' >> $T/cfgcpu.awk
33411202817SPaul E. McKenney}
33511202817SPaul E. McKenney{
33611202817SPaul E. McKenney	for (i = 1; i <= NF; i++)
33711202817SPaul E. McKenney		print $i, scenariocpu[$i];
33811202817SPaul E. McKenney}
33911202817SPaul E. McKenney___EOF___
34011202817SPaul E. McKenneyecho $configs_derep | awk -f $T/cfgcpu.awk > $T/cfgcpu
341b038c58bSPaul E. McKenneysort -k2nr $T/cfgcpu -T="$T" > $T/cfgcpu.sort
34243e38ab3SPaul E. McKenney
34378ad0693SPaul E. McKenney# Use a greedy bin-packing algorithm, sorting the list accordingly.
34453954671SPaul E. McKenneyawk < $T/cfgcpu.sort > $T/cfgcpu.pack -v ncpus=$cpus '
34553954671SPaul E. McKenneyBEGIN {
34653954671SPaul E. McKenney	njobs = 0;
34753954671SPaul E. McKenney}
34853954671SPaul E. McKenney
34953954671SPaul E. McKenney{
35078ad0693SPaul E. McKenney	# Read file of tests and corresponding required numbers of CPUs.
35153954671SPaul E. McKenney	cf[njobs] = $1;
35253954671SPaul E. McKenney	cpus[njobs] = $2;
35353954671SPaul E. McKenney	njobs++;
35453954671SPaul E. McKenney}
35553954671SPaul E. McKenney
35653954671SPaul E. McKenneyEND {
35753954671SPaul E. McKenney	batch = 0;
35853954671SPaul E. McKenney	nc = -1;
35978ad0693SPaul E. McKenney
36011202817SPaul E. McKenney	# Each pass through the following loop creates on test batch that
36111202817SPaul E. McKenney	# can be executed concurrently given ncpus.  Note that a given test
36211202817SPaul E. McKenney	# that requires more than the available CPUs will run in its own
36311202817SPaul E. McKenney	# batch.  Such tests just have to make do with what is available.
36453954671SPaul E. McKenney	while (nc != ncpus) {
36553954671SPaul E. McKenney		batch++;
36653954671SPaul E. McKenney		nc = ncpus;
36778ad0693SPaul E. McKenney
36878ad0693SPaul E. McKenney		# Each pass through the following loop considers one
36978ad0693SPaul E. McKenney		# test for inclusion in the current batch.
37053954671SPaul E. McKenney		for (i = 0; i < njobs; i++) {
37153954671SPaul E. McKenney			if (done[i])
37278ad0693SPaul E. McKenney				continue; # Already part of a batch.
37353954671SPaul E. McKenney			if (nc >= cpus[i] || nc == ncpus) {
37478ad0693SPaul E. McKenney
37578ad0693SPaul E. McKenney				# This test fits into the current batch.
37653954671SPaul E. McKenney				done[i] = batch;
37753954671SPaul E. McKenney				nc -= cpus[i];
37853954671SPaul E. McKenney				if (nc <= 0)
37978ad0693SPaul E. McKenney					break; # Too-big test in its own batch.
38053954671SPaul E. McKenney			}
38153954671SPaul E. McKenney		}
38253954671SPaul E. McKenney	}
38378ad0693SPaul E. McKenney
38478ad0693SPaul E. McKenney	# Dump out the tests in batch order.
38553954671SPaul E. McKenney	for (b = 1; b <= batch; b++)
38653954671SPaul E. McKenney		for (i = 0; i < njobs; i++)
38753954671SPaul E. McKenney			if (done[i] == b)
38853954671SPaul E. McKenney				print cf[i], cpus[i];
38953954671SPaul E. McKenney}'
39053954671SPaul E. McKenney
39178ad0693SPaul E. McKenney# Generate a script to execute the tests in appropriate batches.
39261010e74SPaul E. McKenneycat << ___EOF___ > $T/script
39314d9d84cSPaul E. McKenneyCONFIGFRAG="$CONFIGFRAG"; export CONFIGFRAG
394a7d89cfbSPaul E. McKenneyRCUTORTURE="$RCUTORTURE"; export RCUTORTURE
39514d9d84cSPaul E. McKenneyPATH="$PATH"; export PATH
3967225c077SPaul E. McKenneyTORTURE_ALLOTED_CPUS="$TORTURE_ALLOTED_CPUS"; export TORTURE_ALLOTED_CPUS
397f189cc8cSPaul E. McKenneyTORTURE_BOOT_IMAGE="$TORTURE_BOOT_IMAGE"; export TORTURE_BOOT_IMAGE
39814d9d84cSPaul E. McKenneyTORTURE_BUILDONLY="$TORTURE_BUILDONLY"; export TORTURE_BUILDONLY
3998c55f227SPaul E. McKenneyTORTURE_DEFCONFIG="$TORTURE_DEFCONFIG"; export TORTURE_DEFCONFIG
40014d9d84cSPaul E. McKenneyTORTURE_INITRD="$TORTURE_INITRD"; export TORTURE_INITRD
401d62c9833SPaul E. McKenneyTORTURE_KCONFIG_ARG="$TORTURE_KCONFIG_ARG"; export TORTURE_KCONFIG_ARG
402b67a9170SPaul E. McKenneyTORTURE_KCONFIG_GDB_ARG="$TORTURE_KCONFIG_GDB_ARG"; export TORTURE_KCONFIG_GDB_ARG
403b67a9170SPaul E. McKenneyTORTURE_BOOT_GDB_ARG="$TORTURE_BOOT_GDB_ARG"; export TORTURE_BOOT_GDB_ARG
404b67a9170SPaul E. McKenneyTORTURE_QEMU_GDB_ARG="$TORTURE_QEMU_GDB_ARG"; export TORTURE_QEMU_GDB_ARG
40504dbcdb4SPaul E. McKenneyTORTURE_KCONFIG_KASAN_ARG="$TORTURE_KCONFIG_KASAN_ARG"; export TORTURE_KCONFIG_KASAN_ARG
4067226c5cbSPaul E. McKenneyTORTURE_KCONFIG_KCSAN_ARG="$TORTURE_KCONFIG_KCSAN_ARG"; export TORTURE_KCONFIG_KCSAN_ARG
40714d9d84cSPaul E. McKenneyTORTURE_KMAKE_ARG="$TORTURE_KMAKE_ARG"; export TORTURE_KMAKE_ARG
408a8dafbf3SPaul E. McKenneyTORTURE_MOD="$TORTURE_MOD"; export TORTURE_MOD
40914d9d84cSPaul E. McKenneyTORTURE_QEMU_CMD="$TORTURE_QEMU_CMD"; export TORTURE_QEMU_CMD
41014d9d84cSPaul E. McKenneyTORTURE_QEMU_INTERACTIVE="$TORTURE_QEMU_INTERACTIVE"; export TORTURE_QEMU_INTERACTIVE
41114d9d84cSPaul E. McKenneyTORTURE_QEMU_MAC="$TORTURE_QEMU_MAC"; export TORTURE_QEMU_MAC
412642146b1SPaul E. McKenneyTORTURE_QEMU_MEM="$TORTURE_QEMU_MEM"; export TORTURE_QEMU_MEM
413542e8332SPaul E. McKenneyTORTURE_SHUTDOWN_GRACE="$TORTURE_SHUTDOWN_GRACE"; export TORTURE_SHUTDOWN_GRACE
41414d9d84cSPaul E. McKenneyTORTURE_SUITE="$TORTURE_SUITE"; export TORTURE_SUITE
415b93c765fSPaul E. McKenneyTORTURE_TRUST_MAKE="$TORTURE_TRUST_MAKE"; export TORTURE_TRUST_MAKE
4161f5d0920SPaul E. McKenneyif ! test -e $resdir
4171f5d0920SPaul E. McKenneythen
4181f5d0920SPaul E. McKenney	mkdir -p "$resdir" || :
4191f5d0920SPaul E. McKenneyfi
420bc407358SPaul E. McKenneymkdir -p $resdir/$ds
4216387ecbcSPaul E. McKenneyTORTURE_RESDIR="$resdir/$ds"; export TORTURE_RESDIR
422c821f855SPaul E. McKenneyTORTURE_STOPFILE="$resdir/$ds/STOP.1"; export TORTURE_STOPFILE
4231f5d0920SPaul E. McKenneyecho Results directory: $resdir/$ds
4241f5d0920SPaul E. McKenneyecho $scriptname $args
4251f5d0920SPaul E. McKenneytouch $resdir/$ds/log
4261f5d0920SPaul E. McKenneyecho $scriptname $args >> $resdir/$ds/log
4277ef0d5a3SPaul E. McKenneyecho ${TORTURE_SUITE} > $resdir/$ds/torture_suite
428f9d2f1e2SPaul E. McKenneyecho Build directory: `pwd` > $resdir/$ds/testid.txt
4291f5d0920SPaul E. McKenneyif test -d .git
4301f5d0920SPaul E. McKenneythen
431f9d2f1e2SPaul E. McKenney	echo Current commit: `git rev-parse HEAD` >> $resdir/$ds/testid.txt
432f9d2f1e2SPaul E. McKenney	echo >> $resdir/$ds/testid.txt
433f9d2f1e2SPaul E. McKenney	echo ' ---' Output of "'"git status"'": >> $resdir/$ds/testid.txt
4341f5d0920SPaul E. McKenney	git status >> $resdir/$ds/testid.txt
435f9d2f1e2SPaul E. McKenney	echo >> $resdir/$ds/testid.txt
436f9d2f1e2SPaul E. McKenney	echo >> $resdir/$ds/testid.txt
437f9d2f1e2SPaul E. McKenney	echo ' ---' Output of "'"git diff HEAD"'": >> $resdir/$ds/testid.txt
4385d9853f3SPaul E. McKenney	git diff HEAD >> $resdir/$ds/testid.txt
4391f5d0920SPaul E. McKenneyfi
44061010e74SPaul E. McKenney___EOF___
441cdeef67dSPaul E. McKenneykvm-assign-cpus.sh /sys/devices/system/node > $T/cpuarray.awk
442cdeef67dSPaul E. McKenneykvm-get-cpus-script.sh $T/cpuarray.awk $T/dumpbatches.awk
443cdeef67dSPaul E. McKenneycat << '___EOF___' >> $T/dumpbatches.awk
444a3d79412SPaul E. McKenneyBEGIN {
44543e38ab3SPaul E. McKenney	i = 0;
44643e38ab3SPaul E. McKenney}
44743e38ab3SPaul E. McKenney
44843e38ab3SPaul E. McKenney{
44943e38ab3SPaul E. McKenney	cf[i] = $1;
45043e38ab3SPaul E. McKenney	cpus[i] = $2;
45143e38ab3SPaul E. McKenney	i++;
45243e38ab3SPaul E. McKenney}
45343e38ab3SPaul E. McKenney
45478ad0693SPaul E. McKenney# Dump out the scripting required to run one test batch.
455cdeef67dSPaul E. McKenneyfunction dump(first, pastlast, batchnum,  affinitylist)
45643e38ab3SPaul E. McKenney{
457fa48beb5SSeongJae Park	print "echo ----Start batch " batchnum ": `date` | tee -a " rd "log";
45885ef2bd2SPaul E. McKenney	print "needqemurun="
45943e38ab3SPaul E. McKenney	jn=1
4607831b391SPaul E. McKenney	njitter = 0;
4617831b391SPaul E. McKenney	split(jitter, ja);
4627831b391SPaul E. McKenney	if (ja[1] == -1 && ncpus == 0)
4637831b391SPaul E. McKenney		njitter = 1;
4647831b391SPaul E. McKenney	else if (ja[1] == -1)
4657831b391SPaul E. McKenney		njitter = ncpus;
4667831b391SPaul E. McKenney	else
4677831b391SPaul E. McKenney		njitter = ja[1];
4687831b391SPaul E. McKenney	print "TORTURE_JITTER_START=\". jitterstart.sh " njitter " " rd " " dur " " ja[2] " " ja[3] "\"; export TORTURE_JITTER_START";
4697831b391SPaul E. McKenney	print "TORTURE_JITTER_STOP=\". jitterstop.sh " rd " \"; export TORTURE_JITTER_STOP"
47043e38ab3SPaul E. McKenney	for (j = first; j < pastlast; j++) {
4710ae3f73aSPaul E. McKenney		cpusr[jn] = cpus[j];
47243e38ab3SPaul E. McKenney		if (cfrep[cf[j]] == "") {
4730ae3f73aSPaul E. McKenney			cfr[jn] = cf[j];
47443e38ab3SPaul E. McKenney			cfrep[cf[j]] = 1;
47543e38ab3SPaul E. McKenney		} else {
47643e38ab3SPaul E. McKenney			cfrep[cf[j]]++;
4770ae3f73aSPaul E. McKenney			cfr[jn] = cf[j] "." cfrep[cf[j]];
47843e38ab3SPaul E. McKenney		}
4793c43ce53SPaul E. McKenney		builddir=rd cfr[jn] "/build";
480df1cc81bSPaul E. McKenney		if (cpusr[jn] > ncpus && ncpus != 0)
48191afa21dSPaul E. McKenney			ovf = "-ovf";
482df1cc81bSPaul E. McKenney		else
483df1cc81bSPaul E. McKenney			ovf = "";
484fa48beb5SSeongJae Park		print "echo ", cfr[jn], cpusr[jn] ovf ": Starting build. `date` | tee -a " rd "log";
4850ae3f73aSPaul E. McKenney		print "mkdir " rd cfr[jn] " || :";
4863c43ce53SPaul E. McKenney		print "touch " builddir ".wait";
487cdeef67dSPaul E. McKenney		affinitylist = "";
488cdeef67dSPaul E. McKenney		if (gotcpus()) {
489cdeef67dSPaul E. McKenney			affinitylist = nextcpus(cpusr[jn]);
490cdeef67dSPaul E. McKenney		}
491cdeef67dSPaul E. McKenney		if (affinitylist ~ /^[0-9,-][0-9,-]*$/)
492cdeef67dSPaul E. McKenney			print "export TORTURE_AFFINITY=" affinitylist;
493cdeef67dSPaul E. McKenney		else
494cdeef67dSPaul E. McKenney			print "export TORTURE_AFFINITY=";
4953c43ce53SPaul E. McKenney		print "kvm-test-1-run.sh " CONFIGDIR cf[j], rd cfr[jn], dur " \"" TORTURE_QEMU_ARG "\" \"" TORTURE_BOOTARGS "\" > " rd cfr[jn]  "/kvm-test-1-run.sh.out 2>&1 &"
496fa48beb5SSeongJae Park		print "echo ", cfr[jn], cpusr[jn] ovf ": Waiting for build to complete. `date` | tee -a " rd "log";
49743e38ab3SPaul E. McKenney		print "while test -f " builddir ".wait"
49843e38ab3SPaul E. McKenney		print "do"
49943e38ab3SPaul E. McKenney		print "\tsleep 1"
50043e38ab3SPaul E. McKenney		print "done"
501fa48beb5SSeongJae Park		print "echo ", cfr[jn], cpusr[jn] ovf ": Build complete. `date` | tee -a " rd "log";
50243e38ab3SPaul E. McKenney		jn++;
50343e38ab3SPaul E. McKenney	}
504b674100eSPaul E. McKenney	print "runfiles="
50543e38ab3SPaul E. McKenney	for (j = 1; j < jn; j++) {
5063c43ce53SPaul E. McKenney		builddir=rd cfr[j] "/build";
507b674100eSPaul E. McKenney		if (TORTURE_BUILDONLY)
50843e38ab3SPaul E. McKenney			print "rm -f " builddir ".ready"
509b674100eSPaul E. McKenney		else
510b674100eSPaul E. McKenney			print "mv " builddir ".ready " builddir ".run"
511b674100eSPaul E. McKenney			print "runfiles=\"$runfiles " builddir ".run\""
512b674100eSPaul E. McKenney		fi
51385ef2bd2SPaul E. McKenney		print "if test -f \"" rd cfr[j] "/builtkernel\""
5149bee2c6fSPaul E. McKenney		print "then"
515fa48beb5SSeongJae Park		print "\techo ----", cfr[j], cpusr[j] ovf ": Kernel present. `date` | tee -a " rd "log";
51685ef2bd2SPaul E. McKenney		print "\tneedqemurun=1"
5179bee2c6fSPaul E. McKenney		print "fi"
51843e38ab3SPaul E. McKenney	}
5191f32ee65SPaul E. McKenney	if (TORTURE_BUILDONLY && njitter != 0) {
5201f32ee65SPaul E. McKenney		njitter = 0;
521fa48beb5SSeongJae Park		print "echo Build-only run, so suppressing jitter | tee -a " rd "log"
5221f32ee65SPaul E. McKenney	}
52385ef2bd2SPaul E. McKenney	if (TORTURE_BUILDONLY) {
52485ef2bd2SPaul E. McKenney		print "needqemurun="
52585ef2bd2SPaul E. McKenney	}
52685ef2bd2SPaul E. McKenney	print "if test -n \"$needqemurun\""
5279bee2c6fSPaul E. McKenney	print "then"
528fa48beb5SSeongJae Park	print "\techo ---- Starting kernels. `date` | tee -a " rd "log";
5297831b391SPaul E. McKenney	print "\t$TORTURE_JITTER_START";
530b674100eSPaul E. McKenney	print "\twhile ls $runfiles > /dev/null 2>&1"
531b674100eSPaul E. McKenney	print "\tdo"
532b674100eSPaul E. McKenney	print "\t\t:"
533b674100eSPaul E. McKenney	print "\tdone"
5347831b391SPaul E. McKenney	print "\t$TORTURE_JITTER_STOP";
535fa48beb5SSeongJae Park	print "\techo ---- All kernel runs complete. `date` | tee -a " rd "log";
53685ef2bd2SPaul E. McKenney	print "else"
53785ef2bd2SPaul E. McKenney	print "\twait"
538fa48beb5SSeongJae Park	print "\techo ---- No kernel runs. `date` | tee -a " rd "log";
5399bee2c6fSPaul E. McKenney	print "fi"
54043e38ab3SPaul E. McKenney	for (j = 1; j < jn; j++) {
541fa48beb5SSeongJae Park		print "echo ----", cfr[j], cpusr[j] ovf ": Build/run results: | tee -a " rd "log";
542fa48beb5SSeongJae Park		print "cat " rd cfr[j]  "/kvm-test-1-run.sh.out | tee -a " rd "log";
54343e38ab3SPaul E. McKenney	}
54443e38ab3SPaul E. McKenney}
54543e38ab3SPaul E. McKenney
54643e38ab3SPaul E. McKenneyEND {
54743e38ab3SPaul E. McKenney	njobs = i;
54843e38ab3SPaul E. McKenney	nc = ncpus;
54943e38ab3SPaul E. McKenney	first = 0;
55083977d27SPaul E. McKenney	batchnum = 1;
55178ad0693SPaul E. McKenney
55278ad0693SPaul E. McKenney	# Each pass through the following loop considers one test.
55343e38ab3SPaul E. McKenney	for (i = 0; i < njobs; i++) {
55443e38ab3SPaul E. McKenney		if (ncpus == 0) {
55578ad0693SPaul E. McKenney			# Sequential test specified, each test its own batch.
55683977d27SPaul E. McKenney			dump(i, i + 1, batchnum);
55743e38ab3SPaul E. McKenney			first = i;
55883977d27SPaul E. McKenney			batchnum++;
55943e38ab3SPaul E. McKenney		} else if (nc < cpus[i] && i != 0) {
56078ad0693SPaul E. McKenney			# Out of CPUs, dump out a batch.
56183977d27SPaul E. McKenney			dump(first, i, batchnum);
56243e38ab3SPaul E. McKenney			first = i;
56343e38ab3SPaul E. McKenney			nc = ncpus;
56483977d27SPaul E. McKenney			batchnum++;
56543e38ab3SPaul E. McKenney		}
56678ad0693SPaul E. McKenney		# Account for the CPUs needed by the current test.
56743e38ab3SPaul E. McKenney		nc -= cpus[i];
56843e38ab3SPaul E. McKenney	}
56978ad0693SPaul E. McKenney	# Dump the last batch.
57043e38ab3SPaul E. McKenney	if (ncpus != 0)
57183977d27SPaul E. McKenney		dump(first, i, batchnum);
572a3d79412SPaul E. McKenney}
573a3d79412SPaul E. McKenney___EOF___
574a3d79412SPaul E. McKenneyawk < $T/cfgcpu.pack \
575a3d79412SPaul E. McKenney	-v TORTURE_BUILDONLY="$TORTURE_BUILDONLY" \
576a3d79412SPaul E. McKenney	-v CONFIGDIR="$CONFIGFRAG/" \
577a7d89cfbSPaul E. McKenney	-v RCUTORTURE="$RCUTORTURE" \
578a3d79412SPaul E. McKenney	-v ncpus=$cpus \
579a3d79412SPaul E. McKenney	-v jitter="$jitter" \
580a3d79412SPaul E. McKenney	-v rd=$resdir/$ds/ \
581a3d79412SPaul E. McKenney	-v dur=$dur \
582a3d79412SPaul E. McKenney	-v TORTURE_QEMU_ARG="$TORTURE_QEMU_ARG" \
583a3d79412SPaul E. McKenney	-v TORTURE_BOOTARGS="$TORTURE_BOOTARGS" \
584a3d79412SPaul E. McKenney	-f $T/dumpbatches.awk >> $T/script
585f254a0b5SPaul E. McKenneyecho kvm-end-run-stats.sh "$resdir/$ds" "$starttime" >> $T/script
5861f5d0920SPaul E. McKenney
587d6100d76SPaul E. McKenney# Extract the tests and their batches from the script.
588eeb4dd9eSTiezhu Yanggrep -E 'Start batch|Starting build\.' $T/script | grep -v ">>" |
589d6100d76SPaul E. McKenney	sed -e 's/:.*$//' -e 's/^echo //' -e 's/-ovf//' |
590d6100d76SPaul E. McKenney	awk '
591d6100d76SPaul E. McKenney	/^----Start/ {
592d6100d76SPaul E. McKenney		batchno = $3;
593d6100d76SPaul E. McKenney		next;
594d6100d76SPaul E. McKenney	}
595d6100d76SPaul E. McKenney	{
596d6100d76SPaul E. McKenney		print batchno, $1, $2
597d6100d76SPaul E. McKenney	}' > $T/batches
598d6100d76SPaul E. McKenney
5993d2cc4feSPaul E. McKenney# As above, but one line per batch.
6003d2cc4feSPaul E. McKenneygrep -v '^#' $T/batches | awk '
6013d2cc4feSPaul E. McKenneyBEGIN {
6023d2cc4feSPaul E. McKenney	oldbatch = 1;
6033d2cc4feSPaul E. McKenney}
6043d2cc4feSPaul E. McKenney
6053d2cc4feSPaul E. McKenney{
6063d2cc4feSPaul E. McKenney	if (oldbatch != $1) {
6073d2cc4feSPaul E. McKenney		print ++n ". " curbatch;
6083d2cc4feSPaul E. McKenney		curbatch = "";
6093d2cc4feSPaul E. McKenney		oldbatch = $1;
6103d2cc4feSPaul E. McKenney	}
6113d2cc4feSPaul E. McKenney	curbatch = curbatch " " $2;
6123d2cc4feSPaul E. McKenney}
6133d2cc4feSPaul E. McKenney
6143d2cc4feSPaul E. McKenneyEND {
6153d2cc4feSPaul E. McKenney	print ++n ". " curbatch;
6163d2cc4feSPaul E. McKenney}' > $T/scenarios
6173d2cc4feSPaul E. McKenney
618a7582815SPaul E. McKenneyif test "$dryrun" = script
619a7582815SPaul E. McKenneythen
620a7582815SPaul E. McKenney	cat $T/script
621a7582815SPaul E. McKenney	exit 0
622a7582815SPaul E. McKenneyelif test "$dryrun" = sched
623a7582815SPaul E. McKenneythen
62478ad0693SPaul E. McKenney	# Extract the test run schedule from the script.
625eeb4dd9eSTiezhu Yang	grep -E 'Start batch|Starting build\.' $T/script | grep -v ">>" |
626a7582815SPaul E. McKenney		sed -e 's/:.*$//' -e 's/^echo //'
627eca0501aSPaul E. McKenney	nbuilds="`grep 'Starting build\.' $T/script |
628eca0501aSPaul E. McKenney		  grep -v ">>" | sed -e 's/:.*$//' -e 's/^echo //' |
629eca0501aSPaul E. McKenney		  awk '{ print $1 }' | grep -v '\.' | wc -l`"
630eca0501aSPaul E. McKenney	echo Total number of builds: $nbuilds
6311f947be7SPaul E. McKenney	nbatches="`grep 'Start batch' $T/script | grep -v ">>" | wc -l`"
6321f947be7SPaul E. McKenney	echo Total number of batches: $nbatches
633a7582815SPaul E. McKenney	exit 0
634755cf0afSPaul E. McKenneyelif test "$dryrun" = batches
635755cf0afSPaul E. McKenneythen
636d6100d76SPaul E. McKenney	cat $T/batches
637d6100d76SPaul E. McKenney	exit 0
6383d2cc4feSPaul E. McKenneyelif test "$dryrun" = scenarios
6393d2cc4feSPaul E. McKenneythen
6403d2cc4feSPaul E. McKenney	cat $T/scenarios
6413d2cc4feSPaul E. McKenney	exit 0
642a7582815SPaul E. McKenneyelse
643d6100d76SPaul E. McKenney	# Not a dryrun.  Record the batches and the number of CPUs, then run the script.
6440beb3948SPaul E. McKenney	bash $T/script
6450bcca183SPaul E. McKenney	ret=$?
646d6100d76SPaul E. McKenney	cp $T/batches $resdir/$ds/batches
6473d2cc4feSPaul E. McKenney	cp $T/scenarios $resdir/$ds/scenarios
648d6100d76SPaul E. McKenney	echo '#' cpus=$cpus >> $resdir/$ds/batches
6490bcca183SPaul E. McKenney	exit $ret
650a7582815SPaul E. McKenneyfi
65143e38ab3SPaul E. McKenney
652782ab4cdSPaul E. McKenney# 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
653cd6cb7c8SPaul E. McKenney# Function-graph tracing: ftrace=function_graph ftrace_graph_filter=sched_setaffinity,migration_cpu_stop
654cd6cb7c8SPaul E. McKenney# Also --kconfig "CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y"
6559ccba350SPaul E. McKenney# Control buffer size: --bootargs trace_buf_size=3k
6569ccba350SPaul E. McKenney# Get trace-buffer dumps on all oopses: --bootargs ftrace_dump_on_oops
6579ccba350SPaul E. McKenney# Ditto, but dump only the oopsing CPU: --bootargs ftrace_dump_on_oops=orig_cpu
65857ada235SOlaf Hering# Heavy-handed way to also dump on warnings: --bootargs panic_on_warn=1
659