Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

torture: Fold parse-torture.sh into parse-console.sh



The rcutorture scripting scans the console output twice, once to look
for various sorts of hangs and again to find warnings and panics.
Unfortunately, only the output of the second scan gets written to the
console.log.diags file, which can cause hangs to be overlooked.
This commit therefore folds the parse-torture.sh script (which looks
for hangs) into the parse-console.sh script (which looks for warnings
and panics).  This allows both types of failure information to be
added to console.log.diags, while still reliably removing this file
when it proves to be empty.

This also fixes a long-standing bug where rcuperf log files would
unconditionally complain about a hang.

Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tested-by: default avatarNicholas Piggin <npiggin@gmail.com>
parent 95ce5f29
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -48,10 +48,6 @@ do
				cat $i/Make.oldconfig.err
			fi
			parse-build.sh $i/Make.out $configfile
			if test "$TORTURE_SUITE" != rcuperf
			then
				parse-torture.sh $i/console.log $configfile
			fi
			parse-console.sh $i/console.log $configfile
			if test -r $i/Warnings
			then
+0 −1
Original line number Diff line number Diff line
@@ -267,5 +267,4 @@ then
	echo Unknown PID, cannot kill qemu command
fi

parse-torture.sh $resdir/console.log $title
parse-console.sh $resdir/console.log $title
+102 −13
Original line number Diff line number Diff line
@@ -24,57 +24,146 @@
#
# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com>

T=${TMPDIR-/tmp}/parse-console.sh.$$
file="$1"
title="$2"

trap 'rm -f $T.seq $T.diags' 0

. functions.sh

# Check for presence and readability of console output file
if test -f "$file" -a -r "$file"
then
	:
else
	echo $title unreadable console output file: $file
	exit 1
fi
if grep -Pq '\x00' < $file
then
	print_warning Console output contains nul bytes, old qemu still running?
fi
egrep 'Badness|WARNING:|Warn|BUG|===========|Call Trace:|Oops:|detected stalls on CPUs/tasks:|self-detected stall on CPU|Stall ended before state dump start|\?\?\? Writer stall state|rcu_.*kthread starved for' < $file | grep -v 'ODEBUG: ' | grep -v 'Warning: unable to open an initial console' > $1.diags
if test -s $1.diags
cat /dev/null > $file.diags

# Check for proper termination, except that rcuperf runs don't indicate this.
if test "$TORTURE_SUITE" != rcuperf
then
	# check for abject failure

	if grep -q FAILURE $file || grep -q -e '-torture.*!!!' $file
	then
		nerrs=`grep --binary-files=text '!!!' $file |
		tail -1 |
		awk '
		{
			for (i=NF-8;i<=NF;i++)
				sum+=$i;
		}
		END { print sum }'`
		print_bug $title FAILURE, $nerrs instances
		exit
	fi

	grep --binary-files=text 'torture:.*ver:' $file |
	egrep --binary-files=text -v '\(null\)|rtc: 000000000* ' |
	sed -e 's/^(initramfs)[^]]*] //' -e 's/^\[[^]]*] //' |
	awk '
	BEGIN	{
		ver = 0;
		badseq = 0;
		}

		{
		if (!badseq && ($5 + 0 != $5 || $5 <= ver)) {
			badseqno1 = ver;
			badseqno2 = $5;
			badseqnr = NR;
			badseq = 1;
		}
		ver = $5
		}

	END	{
		if (badseq) {
			if (badseqno1 == badseqno2 && badseqno2 == ver)
				print "GP HANG at " ver " torture stat " badseqnr;
			else
				print "BAD SEQ " badseqno1 ":" badseqno2 " last:" ver " version " badseqnr;
		}
		}' > $T.seq

	if grep -q SUCCESS $file
	then
	print_warning Assertion failure in $file $title
	# cat $1.diags
		if test -s $T.seq
		then
			print_warning $title `cat $T.seq`
			echo "   " $file
			exit 2
		fi
	else
		if grep -q "_HOTPLUG:" $file
		then
			print_warning HOTPLUG FAILURES $title `cat $T.seq`
			echo "   " $file
			exit 3
		fi
		echo $title no success message, `grep --binary-files=text 'ver:' $file | wc -l` successful version messages
		if test -s $T.seq
		then
			print_warning $title `cat $T.seq`
		fi
		exit 2
	fi
fi | tee -a $file.diags

