xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/rcutorture/bin/parse-console.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0+
3*4882a593Smuzhiyun#
4*4882a593Smuzhiyun# Check the console output from an rcutorture run for oopses.
5*4882a593Smuzhiyun# The "file" is a pathname on the local system, and "title" is
6*4882a593Smuzhiyun# a text string for error-message purposes.
7*4882a593Smuzhiyun#
8*4882a593Smuzhiyun# Usage: parse-console.sh file title
9*4882a593Smuzhiyun#
10*4882a593Smuzhiyun# Copyright (C) IBM Corporation, 2011
11*4882a593Smuzhiyun#
12*4882a593Smuzhiyun# Authors: Paul E. McKenney <paulmck@linux.ibm.com>
13*4882a593Smuzhiyun
14*4882a593SmuzhiyunT=${TMPDIR-/tmp}/parse-console.sh.$$
15*4882a593Smuzhiyunfile="$1"
16*4882a593Smuzhiyuntitle="$2"
17*4882a593Smuzhiyun
18*4882a593Smuzhiyuntrap 'rm -f $T.seq $T.diags' 0
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun. functions.sh
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun# Check for presence and readability of console output file
23*4882a593Smuzhiyunif test -f "$file" -a -r "$file"
24*4882a593Smuzhiyunthen
25*4882a593Smuzhiyun	:
26*4882a593Smuzhiyunelse
27*4882a593Smuzhiyun	echo $title unreadable console output file: $file
28*4882a593Smuzhiyun	exit 1
29*4882a593Smuzhiyunfi
30*4882a593Smuzhiyunif grep -Pq '\x00' < $file
31*4882a593Smuzhiyunthen
32*4882a593Smuzhiyun	print_warning Console output contains nul bytes, old qemu still running?
33*4882a593Smuzhiyunfi
34*4882a593Smuzhiyuncat /dev/null > $file.diags
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun# Check for proper termination, except for rcuscale and refscale.
37*4882a593Smuzhiyunif test "$TORTURE_SUITE" != rcuscale && test "$TORTURE_SUITE" != refscale
38*4882a593Smuzhiyunthen
39*4882a593Smuzhiyun	# check for abject failure
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun	if grep -q FAILURE $file || grep -q -e '-torture.*!!!' $file
42*4882a593Smuzhiyun	then
43*4882a593Smuzhiyun		nerrs=`grep --binary-files=text '!!!' $file |
44*4882a593Smuzhiyun		tail -1 |
45*4882a593Smuzhiyun		awk '
46*4882a593Smuzhiyun		{
47*4882a593Smuzhiyun			normalexit = 1;
48*4882a593Smuzhiyun			for (i=NF-8;i<=NF;i++) {
49*4882a593Smuzhiyun				if (i <= 0 || i !~ /^[0-9]*$/) {
50*4882a593Smuzhiyun					bangstring = $0;
51*4882a593Smuzhiyun					gsub(/^\[[^]]*] /, "", bangstring);
52*4882a593Smuzhiyun					print bangstring;
53*4882a593Smuzhiyun					normalexit = 0;
54*4882a593Smuzhiyun					exit 0;
55*4882a593Smuzhiyun				}
56*4882a593Smuzhiyun				sum+=$i;
57*4882a593Smuzhiyun			}
58*4882a593Smuzhiyun		}
59*4882a593Smuzhiyun		END {
60*4882a593Smuzhiyun			if (normalexit)
61*4882a593Smuzhiyun				print sum " instances"
62*4882a593Smuzhiyun		}'`
63*4882a593Smuzhiyun		print_bug $title FAILURE, $nerrs
64*4882a593Smuzhiyun		exit
65*4882a593Smuzhiyun	fi
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun	grep --binary-files=text 'torture:.*ver:' $file |
68*4882a593Smuzhiyun	egrep --binary-files=text -v '\(null\)|rtc: 000000000* ' |
69*4882a593Smuzhiyun	sed -e 's/^(initramfs)[^]]*] //' -e 's/^\[[^]]*] //' |
70*4882a593Smuzhiyun	sed -e 's/^.*ver: //' |
71*4882a593Smuzhiyun	awk '
72*4882a593Smuzhiyun	BEGIN	{
73*4882a593Smuzhiyun		ver = 0;
74*4882a593Smuzhiyun		badseq = 0;
75*4882a593Smuzhiyun		}
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun		{
78*4882a593Smuzhiyun		if (!badseq && ($1 + 0 != $1 || $1 <= ver)) {
79*4882a593Smuzhiyun			badseqno1 = ver;
80*4882a593Smuzhiyun			badseqno2 = $1;
81*4882a593Smuzhiyun			badseqnr = NR;
82*4882a593Smuzhiyun			badseq = 1;
83*4882a593Smuzhiyun		}
84*4882a593Smuzhiyun		ver = $1
85*4882a593Smuzhiyun		}
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun	END	{
88*4882a593Smuzhiyun		if (badseq) {
89*4882a593Smuzhiyun			if (badseqno1 == badseqno2 && badseqno2 == ver)
90*4882a593Smuzhiyun				print "GP HANG at " ver " torture stat " badseqnr;
91*4882a593Smuzhiyun			else
92*4882a593Smuzhiyun				print "BAD SEQ " badseqno1 ":" badseqno2 " last:" ver " version " badseqnr;
93*4882a593Smuzhiyun		}
94*4882a593Smuzhiyun		}' > $T.seq
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun	if grep -q SUCCESS $file
97*4882a593Smuzhiyun	then
98*4882a593Smuzhiyun		if test -s $T.seq
99*4882a593Smuzhiyun		then
100*4882a593Smuzhiyun			print_warning $title `cat $T.seq`
101*4882a593Smuzhiyun			echo "   " $file
102*4882a593Smuzhiyun			exit 2
103*4882a593Smuzhiyun		fi
104*4882a593Smuzhiyun	else
105*4882a593Smuzhiyun		if grep -q "_HOTPLUG:" $file
106*4882a593Smuzhiyun		then
107*4882a593Smuzhiyun			print_warning HOTPLUG FAILURES $title `cat $T.seq`
108*4882a593Smuzhiyun			echo "   " $file
109*4882a593Smuzhiyun			exit 3
110*4882a593Smuzhiyun		fi
111*4882a593Smuzhiyun		echo $title no success message, `grep --binary-files=text 'ver:' $file | wc -l` successful version messages
112*4882a593Smuzhiyun		if test -s $T.seq
113*4882a593Smuzhiyun		then
114*4882a593Smuzhiyun			print_warning $title `cat $T.seq`
115*4882a593Smuzhiyun		fi
116*4882a593Smuzhiyun		exit 2
117*4882a593Smuzhiyun	fi
118*4882a593Smuzhiyunfi | tee -a $file.diags
119*4882a593Smuzhiyun
120*4882a593Smuzhiyunconsole-badness.sh < $file > $T.diags
121*4882a593Smuzhiyunif test -s $T.diags
122*4882a593Smuzhiyunthen
123*4882a593Smuzhiyun	print_warning "Assertion failure in $file $title"
124*4882a593Smuzhiyun	# cat $T.diags
125*4882a593Smuzhiyun	summary=""
126*4882a593Smuzhiyun	n_badness=`grep -c Badness $file`
127*4882a593Smuzhiyun	if test "$n_badness" -ne 0
128*4882a593Smuzhiyun	then
129*4882a593Smuzhiyun		summary="$summary  Badness: $n_badness"
130*4882a593Smuzhiyun	fi
131*4882a593Smuzhiyun	n_warn=`grep -v 'Warning: unable to open an initial console' $file | egrep -c 'WARNING:|Warn'`
132*4882a593Smuzhiyun	if test "$n_warn" -ne 0
133*4882a593Smuzhiyun	then
134*4882a593Smuzhiyun		summary="$summary  Warnings: $n_warn"
135*4882a593Smuzhiyun	fi
136*4882a593Smuzhiyun	n_bugs=`egrep -c 'BUG|Oops:' $file`
137*4882a593Smuzhiyun	if test "$n_bugs" -ne 0
138*4882a593Smuzhiyun	then
139*4882a593Smuzhiyun		summary="$summary  Bugs: $n_bugs"
140*4882a593Smuzhiyun	fi
141*4882a593Smuzhiyun	n_calltrace=`grep -c 'Call Trace:' $file`
142*4882a593Smuzhiyun	if test "$n_calltrace" -ne 0
143*4882a593Smuzhiyun	then
144*4882a593Smuzhiyun		summary="$summary  Call Traces: $n_calltrace"
145*4882a593Smuzhiyun	fi
146*4882a593Smuzhiyun	n_lockdep=`grep -c =========== $file`
147*4882a593Smuzhiyun	if test "$n_badness" -ne 0
148*4882a593Smuzhiyun	then
149*4882a593Smuzhiyun		summary="$summary  lockdep: $n_badness"
150*4882a593Smuzhiyun	fi
151*4882a593Smuzhiyun	n_stalls=`egrep -c 'detected stalls on CPUs/tasks:|self-detected stall on CPU|Stall ended before state dump start|\?\?\? Writer stall state' $file`
152*4882a593Smuzhiyun	if test "$n_stalls" -ne 0
153*4882a593Smuzhiyun	then
154*4882a593Smuzhiyun		summary="$summary  Stalls: $n_stalls"
155*4882a593Smuzhiyun	fi
156*4882a593Smuzhiyun	n_starves=`grep -c 'rcu_.*kthread starved for' $file`
157*4882a593Smuzhiyun	if test "$n_starves" -ne 0
158*4882a593Smuzhiyun	then
159*4882a593Smuzhiyun		summary="$summary  Starves: $n_starves"
160*4882a593Smuzhiyun	fi
161*4882a593Smuzhiyun	print_warning Summary: $summary
162*4882a593Smuzhiyun	cat $T.diags >> $file.diags
163*4882a593Smuzhiyunfi
164*4882a593Smuzhiyunfor i in $file.*.diags
165*4882a593Smuzhiyundo
166*4882a593Smuzhiyun	if test -f "$i"
167*4882a593Smuzhiyun	then
168*4882a593Smuzhiyun		cat $i >> $file.diags
169*4882a593Smuzhiyun	fi
170*4882a593Smuzhiyundone
171*4882a593Smuzhiyunif ! test -s $file.diags
172*4882a593Smuzhiyunthen
173*4882a593Smuzhiyun	rm -f $file.diags
174*4882a593Smuzhiyunfi
175