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