Files
linux/tools/testing/selftests/rcutorture/bin/kvm-series.sh
Paul E. McKenney 515a48fedc torture: Add kvm-series.sh to test commit/scenario combination
This commit adds a kvm-series.sh script that takes a list of scenarios and
a list of commits, and then runs each scenario on all of the commits.
A given scenario is run on all the commits before advancing to the
next scenario to minimize build times.  The successes and failures are
summarized at the end of the run.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
2025-11-06 00:03:10 +01:00

117 lines
3.2 KiB
Bash
Executable File

#!/bin/bash
# SPDX-License-Identifier: GPL-2.0+
#
# Usage: kvm-series.sh config-list commit-id-list [ kvm.sh parameters ]
#
# Tests the specified list of unadorned configs ("TREE01 SRCU-P" but not
# "CFLIST" or "3*TRACE01") and an indication of a set of commits to test,
# then runs each commit through the specified list of commits using kvm.sh.
# The runs are grouped into a -series/config/commit directory tree.
# Each run defaults to a duration of one minute.
#
# Run in top-level Linux source directory. Please note that this is in
# no way a replacement for "git bisect"!!!
#
# This script is intended to replace kvm-check-branches.sh by providing
# ease of use and faster execution.
T="`mktemp -d ${TMPDIR-/tmp}/kvm-series.sh.XXXXXX`"
trap 'rm -rf $T' 0
scriptname=$0
args="$*"
config_list="${1}"
if test -z "${config_list}"
then
echo "$0: Need a quoted list of --config arguments for first argument."
exit 1
fi
if test -z "${config_list}" || echo "${config_list}" | grep -q '\*'
then
echo "$0: Repetition ('*') not allowed in config list."
exit 1
fi
commit_list="${2}"
if test -z "${commit_list}"
then
echo "$0: Need a list of commits (e.g., HEAD^^^..) for second argument."
exit 2
fi
git log --pretty=format:"%h" "${commit_list}" > $T/commits
ret=$?
if test "${ret}" -ne 0
then
echo "$0: Invalid commit list ('${commit_list}')."
exit 2
fi
sha1_list=`cat $T/commits`
shift
shift
RCUTORTURE="`pwd`/tools/testing/selftests/rcutorture"; export RCUTORTURE
PATH=${RCUTORTURE}/bin:$PATH; export PATH
. functions.sh
ret=0
nfail=0
nsuccess=0
faillist=
successlist=
cursha1="`git rev-parse --abbrev-ref HEAD`"
ds="`date +%Y.%m.%d-%H.%M.%S`-series"
startdate="`date`"
starttime="`get_starttime`"
echo " --- " $scriptname $args | tee -a $T/log
echo " --- Results directory: " $ds | tee -a $T/log
for config in ${config_list}
do
sha_n=0
for sha in ${sha1_list}
do
sha1=${sha_n}.${sha} # Enable "sort -k1nr" to list commits in order.
echo Starting ${config}/${sha1} at `date` | tee -a $T/log
git checkout "${sha}"
time tools/testing/selftests/rcutorture/bin/kvm.sh --configs "$config" --datestamp "$ds/${config}/${sha1}" --duration 1 "$@"
curret=$?
if test "${curret}" -ne 0
then
nfail=$((nfail+1))
faillist="$faillist ${config}/${sha1}(${curret})"
else
nsuccess=$((nsuccess+1))
successlist="$successlist ${config}/${sha1}"
# Successful run, so remove large files.
rm -f ${RCUTORTURE}/$ds/${config}/${sha1}/{vmlinux,bzImage,System.map,Module.symvers}
fi
if test "${ret}" -eq 0
then
ret=${curret}
fi
sha_n=$((sha_n+1))
done
done
git checkout "${cursha1}"
echo ${nsuccess} SUCCESSES: | tee -a $T/log
echo ${successlist} | fmt | tee -a $T/log
echo | tee -a $T/log
echo ${nfail} FAILURES: | tee -a $T/log
echo ${faillist} | fmt | tee -a $T/log
if test -n "${faillist}"
then
echo | tee -a $T/log
echo Failures across commits: | tee -a $T/log
echo ${faillist} | tr ' ' '\012' | sed -e 's,^[^/]*/,,' -e 's/([0-9]*)//' |
sort | uniq -c | sort -k2n | tee -a $T/log
fi
echo Started at $startdate, ended at `date`, duration `get_starttime_duration $starttime`. | tee -a $T/log
echo Summary: Successes: ${nsuccess} Failures: ${nfail} | tee -a $T/log
cp $T/log tools/testing/selftests/rcutorture/res/${ds}
exit "${ret}"