From d922ca7efda29b23dfb85abe37aee1641c4fbe05 Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Wed, 19 Jul 2023 14:14:10 +0200 Subject: syz-ci: specify per-manager bisection backports It might be the case that the kernels that are being fuzzed on syz-ci require their own backports to build/test older revisions during bisection. Let users specify it in the syz-ci config. --- pkg/bisect/bisect.go | 7 ++++++- pkg/vcs/linux.go | 3 ++- pkg/vcs/testos.go | 1 + pkg/vcs/vcs.go | 3 ++- syz-ci/jobs.go | 1 + syz-ci/syz-ci.go | 3 +++ tools/syz-bisect/bisect.go | 8 +++++--- tools/syz-testbuild/testbuild.go | 2 +- 8 files changed, 21 insertions(+), 7 deletions(-) diff --git a/pkg/bisect/bisect.go b/pkg/bisect/bisect.go index dab1cb27c..cd20cca07 100644 --- a/pkg/bisect/bisect.go +++ b/pkg/bisect/bisect.go @@ -58,6 +58,8 @@ type KernelConfig struct { // this minimized one. BaselineConfig []byte Userspace string + // Extra commits to cherry pick to older kernel revisions. + Backports []vcs.BackportCommit } type SyzkallerConfig struct { @@ -566,7 +568,10 @@ func (env *env) build() (*vcs.Commit, string, error) { } bisectEnv, err := env.bisecter.EnvForCommit( - env.cfg.DefaultCompiler, env.cfg.CompilerType, env.cfg.BinDir, current.Hash, env.kernelConfig) + env.cfg.DefaultCompiler, env.cfg.CompilerType, + env.cfg.BinDir, current.Hash, env.kernelConfig, + env.cfg.Kernel.Backports, + ) if err != nil { return current, "", err } diff --git a/pkg/vcs/linux.go b/pkg/vcs/linux.go index 16e1c79fa..589c300b8 100644 --- a/pkg/vcs/linux.go +++ b/pkg/vcs/linux.go @@ -139,6 +139,7 @@ func gitReleaseTagToInt(tag string, includeRC bool) uint64 { func (ctx *linux) EnvForCommit( defaultCompiler, compilerType, binDir, commit string, kernelConfig []byte, + backports []BackportCommit, ) (*BisectEnv, error) { tagList, err := ctx.previousReleaseTags(commit, true, false, false) if err != nil { @@ -167,7 +168,7 @@ func (ctx *linux) EnvForCommit( Compiler: compiler, KernelConfig: cf.Serialize(), } - err = linuxFixBackports(ctx.git) + err = linuxFixBackports(ctx.git, backports...) if err != nil { return nil, fmt.Errorf("failed to cherry pick fixes: %w", err) } diff --git a/pkg/vcs/testos.go b/pkg/vcs/testos.go index cfc34cc23..68d9eeccd 100644 --- a/pkg/vcs/testos.go +++ b/pkg/vcs/testos.go @@ -29,6 +29,7 @@ func (ctx *testos) PreviousReleaseTags(commit, compilerType string) ([]string, e func (ctx *testos) EnvForCommit( defaultCompiler, compilerType, binDir, commit string, kernelConfig []byte, + backports []BackportCommit, ) (*BisectEnv, error) { return &BisectEnv{KernelConfig: kernelConfig}, nil } diff --git a/pkg/vcs/vcs.go b/pkg/vcs/vcs.go index 9515692ea..ae2b34174 100644 --- a/pkg/vcs/vcs.go +++ b/pkg/vcs/vcs.go @@ -93,7 +93,8 @@ type Bisecter interface { IsRelease(commit string) (bool, error) - EnvForCommit(defaultCompiler, compilerType, binDir, commit string, kernelConfig []byte) (*BisectEnv, error) + EnvForCommit(defaultCompiler, compilerType, binDir, commit string, + kernelConfig []byte, backports []BackportCommit) (*BisectEnv, error) } type ConfigMinimizer interface { diff --git a/syz-ci/jobs.go b/syz-ci/jobs.go index ee62e7e03..4c10fc7b7 100644 --- a/syz-ci/jobs.go +++ b/syz-ci/jobs.go @@ -498,6 +498,7 @@ func (jp *JobProcessor) bisect(job *Job, mgrcfg *mgrconfig.Config) error { Config: req.KernelConfig, BaselineConfig: baseline, Userspace: mgr.mgrcfg.Userspace, + Backports: mgr.mgrcfg.BisectBackports, }, Syzkaller: bisect.SyzkallerConfig{ Repo: jp.cfg.SyzkallerRepo, diff --git a/syz-ci/syz-ci.go b/syz-ci/syz-ci.go index e7d75918d..94b574360 100644 --- a/syz-ci/syz-ci.go +++ b/syz-ci/syz-ci.go @@ -71,6 +71,7 @@ import ( "github.com/google/syzkaller/pkg/log" "github.com/google/syzkaller/pkg/mgrconfig" "github.com/google/syzkaller/pkg/osutil" + "github.com/google/syzkaller/pkg/vcs" ) var ( @@ -182,6 +183,8 @@ type ManagerConfig struct { // File with sysctl values (e.g. output of sysctl -a, optional). KernelSysctl string `json:"kernel_sysctl"` Jobs ManagerJobs `json:"jobs"` + // Extra commits to cherry pick to older kernel revisions. + BisectBackports []vcs.BackportCommit `json:"bisect_backports"` ManagerConfig json.RawMessage `json:"manager_config"` managercfg *mgrconfig.Config diff --git a/tools/syz-bisect/bisect.go b/tools/syz-bisect/bisect.go index e9b5f1b49..b74cf6fd8 100644 --- a/tools/syz-bisect/bisect.go +++ b/tools/syz-bisect/bisect.go @@ -62,9 +62,10 @@ type Config struct { // Sysctl/cmdline files used to build the image which was used to crash the kernel, e.g. see: // dashboard/config/upstream.sysctl // dashboard/config/upstream-selinux.cmdline - Sysctl string `json:"sysctl"` - Cmdline string `json:"cmdline"` - CrossTree bool `json:"cross_tree"` + Sysctl string `json:"sysctl"` + Cmdline string `json:"cmdline"` + CrossTree bool `json:"cross_tree"` + Backports []vcs.BackportCommit `json:"backports"` KernelConfig string `json:"kernel_config"` KernelBaselineConfig string `json:"kernel_baseline_config"` @@ -114,6 +115,7 @@ func main() { Userspace: mycfg.Userspace, Sysctl: mycfg.Sysctl, Cmdline: mycfg.Cmdline, + Backports: mycfg.Backports, }, Syzkaller: bisect.SyzkallerConfig{ Repo: mycfg.SyzkallerRepo, diff --git a/tools/syz-testbuild/testbuild.go b/tools/syz-testbuild/testbuild.go index dac89bfcc..daadff3e3 100644 --- a/tools/syz-testbuild/testbuild.go +++ b/tools/syz-testbuild/testbuild.go @@ -125,7 +125,7 @@ func main() { func test(repo vcs.Repo, bisecter vcs.Bisecter, kernelConfig []byte, env instance.Env, com *vcs.Commit) { compiler, compilerType, linker, ccache := "gcc", "gcc", "ld", "" - bisectEnv, err := bisecter.EnvForCommit(compiler, compilerType, *flagBisectBin, com.Hash, kernelConfig) + bisectEnv, err := bisecter.EnvForCommit(compiler, compilerType, *flagBisectBin, com.Hash, kernelConfig, nil) if err != nil { tool.Fail(err) } -- cgit mrf-deployment