From 8f58e4babeecd6606f4c9729919cc85c470bc422 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Sat, 17 Oct 2020 20:00:45 +0200 Subject: pkg/bisect: switch to kconfig.Minimize Use the new kconfig.Minimize for config minization instead of the config-bisect.pl script. This is mostly just deleting code. Also update tests: - minimization is now supposed to test the baseline config (update "testos" stub accordingly) - minimization is not supposed to return a config that does not build (a reasonable config minimization procedure can't arrive to such config), remove test that tests this Update #2171 --- pkg/bisect/bisect.go | 45 ++++++++------------------------------------- 1 file changed, 8 insertions(+), 37 deletions(-) (limited to 'pkg/bisect/bisect.go') diff --git a/pkg/bisect/bisect.go b/pkg/bisect/bisect.go index 75b6450d8..9360bbab1 100644 --- a/pkg/bisect/bisect.go +++ b/pkg/bisect/bisect.go @@ -4,13 +4,13 @@ package bisect import ( - "bytes" "fmt" "io" "path/filepath" "time" "github.com/google/syzkaller/pkg/build" + "github.com/google/syzkaller/pkg/hash" "github.com/google/syzkaller/pkg/instance" "github.com/google/syzkaller/pkg/mgrconfig" "github.com/google/syzkaller/pkg/osutil" @@ -287,53 +287,24 @@ func (env *env) bisect() (*Result, error) { } func (env *env) minimizeConfig() (*testResult, error) { - cfg := env.cfg - // Check if crash reproduces with baseline config. - env.kernelConfig = cfg.Kernel.BaselineConfig - testRes, err := env.test() - if err != nil { - env.log("testing baseline config failed: %v", err) - env.kernelConfig = cfg.Kernel.Config - return nil, err - } - if testRes.verdict == vcs.BisectBad { - env.log("crash reproduces with baseline config") - return testRes, nil - } - if testRes.verdict == vcs.BisectSkip { - env.log("unable to test using baseline config, keep original config") - env.kernelConfig = cfg.Kernel.Config - return nil, nil - } + // Find minimal configuration based on baseline to reproduce the crash. + testResults := make(map[hash.Sig]*testResult) predMinimize := func(test []byte) (vcs.BisectResult, error) { env.kernelConfig = test testRes, err := env.test() if err != nil { return 0, err } + testResults[hash.Hash(test)] = testRes return testRes.verdict, err } - // Find minimal configuration based on baseline to reproduce the crash. - env.kernelConfig, err = env.minimizer.Minimize(cfg.Kernel.Config, - cfg.Kernel.BaselineConfig, cfg.Trace, predMinimize) + minConfig, err := env.minimizer.Minimize(env.cfg.Kernel.Config, + env.cfg.Kernel.BaselineConfig, env.cfg.Trace, predMinimize) if err != nil { - env.log("minimizing config failed: %v", err) return nil, err } - if bytes.Equal(env.kernelConfig, cfg.Kernel.Config) { - return nil, nil - } - // Check that crash is really reproduced with generated config. - testRes, err = env.test() - if err != nil { - return nil, fmt.Errorf("testing generated minimized config failed: %v", err) - } - if testRes.verdict != vcs.BisectBad { - env.log("testing with generated minimized config doesn't reproduce the crash") - env.kernelConfig = cfg.Kernel.Config - return nil, nil - } - return testRes, nil + env.kernelConfig = minConfig + return testResults[hash.Hash(minConfig)], nil } func (env *env) detectNoopChange(results map[string]*testResult, com *vcs.Commit) (bool, error) { -- cgit mrf-deployment