From: Scott Wood <o...@buserror.net> Add a friendly, git-bisect-like frontend to config-bisect.pl. Unlike ktest.pl, this frontend requires no configuration beyond specifying the kernel output directory and (if cross-compiling) $ARCH, and does not need to run continuously for the entire bisection (and thus can be used to bisect on the machine testing the kernels).
Signed-off-by: Scott Wood <sw...@redhat.com> --- Is the ktest directory the right place for this, or should it (along with config-bisect.pl) go elsewhere since it no longer depends on the ktest infrastructure? If so, where? tools/testing/ktest/config-bisect.sh | 120 +++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100755 tools/testing/ktest/config-bisect.sh diff --git a/tools/testing/ktest/config-bisect.sh b/tools/testing/ktest/config-bisect.sh new file mode 100755 index 000000000000..6032e6736109 --- /dev/null +++ b/tools/testing/ktest/config-bisect.sh @@ -0,0 +1,120 @@ +#!/bin/bash + +BACKEND=$(dirname $BASH_SOURCE)/config-bisect.pl + +usage() { + echo Usage: + echo "$0 <outputdir> command [args]" + echo commands: + echo reset + echo init + echo diff + echo bad [conf] + echo good [conf] + echo skip + echo If conf is unspecified, \".config\" is used. + echo If cross-compiling, pass the ARCH environment variable. +} + +reset() { + rm -rf $STATE +} + +init() { + reset + mkdir -p $STATE/bad + mkdir -p $STATE/good + echo 0 > $STATE/good/idx + echo 0 > $STATE/bad/idx +} + +next() { + if ! [ -d $STATE ]; then + echo $0: No config-bisect in progress -- initializing + init + fi + + IDX=$(cat $STATE/$1/idx) + IDX=$(expr $IDX + 1) + + CONF=$2 + if [ -z "$CONF" ]; then + CONF=$O/.config + fi + + cp $CONF $STATE/$1/$IDX + echo $IDX > $STATE/$1/idx +} + +show_diff() { + GI=$(cat $STATE/good/idx) + BI=$(cat $STATE/bad/idx) + + if [ $GI != 0 ] && [ $BI != 0 ]; then + diff -u $STATE/good/$GI $STATE/bad/$BI + else + echo $0: cannot diff without at least one good and one bad + fi +} + +genconf() { + GI=$(cat $STATE/good/idx) + BI=$(cat $STATE/bad/idx) + + echo good index $GI, bad index $BI + + if [ $GI != 0 ] && [ $BI != 0 ]; then + $BACKEND $O $STATE/good/$GI $STATE/bad/$BI + + case $? in + 0) + ;; + 2) + echo Failing config diff: + show_diff + ;; + *) + echo $0: error in backend + exit 1; + ;; + esac + fi +} + +if [ -z "$1" -o -z "$2" ]; then + usage + exit 1 +fi + +O=$1 +STATE=$O/.config-bisect + +case $2 in +init) + init + ;; +reset) + reset + ;; +diff) + show_diff + ;; +bad) + next bad $3 + genconf + ;; +good) + next good $3 + genconf + ;; +skip) + # The options chosen are randomized, so we'll get a different + # config just by re-running the config bisect backend with the + # same inputs. + genconf + ;; +*) + usage + exit 1 + ;; +esac -- 2.9.4