1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0+ 3*4882a593Smuzhiyun# 4*4882a593Smuzhiyun# Given the results directories for previous KVM-based torture runs, 5*4882a593Smuzhiyun# check the build and console output for errors. Given a directory 6*4882a593Smuzhiyun# containing results directories, this recursively checks them all. 7*4882a593Smuzhiyun# 8*4882a593Smuzhiyun# Usage: kvm-recheck.sh resdir ... 9*4882a593Smuzhiyun# 10*4882a593Smuzhiyun# Returns status reflecting the success or not of the last run specified. 11*4882a593Smuzhiyun# 12*4882a593Smuzhiyun# Copyright (C) IBM Corporation, 2011 13*4882a593Smuzhiyun# 14*4882a593Smuzhiyun# Authors: Paul E. McKenney <paulmck@linux.ibm.com> 15*4882a593Smuzhiyun 16*4882a593SmuzhiyunT=/tmp/kvm-recheck.sh.$$ 17*4882a593Smuzhiyuntrap 'rm -f $T' 0 2 18*4882a593Smuzhiyun 19*4882a593SmuzhiyunPATH=`pwd`/tools/testing/selftests/rcutorture/bin:$PATH; export PATH 20*4882a593Smuzhiyun. functions.sh 21*4882a593Smuzhiyunfor rd in "$@" 22*4882a593Smuzhiyundo 23*4882a593Smuzhiyun firsttime=1 24*4882a593Smuzhiyun dirs=`find $rd -name Make.defconfig.out -print | sort | sed -e 's,/[^/]*$,,' | sort -u` 25*4882a593Smuzhiyun for i in $dirs 26*4882a593Smuzhiyun do 27*4882a593Smuzhiyun if test -n "$firsttime" 28*4882a593Smuzhiyun then 29*4882a593Smuzhiyun firsttime="" 30*4882a593Smuzhiyun resdir=`echo $i | sed -e 's,/$,,' -e 's,/[^/]*$,,'` 31*4882a593Smuzhiyun head -1 $resdir/log 32*4882a593Smuzhiyun fi 33*4882a593Smuzhiyun TORTURE_SUITE="`cat $i/../TORTURE_SUITE`" 34*4882a593Smuzhiyun configfile=`echo $i | sed -e 's,^.*/,,'` 35*4882a593Smuzhiyun rm -f $i/console.log.*.diags 36*4882a593Smuzhiyun kvm-recheck-${TORTURE_SUITE}.sh $i 37*4882a593Smuzhiyun if test -f "$i/qemu-retval" && test "`cat $i/qemu-retval`" -ne 0 && test "`cat $i/qemu-retval`" -ne 137 38*4882a593Smuzhiyun then 39*4882a593Smuzhiyun echo QEMU error, output: 40*4882a593Smuzhiyun cat $i/qemu-output 41*4882a593Smuzhiyun elif test -f "$i/console.log" 42*4882a593Smuzhiyun then 43*4882a593Smuzhiyun if test -f "$i/qemu-retval" && test "`cat $i/qemu-retval`" -eq 137 44*4882a593Smuzhiyun then 45*4882a593Smuzhiyun echo QEMU killed 46*4882a593Smuzhiyun fi 47*4882a593Smuzhiyun configcheck.sh $i/.config $i/ConfigFragment > $T 2>&1 48*4882a593Smuzhiyun cat $T 49*4882a593Smuzhiyun if test -r $i/Make.oldconfig.err 50*4882a593Smuzhiyun then 51*4882a593Smuzhiyun cat $i/Make.oldconfig.err 52*4882a593Smuzhiyun fi 53*4882a593Smuzhiyun parse-build.sh $i/Make.out $configfile 54*4882a593Smuzhiyun parse-console.sh $i/console.log $configfile 55*4882a593Smuzhiyun if test -r $i/Warnings 56*4882a593Smuzhiyun then 57*4882a593Smuzhiyun cat $i/Warnings 58*4882a593Smuzhiyun fi 59*4882a593Smuzhiyun else 60*4882a593Smuzhiyun if test -f "$i/buildonly" 61*4882a593Smuzhiyun then 62*4882a593Smuzhiyun echo Build-only run, no boot/test 63*4882a593Smuzhiyun configcheck.sh $i/.config $i/ConfigFragment 64*4882a593Smuzhiyun parse-build.sh $i/Make.out $configfile 65*4882a593Smuzhiyun elif test -f "$i/qemu-cmd" 66*4882a593Smuzhiyun then 67*4882a593Smuzhiyun print_bug qemu failed 68*4882a593Smuzhiyun echo " $i" 69*4882a593Smuzhiyun else 70*4882a593Smuzhiyun print_bug Build failed 71*4882a593Smuzhiyun echo " $i" 72*4882a593Smuzhiyun fi 73*4882a593Smuzhiyun fi 74*4882a593Smuzhiyun done 75*4882a593Smuzhiyun if test -f "$rd/kcsan.sum" 76*4882a593Smuzhiyun then 77*4882a593Smuzhiyun if grep -q CONFIG_KCSAN=y $T 78*4882a593Smuzhiyun then 79*4882a593Smuzhiyun echo "Compiler or architecture does not support KCSAN!" 80*4882a593Smuzhiyun echo Did you forget to switch your compiler with '--kmake-arg CC=<cc-that-supports-kcsan>'? 81*4882a593Smuzhiyun elif test -s "$rd/kcsan.sum" 82*4882a593Smuzhiyun then 83*4882a593Smuzhiyun echo KCSAN summary in $rd/kcsan.sum 84*4882a593Smuzhiyun else 85*4882a593Smuzhiyun echo Clean KCSAN run in $rd 86*4882a593Smuzhiyun fi 87*4882a593Smuzhiyun fi 88*4882a593Smuzhiyundone 89*4882a593SmuzhiyunEDITOR=echo kvm-find-errors.sh "${@: -1}" > $T 2>&1 90*4882a593Smuzhiyunret=$? 91*4882a593Smuzhiyunbuilderrors="`tr ' ' '\012' < $T | grep -c '/Make.out.diags'`" 92*4882a593Smuzhiyunif test "$builderrors" -gt 0 93*4882a593Smuzhiyunthen 94*4882a593Smuzhiyun echo $builderrors runs with build errors. 95*4882a593Smuzhiyunfi 96*4882a593Smuzhiyunrunerrors="`tr ' ' '\012' < $T | grep -c '/console.log.diags'`" 97*4882a593Smuzhiyunif test "$runerrors" -gt 0 98*4882a593Smuzhiyunthen 99*4882a593Smuzhiyun echo $runerrors runs with runtime errors. 100*4882a593Smuzhiyunfi 101*4882a593Smuzhiyunexit $ret 102