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

Reply via email to