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
364e88ec4aSPaul E. McKenney# Check for proper termination, except for rcuscale and refscale.
374e88ec4aSPaul E. McKenneyif test "$TORTURE_SUITE" != rcuscale && test "$TORTURE_SUITE" != refscale
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 |
68*eeb4dd9eSTiezhu Yang	grep -E --binary-files=text -v '\(null\)|rtc: 000000000* ' |
69d600e06bSPaul E. McKenney	sed -e 's/^(initramfs)[^]]*] //' -e 's/^\[[^]]*] //' |
70687d4775SPaul E. McKenney	sed -e 's/^.*ver: //' |
71d600e06bSPaul E. McKenney	awk '
72d600e06bSPaul E. McKenney	BEGIN	{
73d600e06bSPaul E. McKenney		ver = 0;
74d600e06bSPaul E. McKenney		badseq = 0;
75d600e06bSPaul E. McKenney		}
76d600e06bSPaul E. McKenney
77d600e06bSPaul E. McKenney		{
78687d4775SPaul E. McKenney		if (!badseq && ($1 + 0 != $1 || $1 <= ver)) {
79d600e06bSPaul E. McKenney			badseqno1 = ver;
80687d4775SPaul E. McKenney			badseqno2 = $1;
81d600e06bSPaul E. McKenney			badseqnr = NR;
82d600e06bSPaul E. McKenney			badseq = 1;
83d600e06bSPaul E. McKenney		}
84687d4775SPaul E. McKenney		ver = $1
85d600e06bSPaul E. McKenney		}
86d600e06bSPaul E. McKenney
87d600e06bSPaul E. McKenney	END	{
88d600e06bSPaul E. McKenney		if (badseq) {
89d600e06bSPaul E. McKenney			if (badseqno1 == badseqno2 && badseqno2 == ver)
90d600e06bSPaul E. McKenney				print "GP HANG at " ver " torture stat " badseqnr;
91d600e06bSPaul E. McKenney			else
92d600e06bSPaul E. McKenney				print "BAD SEQ " badseqno1 ":" badseqno2 " last:" ver " version " badseqnr;
93d600e06bSPaul E. McKenney		}
94d600e06bSPaul E. McKenney		}' > $T.seq
95d600e06bSPaul E. McKenney
96d600e06bSPaul E. McKenney	if grep -q SUCCESS $file
97d600e06bSPaul E. McKenney	then
98d600e06bSPaul E. McKenney		if test -s $T.seq
99d600e06bSPaul E. McKenney		then
100d600e06bSPaul E. McKenney			print_warning $title `cat $T.seq`
101d600e06bSPaul E. McKenney			echo "   " $file
102d600e06bSPaul E. McKenney			exit 2
103d600e06bSPaul E. McKenney		fi
104d600e06bSPaul E. McKenney	else
105d600e06bSPaul E. McKenney		if grep -q "_HOTPLUG:" $file
106d600e06bSPaul E. McKenney		then
107d600e06bSPaul E. McKenney			print_warning HOTPLUG FAILURES $title `cat $T.seq`
108d600e06bSPaul E. McKenney			echo "   " $file
109d600e06bSPaul E. McKenney			exit 3
110d600e06bSPaul E. McKenney		fi
111d600e06bSPaul E. McKenney		echo $title no success message, `grep --binary-files=text 'ver:' $file | wc -l` successful version messages
112d600e06bSPaul E. McKenney		if test -s $T.seq
113d600e06bSPaul E. McKenney		then
114d600e06bSPaul E. McKenney			print_warning $title `cat $T.seq`
115d600e06bSPaul E. McKenney		fi
116d600e06bSPaul E. McKenney		exit 2
117d600e06bSPaul E. McKenney	fi
118d600e06bSPaul E. McKenneyfi | tee -a $file.diags
119d600e06bSPaul E. McKenney
120bc77a72cSPaul E. McKenneyconsole-badness.sh < $file > $T.diags
121d600e06bSPaul E. McKenneyif test -s $T.diags
122d600e06bSPaul E. McKenneythen
123d600e06bSPaul E. McKenney	print_warning "Assertion failure in $file $title"
124d600e06bSPaul E. McKenney	# cat $T.diags
1255708c647SPaul E. McKenney	summary=""
126d600e06bSPaul E. McKenney	n_badness=`grep -c Badness $file`
1275708c647SPaul E. McKenney	if test "$n_badness" -ne 0
1285708c647SPaul E. McKenney	then
1295708c647SPaul E. McKenney		summary="$summary  Badness: $n_badness"
1305708c647SPaul E. McKenney	fi
131*eeb4dd9eSTiezhu Yang	n_warn=`grep -v 'Warning: unable to open an initial console' $file | grep -v 'Warning: Failed to add ttynull console. No stdin, stdout, and stderr for the init process' | grep -E -c 'WARNING:|Warn'`
1325708c647SPaul E. McKenney	if test "$n_warn" -ne 0
1335708c647SPaul E. McKenney	then
1345708c647SPaul E. McKenney		summary="$summary  Warnings: $n_warn"
1355708c647SPaul E. McKenney	fi
136*eeb4dd9eSTiezhu Yang	n_bugs=`grep -E -c '\bBUG|Oops:' $file`
1375708c647SPaul E. McKenney	if test "$n_bugs" -ne 0
1385708c647SPaul E. McKenney	then
1395708c647SPaul E. McKenney		summary="$summary  Bugs: $n_bugs"
1405708c647SPaul E. McKenney	fi
141*eeb4dd9eSTiezhu Yang	n_kcsan=`grep -E -c 'BUG: KCSAN: ' $file`
142a711aaccSPaul E. McKenney	if test "$n_kcsan" -ne 0
143a711aaccSPaul E. McKenney	then
144a711aaccSPaul E. McKenney		if test "$n_bugs" = "$n_kcsan"
145a711aaccSPaul E. McKenney		then
146a711aaccSPaul E. McKenney			summary="$summary (all bugs kcsan)"
147a711aaccSPaul E. McKenney		else
148a711aaccSPaul E. McKenney			summary="$summary  KCSAN: $n_kcsan"
149a711aaccSPaul E. McKenney		fi
150a711aaccSPaul E. McKenney	fi
151d600e06bSPaul E. McKenney	n_calltrace=`grep -c 'Call Trace:' $file`
1525708c647SPaul E. McKenney	if test "$n_calltrace" -ne 0
1535708c647SPaul E. McKenney	then
1545708c647SPaul E. McKenney		summary="$summary  Call Traces: $n_calltrace"
1555708c647SPaul E. McKenney	fi
156d600e06bSPaul E. McKenney	n_lockdep=`grep -c =========== $file`
1575708c647SPaul E. McKenney	if test "$n_badness" -ne 0
1585708c647SPaul E. McKenney	then
1595708c647SPaul E. McKenney		summary="$summary  lockdep: $n_badness"
1605708c647SPaul E. McKenney	fi
161*eeb4dd9eSTiezhu Yang	n_stalls=`grep -E -c 'detected stalls on CPUs/tasks:|self-detected stall on CPU|Stall ended before state dump start|\?\?\? Writer stall state' $file`
1625708c647SPaul E. McKenney	if test "$n_stalls" -ne 0
1635708c647SPaul E. McKenney	then
1645708c647SPaul E. McKenney		summary="$summary  Stalls: $n_stalls"
1655708c647SPaul E. McKenney	fi
166d600e06bSPaul E. McKenney	n_starves=`grep -c 'rcu_.*kthread starved for' $file`
167682ed706SPaul E. McKenney	if test "$n_starves" -ne 0
168682ed706SPaul E. McKenney	then
169682ed706SPaul E. McKenney		summary="$summary  Starves: $n_starves"
170682ed706SPaul E. McKenney	fi
1715708c647SPaul E. McKenney	print_warning Summary: $summary
172d600e06bSPaul E. McKenney	cat $T.diags >> $file.diags
173d600e06bSPaul E. McKenneyfi
174b4c1906fSPaul E. McKenneyfor i in $file.*.diags
175b4c1906fSPaul E. McKenneydo
176b4c1906fSPaul E. McKenney	if test -f "$i"
177b4c1906fSPaul E. McKenney	then
178b4c1906fSPaul E. McKenney		cat $i >> $file.diags
179b4c1906fSPaul E. McKenney	fi
180b4c1906fSPaul E. McKenneydone
181d600e06bSPaul E. McKenneyif ! test -s $file.diags
182d600e06bSPaul E. McKenneythen
183d600e06bSPaul E. McKenney	rm -f $file.diags
184c87b9c60SPaul E. McKenneyfi
185