11a5e31fbSPranith Kumar#!/bin/bash
2fef141f6SPaul E. McKenney# SPDX-License-Identifier: GPL-2.0+
3c87b9c60SPaul E. McKenney#
4c87b9c60SPaul E. McKenney# Check the console output from an rcutorture run for oopses.
5c87b9c60SPaul E. McKenney# The "file" is a pathname on the local system, and "title" is
6c87b9c60SPaul E. McKenney# a text string for error-message purposes.
7c87b9c60SPaul E. McKenney#
83327d924SPranith Kumar# Usage: parse-console.sh file title
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
14d600e06bSPaul E. McKenneyT=${TMPDIR-/tmp}/parse-console.sh.$$
15c87b9c60SPaul E. McKenneyfile="$1"
16c87b9c60SPaul E. McKenneytitle="$2"
17c87b9c60SPaul E. McKenney
18d600e06bSPaul E. McKenneytrap 'rm -f $T.seq $T.diags' 0
19d600e06bSPaul E. McKenney
206d40cc0cSPaul E. McKenney. functions.sh
216d40cc0cSPaul E. McKenney
22d600e06bSPaul E. McKenney# Check for presence and readability of console output file
23d600e06bSPaul E. McKenneyif test -f "$file" -a -r "$file"
24d600e06bSPaul E. McKenneythen
25d600e06bSPaul E. McKenney	:
26d600e06bSPaul E. McKenneyelse
27d600e06bSPaul E. McKenney	echo $title unreadable console output file: $file
28d600e06bSPaul E. McKenney	exit 1
29d600e06bSPaul E. McKenneyfi
30bc51896dSPaul E. McKenneyif grep -Pq '\x00' < $file
31bc51896dSPaul E. McKenneythen
32bc51896dSPaul E. McKenney	print_warning Console output contains nul bytes, old qemu still running?
33bc51896dSPaul E. McKenneyfi
34d600e06bSPaul E. McKenneycat /dev/null > $file.diags
35d600e06bSPaul E. McKenney
36d600e06bSPaul E. McKenney# Check for proper termination, except that rcuperf runs don't indicate this.
37d600e06bSPaul E. McKenneyif test "$TORTURE_SUITE" != rcuperf
38c87b9c60SPaul E. McKenneythen
39d600e06bSPaul E. McKenney	# check for abject failure
40d600e06bSPaul E. McKenney
41d600e06bSPaul E. McKenney	if grep -q FAILURE $file || grep -q -e '-torture.*!!!' $file
42d600e06bSPaul E. McKenney	then
43d600e06bSPaul E. McKenney		nerrs=`grep --binary-files=text '!!!' $file |
44d600e06bSPaul E. McKenney		tail -1 |
45d600e06bSPaul E. McKenney		awk '
46d600e06bSPaul E. McKenney		{
4759359e4fSPaul E. McKenney			normalexit = 1;
4859359e4fSPaul E. McKenney			for (i=NF-8;i<=NF;i++) {
4959359e4fSPaul E. McKenney				if (i <= 0 || i !~ /^[0-9]*$/) {
5059359e4fSPaul E. McKenney					bangstring = $0;
5159359e4fSPaul E. McKenney					gsub(/^\[[^]]*] /, "", bangstring);
5259359e4fSPaul E. McKenney					print bangstring;
5359359e4fSPaul E. McKenney					normalexit = 0;
5459359e4fSPaul E. McKenney					exit 0;
5559359e4fSPaul E. McKenney				}
56d600e06bSPaul E. McKenney				sum+=$i;
57d600e06bSPaul E. McKenney			}
5859359e4fSPaul E. McKenney		}
5959359e4fSPaul E. McKenney		END {
6059359e4fSPaul E. McKenney			if (normalexit)
6159359e4fSPaul E. McKenney				print sum " instances"
6259359e4fSPaul E. McKenney		}'`
6359359e4fSPaul E. McKenney		print_bug $title FAILURE, $nerrs
64d600e06bSPaul E. McKenney		exit
65d600e06bSPaul E. McKenney	fi
66d600e06bSPaul E. McKenney
67d600e06bSPaul E. McKenney	grep --binary-files=text 'torture:.*ver:' $file |
68d600e06bSPaul E. McKenney	egrep --binary-files=text -v '\(null\)|rtc: 000000000* ' |
69d600e06bSPaul E. McKenney	sed -e 's/^(initramfs)[^]]*] //' -e 's/^\[[^]]*] //' |
70d600e06bSPaul E. McKenney	awk '
71d600e06bSPaul E. McKenney	BEGIN	{
72d600e06bSPaul E. McKenney		ver = 0;
73d600e06bSPaul E. McKenney		badseq = 0;
74d600e06bSPaul E. McKenney		}
75d600e06bSPaul E. McKenney
76d600e06bSPaul E. McKenney		{
77d600e06bSPaul E. McKenney		if (!badseq && ($5 + 0 != $5 || $5 <= ver)) {
78d600e06bSPaul E. McKenney			badseqno1 = ver;
79d600e06bSPaul E. McKenney			badseqno2 = $5;
80d600e06bSPaul E. McKenney			badseqnr = NR;
81d600e06bSPaul E. McKenney			badseq = 1;
82d600e06bSPaul E. McKenney		}
83d600e06bSPaul E. McKenney		ver = $5
84d600e06bSPaul E. McKenney		}
85d600e06bSPaul E. McKenney
86d600e06bSPaul E. McKenney	END	{
87d600e06bSPaul E. McKenney		if (badseq) {
88d600e06bSPaul E. McKenney			if (badseqno1 == badseqno2 && badseqno2 == ver)
89d600e06bSPaul E. McKenney				print "GP HANG at " ver " torture stat " badseqnr;
90d600e06bSPaul E. McKenney			else
91d600e06bSPaul E. McKenney				print "BAD SEQ " badseqno1 ":" badseqno2 " last:" ver " version " badseqnr;
92d600e06bSPaul E. McKenney		}
93d600e06bSPaul E. McKenney		}' > $T.seq
94d600e06bSPaul E. McKenney
95d600e06bSPaul E. McKenney	if grep -q SUCCESS $file
96d600e06bSPaul E. McKenney	then
97d600e06bSPaul E. McKenney		if test -s $T.seq
98d600e06bSPaul E. McKenney		then
99d600e06bSPaul E. McKenney			print_warning $title `cat $T.seq`
100d600e06bSPaul E. McKenney			echo "   " $file
101d600e06bSPaul E. McKenney			exit 2
102d600e06bSPaul E. McKenney		fi
103d600e06bSPaul E. McKenney	else
104d600e06bSPaul E. McKenney		if grep -q "_HOTPLUG:" $file
105d600e06bSPaul E. McKenney		then
106d600e06bSPaul E. McKenney			print_warning HOTPLUG FAILURES $title `cat $T.seq`
107d600e06bSPaul E. McKenney			echo "   " $file
108d600e06bSPaul E. McKenney			exit 3
109d600e06bSPaul E. McKenney		fi
110d600e06bSPaul E. McKenney		echo $title no success message, `grep --binary-files=text 'ver:' $file | wc -l` successful version messages
111d600e06bSPaul E. McKenney		if test -s $T.seq
112d600e06bSPaul E. McKenney		then
113d600e06bSPaul E. McKenney			print_warning $title `cat $T.seq`
114d600e06bSPaul E. McKenney		fi
115d600e06bSPaul E. McKenney		exit 2
116d600e06bSPaul E. McKenney	fi
117d600e06bSPaul E. McKenneyfi | tee -a $file.diags
118d600e06bSPaul E. McKenney
119d600e06bSPaul E. McKenneyegrep '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 |
120d600e06bSPaul E. McKenneygrep -v 'ODEBUG: ' |
1218997e631SPaul E. McKenneygrep -v 'This means that this is a DEBUG kernel and it is' |
122d600e06bSPaul E. McKenneygrep -v 'Warning: unable to open an initial console' > $T.diags
123d600e06bSPaul E. McKenneyif test -s $T.diags
124d600e06bSPaul E. McKenneythen
125d600e06bSPaul E. McKenney	print_warning "Assertion failure in $file $title"
126d600e06bSPaul E. McKenney	# cat $T.diags
1275708c647SPaul E. McKenney	summary=""
128d600e06bSPaul E. McKenney	n_badness=`grep -c Badness $file`
1295708c647SPaul E. McKenney	if test "$n_badness" -ne 0
1305708c647SPaul E. McKenney	then
1315708c647SPaul E. McKenney		summary="$summary  Badness: $n_badness"
1325708c647SPaul E. McKenney	fi
133d600e06bSPaul E. McKenney	n_warn=`grep -v 'Warning: unable to open an initial console' $file | egrep -c 'WARNING:|Warn'`
1345708c647SPaul E. McKenney	if test "$n_warn" -ne 0
1355708c647SPaul E. McKenney	then
1365708c647SPaul E. McKenney		summary="$summary  Warnings: $n_warn"
1375708c647SPaul E. McKenney	fi
138d600e06bSPaul E. McKenney	n_bugs=`egrep -c 'BUG|Oops:' $file`
1395708c647SPaul E. McKenney	if test "$n_bugs" -ne 0
1405708c647SPaul E. McKenney	then
1415708c647SPaul E. McKenney		summary="$summary  Bugs: $n_bugs"
1425708c647SPaul E. McKenney	fi
143d600e06bSPaul E. McKenney	n_calltrace=`grep -c 'Call Trace:' $file`
1445708c647SPaul E. McKenney	if test "$n_calltrace" -ne 0
1455708c647SPaul E. McKenney	then
1465708c647SPaul E. McKenney		summary="$summary  Call Traces: $n_calltrace"
1475708c647SPaul E. McKenney	fi
148d600e06bSPaul E. McKenney	n_lockdep=`grep -c =========== $file`
1495708c647SPaul E. McKenney	if test "$n_badness" -ne 0
1505708c647SPaul E. McKenney	then
1515708c647SPaul E. McKenney		summary="$summary  lockdep: $n_badness"
1525708c647SPaul E. McKenney	fi
153d600e06bSPaul E. McKenney	n_stalls=`egrep -c 'detected stalls on CPUs/tasks:|self-detected stall on CPU|Stall ended before state dump start|\?\?\? Writer stall state' $file`
1545708c647SPaul E. McKenney	if test "$n_stalls" -ne 0
1555708c647SPaul E. McKenney	then
1565708c647SPaul E. McKenney		summary="$summary  Stalls: $n_stalls"
1575708c647SPaul E. McKenney	fi
158d600e06bSPaul E. McKenney	n_starves=`grep -c 'rcu_.*kthread starved for' $file`
159682ed706SPaul E. McKenney	if test "$n_starves" -ne 0
160682ed706SPaul E. McKenney	then
161682ed706SPaul E. McKenney		summary="$summary  Starves: $n_starves"
162682ed706SPaul E. McKenney	fi
1635708c647SPaul E. McKenney	print_warning Summary: $summary
164d600e06bSPaul E. McKenney	cat $T.diags >> $file.diags
165d600e06bSPaul E. McKenneyfi
166b4c1906fSPaul E. McKenneyfor i in $file.*.diags
167b4c1906fSPaul E. McKenneydo
168b4c1906fSPaul E. McKenney	if test -f "$i"
169b4c1906fSPaul E. McKenney	then
170b4c1906fSPaul E. McKenney		cat $i >> $file.diags
171b4c1906fSPaul E. McKenney	fi
172b4c1906fSPaul E. McKenneydone
173d600e06bSPaul E. McKenneyif ! test -s $file.diags
174d600e06bSPaul E. McKenneythen
175d600e06bSPaul E. McKenney	rm -f $file.diags
176c87b9c60SPaul E. McKenneyfi
177