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