18c2ecf20Sopenharmony_ci#!/bin/bash
28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0+
38c2ecf20Sopenharmony_ci#
48c2ecf20Sopenharmony_ci# Check the console output from an rcutorture run for oopses.
58c2ecf20Sopenharmony_ci# The "file" is a pathname on the local system, and "title" is
68c2ecf20Sopenharmony_ci# a text string for error-message purposes.
78c2ecf20Sopenharmony_ci#
88c2ecf20Sopenharmony_ci# Usage: parse-console.sh file title
98c2ecf20Sopenharmony_ci#
108c2ecf20Sopenharmony_ci# Copyright (C) IBM Corporation, 2011
118c2ecf20Sopenharmony_ci#
128c2ecf20Sopenharmony_ci# Authors: Paul E. McKenney <paulmck@linux.ibm.com>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ciT=${TMPDIR-/tmp}/parse-console.sh.$$
158c2ecf20Sopenharmony_cifile="$1"
168c2ecf20Sopenharmony_cititle="$2"
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_citrap 'rm -f $T.seq $T.diags' 0
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci. functions.sh
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci# Check for presence and readability of console output file
238c2ecf20Sopenharmony_ciif test -f "$file" -a -r "$file"
248c2ecf20Sopenharmony_cithen
258c2ecf20Sopenharmony_ci	:
268c2ecf20Sopenharmony_cielse
278c2ecf20Sopenharmony_ci	echo $title unreadable console output file: $file
288c2ecf20Sopenharmony_ci	exit 1
298c2ecf20Sopenharmony_cifi
308c2ecf20Sopenharmony_ciif grep -Pq '\x00' < $file
318c2ecf20Sopenharmony_cithen
328c2ecf20Sopenharmony_ci	print_warning Console output contains nul bytes, old qemu still running?
338c2ecf20Sopenharmony_cifi
348c2ecf20Sopenharmony_cicat /dev/null > $file.diags
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci# Check for proper termination, except for rcuscale and refscale.
378c2ecf20Sopenharmony_ciif test "$TORTURE_SUITE" != rcuscale && test "$TORTURE_SUITE" != refscale
388c2ecf20Sopenharmony_cithen
398c2ecf20Sopenharmony_ci	# check for abject failure
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	if grep -q FAILURE $file || grep -q -e '-torture.*!!!' $file
428c2ecf20Sopenharmony_ci	then
438c2ecf20Sopenharmony_ci		nerrs=`grep --binary-files=text '!!!' $file |
448c2ecf20Sopenharmony_ci		tail -1 |
458c2ecf20Sopenharmony_ci		awk '
468c2ecf20Sopenharmony_ci		{
478c2ecf20Sopenharmony_ci			normalexit = 1;
488c2ecf20Sopenharmony_ci			for (i=NF-8;i<=NF;i++) {
498c2ecf20Sopenharmony_ci				if (i <= 0 || i !~ /^[0-9]*$/) {
508c2ecf20Sopenharmony_ci					bangstring = $0;
518c2ecf20Sopenharmony_ci					gsub(/^\[[^]]*] /, "", bangstring);
528c2ecf20Sopenharmony_ci					print bangstring;
538c2ecf20Sopenharmony_ci					normalexit = 0;
548c2ecf20Sopenharmony_ci					exit 0;
558c2ecf20Sopenharmony_ci				}
568c2ecf20Sopenharmony_ci				sum+=$i;
578c2ecf20Sopenharmony_ci			}
588c2ecf20Sopenharmony_ci		}
598c2ecf20Sopenharmony_ci		END {
608c2ecf20Sopenharmony_ci			if (normalexit)
618c2ecf20Sopenharmony_ci				print sum " instances"
628c2ecf20Sopenharmony_ci		}'`
638c2ecf20Sopenharmony_ci		print_bug $title FAILURE, $nerrs
648c2ecf20Sopenharmony_ci		exit
658c2ecf20Sopenharmony_ci	fi
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci	grep --binary-files=text 'torture:.*ver:' $file |
688c2ecf20Sopenharmony_ci	egrep --binary-files=text -v '\(null\)|rtc: 000000000* ' |
698c2ecf20Sopenharmony_ci	sed -e 's/^(initramfs)[^]]*] //' -e 's/^\[[^]]*] //' |
708c2ecf20Sopenharmony_ci	sed -e 's/^.*ver: //' |
718c2ecf20Sopenharmony_ci	awk '
728c2ecf20Sopenharmony_ci	BEGIN	{
738c2ecf20Sopenharmony_ci		ver = 0;
748c2ecf20Sopenharmony_ci		badseq = 0;
758c2ecf20Sopenharmony_ci		}
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci		{
788c2ecf20Sopenharmony_ci		if (!badseq && ($1 + 0 != $1 || $1 <= ver)) {
798c2ecf20Sopenharmony_ci			badseqno1 = ver;
808c2ecf20Sopenharmony_ci			badseqno2 = $1;
818c2ecf20Sopenharmony_ci			badseqnr = NR;
828c2ecf20Sopenharmony_ci			badseq = 1;
838c2ecf20Sopenharmony_ci		}
848c2ecf20Sopenharmony_ci		ver = $1
858c2ecf20Sopenharmony_ci		}
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci	END	{
888c2ecf20Sopenharmony_ci		if (badseq) {
898c2ecf20Sopenharmony_ci			if (badseqno1 == badseqno2 && badseqno2 == ver)
908c2ecf20Sopenharmony_ci				print "GP HANG at " ver " torture stat " badseqnr;
918c2ecf20Sopenharmony_ci			else
928c2ecf20Sopenharmony_ci				print "BAD SEQ " badseqno1 ":" badseqno2 " last:" ver " version " badseqnr;
938c2ecf20Sopenharmony_ci		}
948c2ecf20Sopenharmony_ci		}' > $T.seq
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci	if grep -q SUCCESS $file
978c2ecf20Sopenharmony_ci	then
988c2ecf20Sopenharmony_ci		if test -s $T.seq
998c2ecf20Sopenharmony_ci		then
1008c2ecf20Sopenharmony_ci			print_warning $title `cat $T.seq`
1018c2ecf20Sopenharmony_ci			echo "   " $file
1028c2ecf20Sopenharmony_ci			exit 2
1038c2ecf20Sopenharmony_ci		fi
1048c2ecf20Sopenharmony_ci	else
1058c2ecf20Sopenharmony_ci		if grep -q "_HOTPLUG:" $file
1068c2ecf20Sopenharmony_ci		then
1078c2ecf20Sopenharmony_ci			print_warning HOTPLUG FAILURES $title `cat $T.seq`
1088c2ecf20Sopenharmony_ci			echo "   " $file
1098c2ecf20Sopenharmony_ci			exit 3
1108c2ecf20Sopenharmony_ci		fi
1118c2ecf20Sopenharmony_ci		echo $title no success message, `grep --binary-files=text 'ver:' $file | wc -l` successful version messages
1128c2ecf20Sopenharmony_ci		if test -s $T.seq
1138c2ecf20Sopenharmony_ci		then
1148c2ecf20Sopenharmony_ci			print_warning $title `cat $T.seq`
1158c2ecf20Sopenharmony_ci		fi
1168c2ecf20Sopenharmony_ci		exit 2
1178c2ecf20Sopenharmony_ci	fi
1188c2ecf20Sopenharmony_cifi | tee -a $file.diags
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ciconsole-badness.sh < $file > $T.diags
1218c2ecf20Sopenharmony_ciif test -s $T.diags
1228c2ecf20Sopenharmony_cithen
1238c2ecf20Sopenharmony_ci	print_warning "Assertion failure in $file $title"
1248c2ecf20Sopenharmony_ci	# cat $T.diags
1258c2ecf20Sopenharmony_ci	summary=""
1268c2ecf20Sopenharmony_ci	n_badness=`grep -c Badness $file`
1278c2ecf20Sopenharmony_ci	if test "$n_badness" -ne 0
1288c2ecf20Sopenharmony_ci	then
1298c2ecf20Sopenharmony_ci		summary="$summary  Badness: $n_badness"
1308c2ecf20Sopenharmony_ci	fi
1318c2ecf20Sopenharmony_ci	n_warn=`grep -v 'Warning: unable to open an initial console' $file | egrep -c 'WARNING:|Warn'`
1328c2ecf20Sopenharmony_ci	if test "$n_warn" -ne 0
1338c2ecf20Sopenharmony_ci	then
1348c2ecf20Sopenharmony_ci		summary="$summary  Warnings: $n_warn"
1358c2ecf20Sopenharmony_ci	fi
1368c2ecf20Sopenharmony_ci	n_bugs=`egrep -c 'BUG|Oops:' $file`
1378c2ecf20Sopenharmony_ci	if test "$n_bugs" -ne 0
1388c2ecf20Sopenharmony_ci	then
1398c2ecf20Sopenharmony_ci		summary="$summary  Bugs: $n_bugs"
1408c2ecf20Sopenharmony_ci	fi
1418c2ecf20Sopenharmony_ci	n_calltrace=`grep -c 'Call Trace:' $file`
1428c2ecf20Sopenharmony_ci	if test "$n_calltrace" -ne 0
1438c2ecf20Sopenharmony_ci	then
1448c2ecf20Sopenharmony_ci		summary="$summary  Call Traces: $n_calltrace"
1458c2ecf20Sopenharmony_ci	fi
1468c2ecf20Sopenharmony_ci	n_lockdep=`grep -c =========== $file`
1478c2ecf20Sopenharmony_ci	if test "$n_badness" -ne 0
1488c2ecf20Sopenharmony_ci	then
1498c2ecf20Sopenharmony_ci		summary="$summary  lockdep: $n_badness"
1508c2ecf20Sopenharmony_ci	fi
1518c2ecf20Sopenharmony_ci	n_stalls=`egrep -c 'detected stalls on CPUs/tasks:|self-detected stall on CPU|Stall ended before state dump start|\?\?\? Writer stall state' $file`
1528c2ecf20Sopenharmony_ci	if test "$n_stalls" -ne 0
1538c2ecf20Sopenharmony_ci	then
1548c2ecf20Sopenharmony_ci		summary="$summary  Stalls: $n_stalls"
1558c2ecf20Sopenharmony_ci	fi
1568c2ecf20Sopenharmony_ci	n_starves=`grep -c 'rcu_.*kthread starved for' $file`
1578c2ecf20Sopenharmony_ci	if test "$n_starves" -ne 0
1588c2ecf20Sopenharmony_ci	then
1598c2ecf20Sopenharmony_ci		summary="$summary  Starves: $n_starves"
1608c2ecf20Sopenharmony_ci	fi
1618c2ecf20Sopenharmony_ci	print_warning Summary: $summary
1628c2ecf20Sopenharmony_ci	cat $T.diags >> $file.diags
1638c2ecf20Sopenharmony_cifi
1648c2ecf20Sopenharmony_cifor i in $file.*.diags
1658c2ecf20Sopenharmony_cido
1668c2ecf20Sopenharmony_ci	if test -f "$i"
1678c2ecf20Sopenharmony_ci	then
1688c2ecf20Sopenharmony_ci		cat $i >> $file.diags
1698c2ecf20Sopenharmony_ci	fi
1708c2ecf20Sopenharmony_cidone
1718c2ecf20Sopenharmony_ciif ! test -s $file.diags
1728c2ecf20Sopenharmony_cithen
1738c2ecf20Sopenharmony_ci	rm -f $file.diags
1748c2ecf20Sopenharmony_cifi
175