1*515a48feSPaul E. McKenney#!/bin/bash 2*515a48feSPaul E. McKenney# SPDX-License-Identifier: GPL-2.0+ 3*515a48feSPaul E. McKenney# 4*515a48feSPaul E. McKenney# Usage: kvm-series.sh config-list commit-id-list [ kvm.sh parameters ] 5*515a48feSPaul E. McKenney# 6*515a48feSPaul E. McKenney# Tests the specified list of unadorned configs ("TREE01 SRCU-P" but not 7*515a48feSPaul E. McKenney# "CFLIST" or "3*TRACE01") and an indication of a set of commits to test, 8*515a48feSPaul E. McKenney# then runs each commit through the specified list of commits using kvm.sh. 9*515a48feSPaul E. McKenney# The runs are grouped into a -series/config/commit directory tree. 10*515a48feSPaul E. McKenney# Each run defaults to a duration of one minute. 11*515a48feSPaul E. McKenney# 12*515a48feSPaul E. McKenney# Run in top-level Linux source directory. Please note that this is in 13*515a48feSPaul E. McKenney# no way a replacement for "git bisect"!!! 14*515a48feSPaul E. McKenney# 15*515a48feSPaul E. McKenney# This script is intended to replace kvm-check-branches.sh by providing 16*515a48feSPaul E. McKenney# ease of use and faster execution. 17*515a48feSPaul E. McKenney 18*515a48feSPaul E. McKenneyT="`mktemp -d ${TMPDIR-/tmp}/kvm-series.sh.XXXXXX`" 19*515a48feSPaul E. McKenneytrap 'rm -rf $T' 0 20*515a48feSPaul E. McKenney 21*515a48feSPaul E. McKenneyscriptname=$0 22*515a48feSPaul E. McKenneyargs="$*" 23*515a48feSPaul E. McKenney 24*515a48feSPaul E. McKenneyconfig_list="${1}" 25*515a48feSPaul E. McKenneyif test -z "${config_list}" 26*515a48feSPaul E. McKenneythen 27*515a48feSPaul E. McKenney echo "$0: Need a quoted list of --config arguments for first argument." 28*515a48feSPaul E. McKenney exit 1 29*515a48feSPaul E. McKenneyfi 30*515a48feSPaul E. McKenneyif test -z "${config_list}" || echo "${config_list}" | grep -q '\*' 31*515a48feSPaul E. McKenneythen 32*515a48feSPaul E. McKenney echo "$0: Repetition ('*') not allowed in config list." 33*515a48feSPaul E. McKenney exit 1 34*515a48feSPaul E. McKenneyfi 35*515a48feSPaul E. McKenney 36*515a48feSPaul E. McKenneycommit_list="${2}" 37*515a48feSPaul E. McKenneyif test -z "${commit_list}" 38*515a48feSPaul E. McKenneythen 39*515a48feSPaul E. McKenney echo "$0: Need a list of commits (e.g., HEAD^^^..) for second argument." 40*515a48feSPaul E. McKenney exit 2 41*515a48feSPaul E. McKenneyfi 42*515a48feSPaul E. McKenneygit log --pretty=format:"%h" "${commit_list}" > $T/commits 43*515a48feSPaul E. McKenneyret=$? 44*515a48feSPaul E. McKenneyif test "${ret}" -ne 0 45*515a48feSPaul E. McKenneythen 46*515a48feSPaul E. McKenney echo "$0: Invalid commit list ('${commit_list}')." 47*515a48feSPaul E. McKenney exit 2 48*515a48feSPaul E. McKenneyfi 49*515a48feSPaul E. McKenneysha1_list=`cat $T/commits` 50*515a48feSPaul E. McKenney 51*515a48feSPaul E. McKenneyshift 52*515a48feSPaul E. McKenneyshift 53*515a48feSPaul E. McKenney 54*515a48feSPaul E. McKenneyRCUTORTURE="`pwd`/tools/testing/selftests/rcutorture"; export RCUTORTURE 55*515a48feSPaul E. McKenneyPATH=${RCUTORTURE}/bin:$PATH; export PATH 56*515a48feSPaul E. McKenney. functions.sh 57*515a48feSPaul E. McKenney 58*515a48feSPaul E. McKenneyret=0 59*515a48feSPaul E. McKenneynfail=0 60*515a48feSPaul E. McKenneynsuccess=0 61*515a48feSPaul E. McKenneyfaillist= 62*515a48feSPaul E. McKenneysuccesslist= 63*515a48feSPaul E. McKenneycursha1="`git rev-parse --abbrev-ref HEAD`" 64*515a48feSPaul E. McKenneyds="`date +%Y.%m.%d-%H.%M.%S`-series" 65*515a48feSPaul E. McKenneystartdate="`date`" 66*515a48feSPaul E. McKenneystarttime="`get_starttime`" 67*515a48feSPaul E. McKenney 68*515a48feSPaul E. McKenneyecho " --- " $scriptname $args | tee -a $T/log 69*515a48feSPaul E. McKenneyecho " --- Results directory: " $ds | tee -a $T/log 70*515a48feSPaul E. McKenney 71*515a48feSPaul E. McKenneyfor config in ${config_list} 72*515a48feSPaul E. McKenneydo 73*515a48feSPaul E. McKenney sha_n=0 74*515a48feSPaul E. McKenney for sha in ${sha1_list} 75*515a48feSPaul E. McKenney do 76*515a48feSPaul E. McKenney sha1=${sha_n}.${sha} # Enable "sort -k1nr" to list commits in order. 77*515a48feSPaul E. McKenney echo Starting ${config}/${sha1} at `date` | tee -a $T/log 78*515a48feSPaul E. McKenney git checkout "${sha}" 79*515a48feSPaul E. McKenney time tools/testing/selftests/rcutorture/bin/kvm.sh --configs "$config" --datestamp "$ds/${config}/${sha1}" --duration 1 "$@" 80*515a48feSPaul E. McKenney curret=$? 81*515a48feSPaul E. McKenney if test "${curret}" -ne 0 82*515a48feSPaul E. McKenney then 83*515a48feSPaul E. McKenney nfail=$((nfail+1)) 84*515a48feSPaul E. McKenney faillist="$faillist ${config}/${sha1}(${curret})" 85*515a48feSPaul E. McKenney else 86*515a48feSPaul E. McKenney nsuccess=$((nsuccess+1)) 87*515a48feSPaul E. McKenney successlist="$successlist ${config}/${sha1}" 88*515a48feSPaul E. McKenney # Successful run, so remove large files. 89*515a48feSPaul E. McKenney rm -f ${RCUTORTURE}/$ds/${config}/${sha1}/{vmlinux,bzImage,System.map,Module.symvers} 90*515a48feSPaul E. McKenney fi 91*515a48feSPaul E. McKenney if test "${ret}" -eq 0 92*515a48feSPaul E. McKenney then 93*515a48feSPaul E. McKenney ret=${curret} 94*515a48feSPaul E. McKenney fi 95*515a48feSPaul E. McKenney sha_n=$((sha_n+1)) 96*515a48feSPaul E. McKenney done 97*515a48feSPaul E. McKenneydone 98*515a48feSPaul E. McKenneygit checkout "${cursha1}" 99*515a48feSPaul E. McKenney 100*515a48feSPaul E. McKenneyecho ${nsuccess} SUCCESSES: | tee -a $T/log 101*515a48feSPaul E. McKenneyecho ${successlist} | fmt | tee -a $T/log 102*515a48feSPaul E. McKenneyecho | tee -a $T/log 103*515a48feSPaul E. McKenneyecho ${nfail} FAILURES: | tee -a $T/log 104*515a48feSPaul E. McKenneyecho ${faillist} | fmt | tee -a $T/log 105*515a48feSPaul E. McKenneyif test -n "${faillist}" 106*515a48feSPaul E. McKenneythen 107*515a48feSPaul E. McKenney echo | tee -a $T/log 108*515a48feSPaul E. McKenney echo Failures across commits: | tee -a $T/log 109*515a48feSPaul E. McKenney echo ${faillist} | tr ' ' '\012' | sed -e 's,^[^/]*/,,' -e 's/([0-9]*)//' | 110*515a48feSPaul E. McKenney sort | uniq -c | sort -k2n | tee -a $T/log 111*515a48feSPaul E. McKenneyfi 112*515a48feSPaul E. McKenneyecho Started at $startdate, ended at `date`, duration `get_starttime_duration $starttime`. | tee -a $T/log 113*515a48feSPaul E. McKenneyecho Summary: Successes: ${nsuccess} Failures: ${nfail} | tee -a $T/log 114*515a48feSPaul E. McKenneycp $T/log tools/testing/selftests/rcutorture/res/${ds} 115*515a48feSPaul E. McKenney 116*515a48feSPaul E. McKenneyexit "${ret}" 117