1#!/bin/bash
2#
3# Run a series of 14 tests under KVM.  These are not particularly
4# well-selected or well-tuned, but are the current set.  Run from the
5# top level of the source tree.
6#
7# Edit the definitions below to set the locations of the various directories,
8# as well as the test duration.
9#
10# Usage: sh kvm.sh [ options ]
11#
12# This program is free software; you can redistribute it and/or modify
13# it under the terms of the GNU General Public License as published by
14# the Free Software Foundation; either version 2 of the License, or
15# (at your option) any later version.
16#
17# This program is distributed in the hope that it will be useful,
18# but WITHOUT ANY WARRANTY; without even the implied warranty of
19# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20# GNU General Public License for more details.
21#
22# You should have received a copy of the GNU General Public License
23# along with this program; if not, write to the Free Software
24# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25#
26# Copyright (C) IBM Corporation, 2011
27#
28# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
29
30scriptname=$0
31args="$*"
32
33dur=30
34KVM=`pwd`/tools/testing/selftests/rcutorture; export KVM
35builddir=${KVM}/b1
36resdir=""
37configs=""
38ds=`date +%Y.%m.%d-%H:%M:%S`
39kversion=""
40
41usage () {
42	echo "Usage: $scriptname optional arguments:"
43	echo "       --builddir absolute-pathname"
44	echo "       --configs \"config-file list\""
45	echo "       --datestamp string"
46	echo "       --duration minutes"
47	echo "       --kversion vN.NN"
48	echo "       --qemu-cmd qemu-system-..."
49	echo "       --results absolute-pathname"
50	echo "       --relbuilddir relative-pathname"
51	exit 1
52}
53
54# checkarg --argname argtype $# arg mustmatch cannotmatch
55checkarg () {
56	if test $3 -le 1
57	then
58		echo $1 needs argument $2 matching \"$5\"
59		usage
60	fi
61	if echo "$4" | grep -q -e "$5"
62	then
63		:
64	else
65		echo $1 $2 \"$4\" must match \"$5\"
66		usage
67	fi
68	if echo "$4" | grep -q -e "$6"
69	then
70		echo $1 $2 \"$4\" must not match \"$6\"
71		usage
72	fi
73}
74
75while test $# -gt 0
76do
77	case "$1" in
78	--builddir)
79		checkarg --builddir "(absolute pathname)" "$#" "$2" '^/' error
80		builddir=$2
81		gotbuilddir=1
82		shift
83		;;
84	--configs)
85		checkarg --configs "(list of config files)" "$#" "$2" '^[^/]*$' '^--'
86		configs="$2"
87		shift
88		;;
89	--datestamp)
90		checkarg --datestamp "(relative pathname)" "$#" "$2" '^[^/]*$' '^--'
91		ds=$2
92		shift
93		;;
94	--duration)
95		checkarg --duration "(minutes)" $# "$2" '^[0-9]*$' error
96		dur=$2
97		shift
98		;;
99	--kversion)
100		checkarg --kversion "(kernel version)" $# "$2" '^v[0-9.]*$' error
101		kversion=$2
102		shift
103		;;
104	--qemu-cmd)
105		checkarg --qemu-cmd "(qemu-system-...)" $# "$2" 'qemu-system-' '^--'
106		RCU_QEMU_CMD="$2"; export RCU_QEMU_CMD
107		shift
108		;;
109	--relbuilddir)
110		checkarg --relbuilddir "(relative pathname)" "$#" "$2" '^[^/]*$' '^--'
111		relbuilddir=$2
112		gotrelbuilddir=1
113		builddir=${KVM}/${relbuilddir}
114		shift
115		;;
116	--results)
117		checkarg --results "(absolute pathname)" "$#" "$2" '^/' error
118		resdir=$2
119		shift
120		;;
121	*)
122		echo Unknown argument $1
123		usage
124		;;
125	esac
126	shift
127done
128
129PATH=${KVM}/bin:$PATH; export PATH
130CONFIGFRAG=${KVM}/configs; export CONFIGFRAG
131KVPATH=${CONFIGFRAG}/$kversion; export KVPATH
132
133if test -z "$configs"
134then
135	configs="`cat $CONFIGFRAG/$kversion/CFLIST`"
136fi
137
138if test -z "$resdir"
139then
140	resdir=$KVM/res
141	if ! test -e $resdir
142	then
143		mkdir $resdir || :
144	fi
145else
146	if ! test -e $resdir
147	then
148		mkdir -p "$resdir" || :
149	fi
150fi
151mkdir $resdir/$ds
152touch $resdir/$ds/log
153echo $scriptname $args >> $resdir/$ds/log
154
155pwd > $resdir/$ds/testid.txt
156if test -d .git
157then
158	git status >> $resdir/$ds/testid.txt
159	git rev-parse HEAD >> $resdir/$ds/testid.txt
160fi
161builddir=$KVM/b1
162if ! test -e $builddir
163then
164	mkdir $builddir || :
165fi
166
167for CF in $configs
168do
169	rd=$resdir/$ds/$CF
170	mkdir $rd || :
171	echo Results directory: $rd
172	kvm-test-1-rcu.sh $CONFIGFRAG/$kversion/$CF $builddir $rd $dur "-nographic" "rcutorture.test_no_idle_hz=1 rcutorture.verbose=1"
173done
174# Tracing: trace_event=rcu:rcu_nocb_grace_period,rcu:rcu_grace_period,rcu:rcu_grace_period_init,rcu:rcu_quiescent_state_report,rcu:rcu_fqs,rcu:rcu_callback,rcu:rcu_torture_read,rcu:rcu_invoke_callback,rcu:rcu_fqs,rcu:rcu_dyntick,rcu:rcu_unlock_preempted_task
175