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