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 ++++++++------------------------------------- pkg/bisect/bisect_test.go | 11 +---------- 2 files changed, 9 insertions(+), 47 deletions(-) (limited to 'pkg/bisect') 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) { diff --git a/pkg/bisect/bisect_test.go b/pkg/bisect/bisect_test.go index 3bbc2e2ea..c21548a4d 100644 --- a/pkg/bisect/bisect_test.go +++ b/pkg/bisect/bisect_test.go @@ -41,7 +41,7 @@ func (env *testEnv) BuildKernel(compilerBin, cCache, userspaceDir, cmdlineFile, kernelSign = "same-sign-" + configHash } env.config = string(kernelConfig) - if env.config == "baseline-fails" || env.config == "broken-build" { + if env.config == "baseline-fails" { return "", kernelSign, fmt.Errorf("failure") } return "", kernelSign, nil @@ -184,15 +184,6 @@ var bisectionTests = []BisectionTest{ baselineConfig: "baseline-repro", resultingConfig: "baseline-repro", }, - { - name: "cause-finds-cause-baseline-broken-build", - startCommit: 905, - commitLen: 1, - expectRep: true, - culprit: 602, - baselineConfig: "baseline-broken-build", - resultingConfig: "original config", - }, { name: "cause-finds-cause-baseline-does-not-repro", startCommit: 905, -- cgit mrf-deployment