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		{
47d600e06bSPaul E. McKenney			for (i=NF-8;i<=NF;i++)
48d600e06bSPaul E. McKenney				sum+=$i;
49d600e06bSPaul E. McKenney		}
50d600e06bSPaul E. McKenney		END { print sum }'`
51d600e06bSPaul E. McKenney		print_bug $title FAILURE, $nerrs instances
52d600e06bSPaul E. McKenney		exit
53d600e06bSPaul E. McKenney	fi
54d600e06bSPaul E. McKenney
55d600e06bSPaul E. McKenney	grep --binary-files=text 'torture:.*ver:' $file |
56d600e06bSPaul E. McKenney	egrep --binary-files=text -v '\(null\)|rtc: 000000000* ' |
57d600e06bSPaul E. McKenney	sed -e 's/^(initramfs)[^]]*] //' -e 's/^\[[^]]*] //' |
58d600e06bSPaul E. McKenney	awk '
59d600e06bSPaul E. McKenney	BEGIN	{
60d600e06bSPaul E. McKenney		ver = 0;
61d600e06bSPaul E. McKenney		badseq = 0;
62d600e06bSPaul E. McKenney		}
63d600e06bSPaul E. McKenney
64d600e06bSPaul E. McKenney		{
65d600e06bSPaul E. McKenney		if (!badseq && ($5 + 0 != $5 || $5 <= ver)) {
66d600e06bSPaul E. McKenney			badseqno1 = ver;
67d600e06bSPaul E. McKenney			badseqno2 = $5;
68d600e06bSPaul E. McKenney			badseqnr = NR;
69d600e06bSPaul E. McKenney			badseq = 1;
70d600e06bSPaul E. McKenney		}
71d600e06bSPaul E. McKenney		ver = $5
72d600e06bSPaul E. McKenney		}
73d600e06bSPaul E. McKenney
74d600e06bSPaul E. McKenney	END	{
75d600e06bSPaul E. McKenney		if (badseq) {
76d600e06bSPaul E. McKenney			if (badseqno1 == badseqno2 && badseqno2 == ver)
77d600e06bSPaul E. McKenney				print "GP HANG at " ver " torture stat " badseqnr;
78d600e06bSPaul E. McKenney			else
79d600e06bSPaul E. McKenney				print "BAD SEQ " badseqno1 ":" badseqno2 " last:" ver " version " badseqnr;
80d600e06bSPaul E. McKenney		}
81d600e06bSPaul E. McKenney		}' > $T.seq
82d600e06bSPaul E. McKenney
83d600e06bSPaul E. McKenney	if grep -q SUCCESS $file
84d600e06bSPaul E. McKenney	then
85d600e06bSPaul E. McKenney		if test -s $T.seq
86d600e06bSPaul E. McKenney		then
87d600e06bSPaul E. McKenney			print_warning $title `cat $T.seq`
88d600e06bSPaul E. McKenney			echo "   " $file
89d600e06bSPaul E. McKenney			exit 2
90d600e06bSPaul E. McKenney		fi
91d600e06bSPaul E. McKenney	else
92d600e06bSPaul E. McKenney		if grep -q "_HOTPLUG:" $file
93d600e06bSPaul E. McKenney		then
94d600e06bSPaul E. McKenney			print_warning HOTPLUG FAILURES $title `cat $T.seq`
95d600e06bSPaul E. McKenney			echo "   " $file
96d600e06bSPaul E. McKenney			exit 3
97d600e06bSPaul E. McKenney		fi
98d600e06bSPaul E. McKenney		echo $title no success message, `grep --binary-files=text 'ver:' $file | wc -l` successful version messages
99d600e06bSPaul E. McKenney		if test -s $T.seq
100d600e06bSPaul E. McKenney		then
101d600e06bSPaul E. McKenney			print_warning $title `cat $T.seq`
102d600e06bSPaul E. McKenney		fi
103d600e06bSPaul E. McKenney		exit 2
104d600e06bSPaul E. McKenney	fi
105d600e06bSPaul E. McKenneyfi | tee -a $file.diags
106d600e06bSPaul E. McKenney
107d600e06bSPaul 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 |
108d600e06bSPaul E. McKenneygrep -v 'ODEBUG: ' |
1098997e631SPaul E. McKenneygrep -v 'This means that this is a DEBUG kernel and it is' |
110d600e06bSPaul E. McKenneygrep -v 'Warning: unable to open an initial console' > $T.diags
111d600e06bSPaul E. McKenneyif test -s $T.diags
112d600e06bSPaul E. McKenneythen
113d600e06bSPaul E. McKenney	print_warning "Assertion failure in $file $title"
114d600e06bSPaul E. McKenney	# cat $T.diags
1155708c647SPaul E. McKenney	summary=""
116d600e06bSPaul E. McKenney	n_badness=`grep -c Badness $file`
1175708c647SPaul E. McKenney	if test "$n_badness" -ne 0
1185708c647SPaul E. McKenney	then
1195708c647SPaul E. McKenney		summary="$summary  Badness: $n_badness"
1205708c647SPaul E. McKenney	fi
121d600e06bSPaul E. McKenney	n_warn=`grep -v 'Warning: unable to open an initial console' $file | egrep -c 'WARNING:|Warn'`
1225708c647SPaul E. McKenney	if test "$n_warn" -ne 0
1235708c647SPaul E. McKenney	then
1245708c647SPaul E. McKenney		summary="$summary  Warnings: $n_warn"
1255708c647SPaul E. McKenney	fi
126d600e06bSPaul E. McKenney	n_bugs=`egrep -c 'BUG|Oops:' $file`
1275708c647SPaul E. McKenney	if test "$n_bugs" -ne 0
1285708c647SPaul E. McKenney	then
1295708c647SPaul E. McKenney		summary="$summary  Bugs: $n_bugs"
1305708c647SPaul E. McKenney	fi
131d600e06bSPaul E. McKenney	n_calltrace=`grep -c 'Call Trace:' $file`
1325708c647SPaul E. McKenney	if test "$n_calltrace" -ne 0
1335708c647SPaul E. McKenney	then
1345708c647SPaul E. McKenney		summary="$summary  Call Traces: $n_calltrace"
1355708c647SPaul E. McKenney	fi
136d600e06bSPaul E. McKenney	n_lockdep=`grep -c =========== $file`
1375708c647SPaul E. McKenney	if test "$n_badness" -ne 0
1385708c647SPaul E. McKenney	then
1395708c647SPaul E. McKenney		summary="$summary  lockdep: $n_badness"
1405708c647SPaul E. McKenney	fi
141d600e06bSPaul 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`
1425708c647SPaul E. McKenney	if test "$n_stalls" -ne 0
1435708c647SPaul E. McKenney	then
1445708c647SPaul E. McKenney		summary="$summary  Stalls: $n_stalls"
1455708c647SPaul E. McKenney	fi
146d600e06bSPaul E. McKenney	n_starves=`grep -c 'rcu_.*kthread starved for' $file`
147682ed706SPaul E. McKenney	if test "$n_starves" -ne 0
148682ed706SPaul E. McKenney	then
149682ed706SPaul E. McKenney		summary="$summary  Starves: $n_starves"
150682ed706SPaul E. McKenney	fi
1515708c647SPaul E. McKenney	print_warning Summary: $summary
152d600e06bSPaul E. McKenney	cat $T.diags >> $file.diags
153d600e06bSPaul E. McKenneyfi
154b4c1906fSPaul E. McKenneyfor i in $file.*.diags
155b4c1906fSPaul E. McKenneydo
156b4c1906fSPaul E. McKenney	if test -f "$i"
157b4c1906fSPaul E. McKenney	then
158b4c1906fSPaul E. McKenney		cat $i >> $file.diags
159b4c1906fSPaul E. McKenney	fi
160b4c1906fSPaul E. McKenneydone
161d600e06bSPaul E. McKenneyif ! test -s $file.diags
162d600e06bSPaul E. McKenneythen
163d600e06bSPaul E. McKenney	rm -f $file.diags
164c87b9c60SPaul E. McKenneyfi
165