1#!/bin/sh 2# SPDX-License-Identifier: GPL-2.0+ 3# 4# Run a group of kvm.sh tests on the specified commits. This currently 5# unconditionally does three-minute runs on each scenario in CFLIST, 6# taking advantage of all available CPUs and trusting the "make" utility. 7# In the short term, adjustments can be made by editing this script and 8# CFLIST. If some adjustments appear to have ongoing value, this script 9# might grow some command-line arguments. 10# 11# Usage: kvm-check-branches.sh commit1 commit2..commit3 commit4 ... 12# 13# This script considers its arguments one at a time. If more elaborate 14# specification of commits is needed, please use "git rev-list" to 15# produce something that this simple script can understand. The reason 16# for retaining the simplicity is that it allows the user to more easily 17# see which commit came from which branch. 18# 19# This script creates a yyyy.mm.dd-hh.mm.ss-group entry in the "res" 20# directory. The calls to kvm.sh create the usual entries, but this script 21# moves them under the yyyy.mm.dd-hh.mm.ss-group entry, each in its own 22# directory numbered in run order, that is, "0001", "0002", and so on. 23# For successful runs, the large build artifacts are removed. Doing this 24# reduces the disk space required by about two orders of magnitude for 25# successful runs. 26# 27# Copyright (C) Facebook, 2020 28# 29# Authors: Paul E. McKenney <paulmck@kernel.org> 30 31if ! git status > /dev/null 2>&1 32then 33 echo '!!!' This script needs to run in a git archive. 1>&2 34 echo '!!!' Giving up. 1>&2 35 exit 1 36fi 37 38# Remember where we started so that we can get back and the end. 39curcommit="`git status | head -1 | awk '{ print $NF }'`" 40 41nfail=0 42ntry=0 43resdir="tools/testing/selftests/rcutorture/res" 44ds="`date +%Y.%m.%d-%H.%M.%S`-group" 45if ! test -e $resdir 46then 47 mkdir $resdir || : 48fi 49mkdir $resdir/$ds 50echo Results directory: $resdir/$ds 51 52KVM="`pwd`/tools/testing/selftests/rcutorture"; export KVM 53PATH=${KVM}/bin:$PATH; export PATH 54. functions.sh 55cpus="`identify_qemu_vcpus`" 56echo Using up to $cpus CPUs. 57 58# Each pass through this loop does one command-line argument. 59for gitbr in $@ 60do 61 echo ' --- git branch ' $gitbr 62 63 # Each pass through this loop tests one commit. 64 for i in `git rev-list "$gitbr"` 65 do 66 ntry=`expr $ntry + 1` 67 idir=`awk -v ntry="$ntry" 'END { printf "%04d", ntry; }' < /dev/null` 68 echo ' --- commit ' $i from branch $gitbr 69 date 70 mkdir $resdir/$ds/$idir 71 echo $gitbr > $resdir/$ds/$idir/gitbr 72 echo $i >> $resdir/$ds/$idir/gitbr 73 74 # Test the specified commit. 75 git checkout $i > $resdir/$ds/$idir/git-checkout.out 2>&1 76 echo git checkout return code: $? "(Commit $ntry: $i)" 77 kvm.sh --cpus $cpus --duration 3 --trust-make > $resdir/$ds/$idir/kvm.sh.out 2>&1 78 ret=$? 79 echo kvm.sh return code $ret for commit $i from branch $gitbr 80 81 # Move the build products to their resting place. 82 runresdir="`grep -m 1 '^Results directory:' < $resdir/$ds/$idir/kvm.sh.out | sed -e 's/^Results directory://'`" 83 mv $runresdir $resdir/$ds/$idir 84 rrd="`echo $runresdir | sed -e 's,^.*/,,'`" 85 echo Run results: $resdir/$ds/$idir/$rrd 86 if test "$ret" -ne 0 87 then 88 # Failure, so leave all evidence intact. 89 nfail=`expr $nfail + 1` 90 else 91 # Success, so remove large files to save about 1GB. 92 ( cd $resdir/$ds/$idir/$rrd; rm -f */vmlinux */bzImage */System.map */Module.symvers ) 93 fi 94 done 95done 96date 97 98# Go back to the original commit. 99git checkout "$curcommit" 100 101if test $nfail -ne 0 102then 103 echo '!!! ' $nfail failures in $ntry 'runs!!!' 104 exit 1 105else 106 echo No failures in $ntry runs. 107 exit 0 108fi 109