Commit 50527f7c authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

rcutorture: Add --bootargs parameter to kvm-again.sh



The kvm-again.sh script can be used to repeat short boot-time tests,
but the kernel boot arguments cannot be changed.  This means that every
change in kernel boot arguments currently necessitates a kernel build,
which greatly increases the duration of kernel-boot testing.

This commit therefore adds a --bootargs parameter to kvm-again.sh,
which allows a given kernel to be repeatedly booted, but overriding
old and adding new kernel boot parameters.  This allows an old kernel
to be booted with new kernel boot parameters, avoiding the overhead of
rebuilding the kernel under test.

Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
parent 9abf2313
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -51,6 +51,7 @@ RCUTORTURE="`pwd`/tools/testing/selftests/rcutorture"; export RCUTORTURE
PATH=${RCUTORTURE}/bin:$PATH; export PATH
PATH=${RCUTORTURE}/bin:$PATH; export PATH
. functions.sh
. functions.sh


bootargs=
dryrun=
dryrun=
dur=
dur=
default_link="cp -R"
default_link="cp -R"
@@ -61,6 +62,7 @@ starttime="`get_starttime`"


usage () {
usage () {
	echo "Usage: $scriptname $oldrun [ arguments ]:"
	echo "Usage: $scriptname $oldrun [ arguments ]:"
	echo "       --bootargs kernel-boot-arguments"
	echo "       --dryrun"
	echo "       --dryrun"
	echo "       --duration minutes | <seconds>s | <hours>h | <days>d"
	echo "       --duration minutes | <seconds>s | <hours>h | <days>d"
	echo "       --link hard|soft|copy"
	echo "       --link hard|soft|copy"
@@ -72,6 +74,11 @@ usage () {
while test $# -gt 0
while test $# -gt 0
do
do
	case "$1" in
	case "$1" in
	--bootargs|--bootarg)
		checkarg --bootargs "(list of kernel boot arguments)" "$#" "$2" '.*' '^--'
		bootargs="$bootargs $2"
		shift
		;;
	--dryrun)
	--dryrun)
		dryrun=1
		dryrun=1
		;;
		;;
@@ -156,7 +163,7 @@ do
	qemu_cmd_dir="`dirname "$i"`"
	qemu_cmd_dir="`dirname "$i"`"
	kernel_dir="`echo $qemu_cmd_dir | sed -e 's/\.[0-9]\+$//'`"
	kernel_dir="`echo $qemu_cmd_dir | sed -e 's/\.[0-9]\+$//'`"
	jitter_dir="`dirname "$kernel_dir"`"
	jitter_dir="`dirname "$kernel_dir"`"
	kvm-transform.sh "$kernel_dir/bzImage" "$qemu_cmd_dir/console.log" "$jitter_dir" $dur < $T/qemu-cmd > $i
	kvm-transform.sh "$kernel_dir/bzImage" "$qemu_cmd_dir/console.log" "$jitter_dir" $dur "$bootargs" < $T/qemu-cmd > $i
	if test -n "$arg_remote"
	if test -n "$arg_remote"
	then
	then
		echo "# TORTURE_KCONFIG_GDB_ARG=''" >> $i
		echo "# TORTURE_KCONFIG_GDB_ARG=''" >> $i
+57 −11
Original line number Original line Diff line number Diff line
@@ -3,10 +3,14 @@
#
#
# Transform a qemu-cmd file to allow reuse.
# Transform a qemu-cmd file to allow reuse.
#
#
# Usage: kvm-transform.sh bzImage console.log jitter_dir [ seconds ] < qemu-cmd-in > qemu-cmd-out
# Usage: kvm-transform.sh bzImage console.log jitter_dir seconds [ bootargs ] < qemu-cmd-in > qemu-cmd-out
#
#
#	bzImage: Kernel and initrd from the same prior kvm.sh run.
#	bzImage: Kernel and initrd from the same prior kvm.sh run.
#	console.log: File into which to place console output.
#	console.log: File into which to place console output.
#	jitter_dir: Jitter directory for TORTURE_JITTER_START and
#		TORTURE_JITTER_STOP environment variables.
#	seconds: Run duaration for *.shutdown_secs module parameter.
#	bootargs: New kernel boot parameters.  Beware of Robert Tables.
#
#
# The original qemu-cmd file is provided on standard input.
# The original qemu-cmd file is provided on standard input.
# The transformed qemu-cmd file is on standard output.
# The transformed qemu-cmd file is on standard output.
@@ -17,6 +21,9 @@
#
#
# Authors: Paul E. McKenney <paulmck@kernel.org>
# Authors: Paul E. McKenney <paulmck@kernel.org>