egrep 'Badness|WARNING:|Warn|BUG|===========|Call Trace:|Oops:|detected stalls on CPUs/tasks:|self-detected stall on CPU|Stall ended before state dump start|\?\?\? Writer stall state|rcu_.*kthread starved for' < $file |
grep -v 'ODEBUG: ' |
grep -v 'Warning: unable to open an initial console' > $T.diags
if test -s $T.diags
then
	print_warning "Assertion failure in $file $title"
	# cat $T.diags
	summary=""
	n_badness=`grep -c Badness $1`
	n_badness=`grep -c Badness $file`
	if test "$n_badness" -ne 0
	then
		summary="$summary  Badness: $n_badness"
	fi
	n_warn=`grep -v 'Warning: unable to open an initial console' $1 | egrep -c 'WARNING:|Warn'`
	n_warn=`grep -v 'Warning: unable to open an initial console' $file | egrep -c 'WARNING:|Warn'`
	if test "$n_warn" -ne 0
	then
		summary="$summary  Warnings: $n_warn"
	fi
	n_bugs=`egrep -c 'BUG|Oops:' $1`
	n_bugs=`egrep -c 'BUG|Oops:' $file`
	if test "$n_bugs" -ne 0
	then
		summary="$summary  Bugs: $n_bugs"
	fi
	n_calltrace=`grep -c 'Call Trace:' $1`
	n_calltrace=`grep -c 'Call Trace:' $file`
	if test "$n_calltrace" -ne 0
	then
		summary="$summary  Call Traces: $n_calltrace"
	fi
	n_lockdep=`grep -c =========== $1`
	n_lockdep=`grep -c =========== $file`
	if test "$n_badness" -ne 0
	then
		summary="$summary  lockdep: $n_badness"
	fi
	n_stalls=`egrep -c 'detected stalls on CPUs/tasks:|self-detected stall on CPU|Stall ended before state dump start|\?\?\? Writer stall state' $1`
	n_stalls=`egrep -c 'detected stalls on CPUs/tasks:|self-detected stall on CPU|Stall ended before state dump start|\?\?\? Writer stall state' $file`
	if test "$n_stalls" -ne 0
	then
		summary="$summary  Stalls: $n_stalls"
	fi
	n_starves=`grep -c 'rcu_.*kthread starved for' $1`
	n_starves=`grep -c 'rcu_.*kthread starved for' $file`
	if test "$n_starves" -ne 0
	then
		summary="$summary  Starves: $n_starves"
	fi
	print_warning Summary: $summary
else
	rm $1.diags
	cat $T.diags >> $file.diags
fi
if ! test -s $file.diags
then
	rm -f $file.diags
fi
+0 −105
Original line number Diff line number Diff line
#!/bin/bash
#
# Check the console output from a torture run for goodness.
# The "file" is a pathname on the local system, and "title" is
# a text string for error-message purposes.
#
# The file must contain torture output, but can be interspersed
# with other dmesg text, as in console-log output.
#
# Usage: parse-torture.sh file title
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, you can access it online at
# http://www.gnu.org/licenses/gpl-2.0.html.
#
# Copyright (C) IBM Corporation, 2011
#
# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com>

T=${TMPDIR-/tmp}/parse-torture.sh.$$
file="$1"
title="$2"

trap 'rm -f $T.seq' 0

. functions.sh

# check for presence of torture output file.

if test -f "$file" -a -r "$file"
then
	:
else
	echo $title unreadable torture output file: $file
	exit 1
fi

# check for abject failure

if grep -q FAILURE $file || grep -q -e '-torture.*!!!' $file
then
	nerrs=`grep --binary-files=text '!!!' $file | tail -1 | awk '{for (i=NF-8;i<=NF;i++) sum+=$i; } END {print sum}'`
	print_bug $title FAILURE, $nerrs instances
	echo "   " $url
	exit
fi

grep --binary-files=text 'torture:.*ver:' $file | egrep --binary-files=text -v '\(null\)|rtc: 000000000* ' | sed -e 's/^(initramfs)[^]]*] //' -e 's/^\[[^]]*] //' |
awk '
BEGIN	{
	ver = 0;
	badseq = 0;
	}

	{
	if (!badseq && ($5 + 0 != $5 || $5 <= ver)) {
		badseqno1 = ver;
		badseqno2 = $5;
		badseqnr = NR;
		badseq = 1;
	}
	ver = $5
	}

END	{
	if (badseq) {
		if (badseqno1 == badseqno2 && badseqno2 == ver)
			print "GP HANG at " ver " torture stat " badseqnr;
		else
			print "BAD SEQ " badseqno1 ":" badseqno2 " last:" ver " version " badseqnr;
	}
	}' > $T.seq

if grep -q SUCCESS $file
then
	if test -s $T.seq
	then
		print_warning $title $title `cat $T.seq`
		echo "   " $file
		exit 2
	fi
else
	if grep -q "_HOTPLUG:" $file
	then
		print_warning HOTPLUG FAILURES $title `cat $T.seq`
		echo "   " $file
		exit 3
	fi
	echo $title no success message, `grep --binary-files=text 'ver:' $file | wc -l` successful version messages
	if test -s $T.seq
	then
		print_warning $title `cat $T.seq`
	fi
	exit 2
fi