162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0+
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Check the console output from an rcutorture run for oopses.
562306a36Sopenharmony_ci# The "file" is a pathname on the local system, and "title" is
662306a36Sopenharmony_ci# a text string for error-message purposes.
762306a36Sopenharmony_ci#
862306a36Sopenharmony_ci# Usage: parse-console.sh file title
962306a36Sopenharmony_ci#
1062306a36Sopenharmony_ci# Copyright (C) IBM Corporation, 2011
1162306a36Sopenharmony_ci#
1262306a36Sopenharmony_ci# Authors: Paul E. McKenney <paulmck@linux.ibm.com>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ciT=${TMPDIR-/tmp}/parse-console.sh.$$
1562306a36Sopenharmony_cifile="$1"
1662306a36Sopenharmony_cititle="$2"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_citrap 'rm -f $T.seq $T.diags' 0
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci. functions.sh
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci# Check for presence and readability of console output file
2362306a36Sopenharmony_ciif test -f "$file" -a -r "$file"
2462306a36Sopenharmony_cithen
2562306a36Sopenharmony_ci	:
2662306a36Sopenharmony_cielse
2762306a36Sopenharmony_ci	echo $title unreadable console output file: $file
2862306a36Sopenharmony_ci	exit 1
2962306a36Sopenharmony_cifi
3062306a36Sopenharmony_ciif grep -Pq '\x00' < $file
3162306a36Sopenharmony_cithen
3262306a36Sopenharmony_ci	print_warning Console output contains nul bytes, old qemu still running?
3362306a36Sopenharmony_cifi
3462306a36Sopenharmony_cicat /dev/null > $file.diags
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci# Check for proper termination, except for rcuscale and refscale.
3762306a36Sopenharmony_ciif test "$TORTURE_SUITE" != rcuscale && test "$TORTURE_SUITE" != refscale
3862306a36Sopenharmony_cithen
3962306a36Sopenharmony_ci	# check for abject failure
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	if grep -q FAILURE $file || grep -q -e '-torture.*!!!' $file
4262306a36Sopenharmony_ci	then
4362306a36Sopenharmony_ci		nerrs=`grep --binary-files=text '!!!' $file |
4462306a36Sopenharmony_ci		tail -1 |
4562306a36Sopenharmony_ci		awk '
4662306a36Sopenharmony_ci		{
4762306a36Sopenharmony_ci			normalexit = 1;
4862306a36Sopenharmony_ci			for (i=NF-8;i<=NF;i++) {
4962306a36Sopenharmony_ci				if (i <= 0 || i !~ /^[0-9]*$/) {
5062306a36Sopenharmony_ci					bangstring = $0;
5162306a36Sopenharmony_ci					gsub(/^\[[^]]*] /, "", bangstring);
5262306a36Sopenharmony_ci					print bangstring;
5362306a36Sopenharmony_ci					normalexit = 0;
5462306a36Sopenharmony_ci					exit 0;
5562306a36Sopenharmony_ci				}
5662306a36Sopenharmony_ci				sum+=$i;
5762306a36Sopenharmony_ci			}
5862306a36Sopenharmony_ci		}
5962306a36Sopenharmony_ci		END {
6062306a36Sopenharmony_ci			if (normalexit)
6162306a36Sopenharmony_ci				print sum " instances"
6262306a36Sopenharmony_ci		}'`
6362306a36Sopenharmony_ci		print_bug $title FAILURE, $nerrs
6462306a36Sopenharmony_ci		exit
6562306a36Sopenharmony_ci	fi
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	grep --binary-files=text 'torture:.*ver:' $file |
6862306a36Sopenharmony_ci	grep -E --binary-files=text -v '\(null\)|rtc: 000000000* ' |
6962306a36Sopenharmony_ci	sed -e 's/^(initramfs)[^]]*] //' -e 's/^\[[^]]*] //' |
7062306a36Sopenharmony_ci	sed -e 's/^.*ver: //' |
7162306a36Sopenharmony_ci	awk '
7262306a36Sopenharmony_ci	BEGIN	{
7362306a36Sopenharmony_ci		ver = 0;
7462306a36Sopenharmony_ci		badseq = 0;
7562306a36Sopenharmony_ci		}
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci		{
7862306a36Sopenharmony_ci		if (!badseq && ($1 + 0 != $1 || $1 <= ver)) {
7962306a36Sopenharmony_ci			badseqno1 = ver;
8062306a36Sopenharmony_ci			badseqno2 = $1;
8162306a36Sopenharmony_ci			badseqnr = NR;
8262306a36Sopenharmony_ci			badseq = 1;
8362306a36Sopenharmony_ci		}
8462306a36Sopenharmony_ci		ver = $1
8562306a36Sopenharmony_ci		}
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	END	{
8862306a36Sopenharmony_ci		if (badseq) {
8962306a36Sopenharmony_ci			if (badseqno1 == badseqno2 && badseqno2 == ver)
9062306a36Sopenharmony_ci				print "GP HANG at " ver " torture stat " badseqnr;
9162306a36Sopenharmony_ci			else
9262306a36Sopenharmony_ci				print "BAD SEQ " badseqno1 ":" badseqno2 " last:" ver " version " badseqnr;
9362306a36Sopenharmony_ci		}
9462306a36Sopenharmony_ci		}' > $T.seq
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci	if grep -q SUCCESS $file
9762306a36Sopenharmony_ci	then
9862306a36Sopenharmony_ci		if test -s $T.seq
9962306a36Sopenharmony_ci		then
10062306a36Sopenharmony_ci			print_warning $title `cat $T.seq`
10162306a36Sopenharmony_ci			echo "   " $file
10262306a36Sopenharmony_ci			exit 2
10362306a36Sopenharmony_ci		fi
10462306a36Sopenharmony_ci	else
10562306a36Sopenharmony_ci		if grep -q "_HOTPLUG:" $file
10662306a36Sopenharmony_ci		then
10762306a36Sopenharmony_ci			print_warning HOTPLUG FAILURES $title `cat $T.seq`
10862306a36Sopenharmony_ci			echo "   " $file
10962306a36Sopenharmony_ci			exit 3
11062306a36Sopenharmony_ci		fi
11162306a36Sopenharmony_ci		echo $title no success message, `grep --binary-files=text 'ver:' $file | wc -l` successful version messages
11262306a36Sopenharmony_ci		if test -s $T.seq
11362306a36Sopenharmony_ci		then
11462306a36Sopenharmony_ci			print_warning $title `cat $T.seq`
11562306a36Sopenharmony_ci		fi
11662306a36Sopenharmony_ci		exit 2
11762306a36Sopenharmony_ci	fi
11862306a36Sopenharmony_cifi | tee -a $file.diags
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ciconsole-badness.sh < $file > $T.diags
12162306a36Sopenharmony_ciif test -s $T.diags
12262306a36Sopenharmony_cithen
12362306a36Sopenharmony_ci	print_warning "Assertion failure in $file $title"
12462306a36Sopenharmony_ci	# cat $T.diags
12562306a36Sopenharmony_ci	summary=""
12662306a36Sopenharmony_ci	n_badness=`grep -c Badness $file`
12762306a36Sopenharmony_ci	if test "$n_badness" -ne 0
12862306a36Sopenharmony_ci	then
12962306a36Sopenharmony_ci		summary="$summary  Badness: $n_badness"
13062306a36Sopenharmony_ci	fi
13162306a36Sopenharmony_ci	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'`
13262306a36Sopenharmony_ci	if test "$n_warn" -ne 0
13362306a36Sopenharmony_ci	then
13462306a36Sopenharmony_ci		summary="$summary  Warnings: $n_warn"
13562306a36Sopenharmony_ci	fi
13662306a36Sopenharmony_ci	n_bugs=`grep -E -c '\bBUG|Oops:' $file`
13762306a36Sopenharmony_ci	if test "$n_bugs" -ne 0
13862306a36Sopenharmony_ci	then
13962306a36Sopenharmony_ci		summary="$summary  Bugs: $n_bugs"
14062306a36Sopenharmony_ci	fi
14162306a36Sopenharmony_ci	n_kcsan=`grep -E -c 'BUG: KCSAN: ' $file`
14262306a36Sopenharmony_ci	if test "$n_kcsan" -ne 0
14362306a36Sopenharmony_ci	then
14462306a36Sopenharmony_ci		if test "$n_bugs" = "$n_kcsan"
14562306a36Sopenharmony_ci		then
14662306a36Sopenharmony_ci			summary="$summary (all bugs kcsan)"
14762306a36Sopenharmony_ci		else
14862306a36Sopenharmony_ci			summary="$summary  KCSAN: $n_kcsan"
14962306a36Sopenharmony_ci		fi
15062306a36Sopenharmony_ci	fi
15162306a36Sopenharmony_ci	n_calltrace=`grep -c 'Call Trace:' $file`
15262306a36Sopenharmony_ci	if test "$n_calltrace" -ne 0
15362306a36Sopenharmony_ci	then
15462306a36Sopenharmony_ci		summary="$summary  Call Traces: $n_calltrace"
15562306a36Sopenharmony_ci	fi
15662306a36Sopenharmony_ci	n_lockdep=`grep -c =========== $file`
15762306a36Sopenharmony_ci	if test "$n_badness" -ne 0
15862306a36Sopenharmony_ci	then
15962306a36Sopenharmony_ci		summary="$summary  lockdep: $n_badness"
16062306a36Sopenharmony_ci	fi
16162306a36Sopenharmony_ci	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`
16262306a36Sopenharmony_ci	if test "$n_stalls" -ne 0
16362306a36Sopenharmony_ci	then
16462306a36Sopenharmony_ci		summary="$summary  Stalls: $n_stalls"
16562306a36Sopenharmony_ci	fi
16662306a36Sopenharmony_ci	n_starves=`grep -c 'rcu_.*kthread starved for' $file`
16762306a36Sopenharmony_ci	if test "$n_starves" -ne 0
16862306a36Sopenharmony_ci	then
16962306a36Sopenharmony_ci		summary="$summary  Starves: $n_starves"
17062306a36Sopenharmony_ci	fi
17162306a36Sopenharmony_ci	print_warning Summary: $summary
17262306a36Sopenharmony_ci	cat $T.diags >> $file.diags
17362306a36Sopenharmony_cifi
17462306a36Sopenharmony_cifor i in $file.*.diags
17562306a36Sopenharmony_cido
17662306a36Sopenharmony_ci	if test -f "$i"
17762306a36Sopenharmony_ci	then
17862306a36Sopenharmony_ci		cat $i >> $file.diags
17962306a36Sopenharmony_ci	fi
18062306a36Sopenharmony_cidone
18162306a36Sopenharmony_ciif ! test -s $file.diags
18262306a36Sopenharmony_cithen
18362306a36Sopenharmony_ci	rm -f $file.diags
18462306a36Sopenharmony_cifi
185