T=`mktemp -d /tmp/kvm-transform.sh.XXXXXXXXXX`
trap 'rm -rf $T' 0 2

image="$1"
image="$1"
if test -z "$image"
if test -z "$image"
then
then
@@ -41,9 +48,17 @@ then
	echo "Invalid duration, should be numeric in seconds: '$seconds'"
	echo "Invalid duration, should be numeric in seconds: '$seconds'"
	exit 1
	exit 1
fi
fi
bootargs="$5"

# Build awk program.
echo "BEGIN {" > $T/bootarg.awk
echo $bootargs | tr -s ' ' '\012' |
	awk -v dq='"' '/./ { print "\tbootarg[" NR "] = " dq $1 dq ";" }' >> $T/bootarg.awk
echo $bootargs | tr -s ' ' '\012' | sed -e 's/=.*$//' |
	awk -v dq='"' '/./ { print "\tbootpar[" NR "] = " dq $1 dq ";" }' >> $T/bootarg.awk
cat >> $T/bootarg.awk << '___EOF___'
}


awk -v image="$image" -v consolelog="$consolelog" -v jitter_dir="$jitter_dir" \
    -v seconds="$seconds" '
/^# seconds=/ {
/^# seconds=/ {
	if (seconds == "")
	if (seconds == "")
		print $0;
		print $0;
@@ -70,13 +85,7 @@ awk -v image="$image" -v consolelog="$consolelog" -v jitter_dir="$jitter_dir" \
{
{
	line = "";
	line = "";
	for (i = 1; i <= NF; i++) {
	for (i = 1; i <= NF; i++) {
		if ("" seconds != "" && $i ~ /\.shutdown_secs=[0-9]*$/) {
		if (line == "") {
			sub(/[0-9]*$/, seconds, $i);
			if (line == "")
				line = $i;
			else
				line = line " " $i;
		} else if (line == "") {
			line = $i;
			line = $i;
		} else {
		} else {
			line = line " " $i;
			line = line " " $i;
@@ -87,7 +96,44 @@ awk -v image="$image" -v consolelog="$consolelog" -v jitter_dir="$jitter_dir" \
		} else if ($i == "-kernel") {
		} else if ($i == "-kernel") {
			i++;
			i++;
			line = line " " image;
			line = line " " image;
		} else if ($i == "-append") {
			for (i++; i <= NF; i++) {
				arg = $i;
				lq = "";
				rq = "";
				if ("" seconds != "" && $i ~ /\.shutdown_secs=[0-9]*$/)
					sub(/[0-9]*$/, seconds, arg);
				if (arg ~ /^"/) {
					lq = substr(arg, 1, 1);
					arg  = substr(arg, 2);
				}
				if (arg ~ /"$/) {
					rq = substr(arg, length($i), 1);
					arg = substr(arg, 1, length($i) - 1);
				}
				par = arg;
				gsub(/=.*$/, "", par);
				j = 1;
				while (bootpar[j] != "") {
					if (bootpar[j] == par) {
						arg = "";
						break;
					}
					j++;
				}
				if (line == "")
					line = lq arg;
				else
					line = line " " lq arg;
			}
			for (j in bootarg)
				line = line " " bootarg[j];
			line = line rq;
		}
		}
	}
	}
	print line;
	print line;
}'
}
___EOF___

awk -v image="$image" -v consolelog="$consolelog" -v jitter_dir="$jitter_dir" \
    -v seconds="$seconds" -f $T/bootarg.awk