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

torture: Kill qemu, not parent process



The current hang-check machinery in the rcutorture scripts uses "$!" of
a parenthesized bash statement to capture the pid.  Unfortunately, this
captures not qemu's pid, but rather that of its parent that implements
the parenthesized statement.  This commit therefore adjusts things so as
to capture qemu's actual pid, which then allows the script to actually
kill qemu in event of a kernel hang.

Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
parent 9eb5188a
Loading
Loading
Loading
Loading
+24 −6
Original line number Original line Diff line number Diff line
@@ -168,14 +168,25 @@ then
fi
fi
echo "NOTE: $QEMU either did not run or was interactive" > $resdir/console.log
echo "NOTE: $QEMU either did not run or was interactive" > $resdir/console.log
echo $QEMU $qemu_args -m 512 -kernel $resdir/bzImage -append \"$qemu_append $boot_args\" > $resdir/qemu-cmd
echo $QEMU $qemu_args -m 512 -kernel $resdir/bzImage -append \"$qemu_append $boot_args\" > $resdir/qemu-cmd
( $QEMU $qemu_args -m 512 -kernel $resdir/bzImage -append "$qemu_append $boot_args"; echo $? > $resdir/qemu-retval ) &
( $QEMU $qemu_args -m 512 -kernel $resdir/bzImage -append "$qemu_append $boot_args"& echo $! > $resdir/qemu_pid; wait `cat  $resdir/qemu_pid`; echo $? > $resdir/qemu-retval ) &
qemu_pid=$!
commandcompleted=0
commandcompleted=0
sleep 10 # Give qemu's pid a chance to reach the file
if test -s "$resdir/qemu_pid"
then
	qemu_pid=`cat "$resdir/qemu_pid"`
	echo Monitoring qemu job at pid $qemu_pid
	echo Monitoring qemu job at pid $qemu_pid
else
	qemu_pid=""
	echo Monitoring qemu job at yet-as-unknown pid
fi
while :
while :
do
do
	if test -z "$qemu_pid" -a -s "$resdir/qemu_pid"
	then
		qemu_pid=`cat "$resdir/qemu_pid"`
	fi
	kruntime=`awk 'BEGIN { print systime() - '"$kstarttime"' }' < /dev/null`
	kruntime=`awk 'BEGIN { print systime() - '"$kstarttime"' }' < /dev/null`
	if kill -0 $qemu_pid > /dev/null 2>&1
	if test -z "$qemu_pid" || kill -0 "$qemu_pid" > /dev/null 2>&1
	then
	then
		if test $kruntime -ge $seconds
		if test $kruntime -ge $seconds
		then
		then
@@ -195,12 +206,16 @@ do
				ps -fp $killpid >> $resdir/Warnings 2>&1
				ps -fp $killpid >> $resdir/Warnings 2>&1
			fi
			fi
		else
		else
			echo ' ---' `date`: Kernel done
			echo ' ---' `date`: "Kernel done"
		fi
		fi
		break
		break
	fi
	fi
done
done
if test $commandcompleted -eq 0
if test -z "$qemu_pid" -a -s "$resdir/qemu_pid"
then
	qemu_pid=`cat "$resdir/qemu_pid"`
fi
if test $commandcompleted -eq 0 -a -n "$qemu_pid"
then
then
	echo Grace period for qemu job at pid $qemu_pid
	echo Grace period for qemu job at pid $qemu_pid
	while :
	while :
@@ -220,6 +235,9 @@ then
		fi
		fi
		sleep 1
		sleep 1
	done
	done
elif test -z "$qemu_pid"
then
	echo Unknown PID, cannot kill qemu command
fi
fi


parse-torture.sh $resdir/console.log $title
parse-torture.sh $resdir/console.log $title