aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pkg/bisect/bisect.go36
-rw-r--r--pkg/bisect/bisect_test.go4
-rw-r--r--pkg/build/android.go6
-rw-r--r--pkg/build/build.go10
-rw-r--r--pkg/build/cuttlefish.go6
-rw-r--r--pkg/build/darwin.go2
-rw-r--r--pkg/build/freebsd.go6
-rw-r--r--pkg/build/fuchsia.go2
-rw-r--r--pkg/build/gvisor.go2
-rw-r--r--pkg/build/linux.go19
-rw-r--r--pkg/build/netbsd.go4
-rw-r--r--pkg/build/openbsd.go2
-rw-r--r--pkg/build/test.go2
-rw-r--r--pkg/instance/instance.go35
-rw-r--r--syz-ci/jobs.go23
-rw-r--r--tools/syz-testbuild/testbuild.go12
16 files changed, 93 insertions, 78 deletions
diff --git a/pkg/bisect/bisect.go b/pkg/bisect/bisect.go
index 9515126dc..a0dd29bb5 100644
--- a/pkg/bisect/bisect.go
+++ b/pkg/bisect/bisect.go
@@ -101,7 +101,8 @@ type env struct {
// can allows us to.
flaky bool
// A cache of already performed revision tests.
- results map[string]*testResult
+ results map[string]*testResult
+ buildCfg instance.BuildKernelConfig
}
const MaxNumTests = 20 // number of tests we do per commit
@@ -173,6 +174,17 @@ func runImpl(cfg *Config, repo vcs.Repo, inst instance.Env) (*Result, error) {
inst: inst,
startTime: time.Now(),
confidence: 1.0,
+ buildCfg: instance.BuildKernelConfig{
+ CompilerBin: cfg.DefaultCompiler,
+ MakeBin: cfg.Make,
+ LinkerBin: cfg.Linker,
+ CcacheBin: cfg.Ccache,
+ UserspaceDir: cfg.Kernel.Userspace,
+ CmdlineFile: cfg.Kernel.Cmdline,
+ SysctlFile: cfg.Kernel.Sysctl,
+ KernelConfig: cfg.Kernel.Config,
+ BuildCPUs: cfg.BuildCPUs,
+ },
}
head, err := repo.HeadCommit()
if err != nil {
@@ -242,8 +254,7 @@ func (env *env) bisect() (*Result, error) {
}
cfg := env.cfg
- if err := build.Clean(cfg.Manager.TargetOS, cfg.Manager.TargetVMArch,
- cfg.Manager.Type, cfg.Manager.KernelSrc); err != nil {
+ if err := env.inst.CleanKernel(&env.buildCfg); err != nil {
return nil, fmt.Errorf("kernel clean failed: %w", err)
}
env.logf("building syzkaller on %v", cfg.Syzkaller.Commit)
@@ -606,22 +617,13 @@ func (env *env) build() (*vcs.Commit, string, error) {
}
env.logf("testing commit %v %v", current.Hash, env.cfg.CompilerType)
buildStart := time.Now()
- mgr := env.cfg.Manager
- if err := build.Clean(mgr.TargetOS, mgr.TargetVMArch, mgr.Type, mgr.KernelSrc); err != nil {
+ buildCfg := env.buildCfg
+ buildCfg.CompilerBin = bisectEnv.Compiler
+ buildCfg.KernelConfig = bisectEnv.KernelConfig
+ if err := env.inst.CleanKernel(&buildCfg); err != nil {
return current, "", fmt.Errorf("kernel clean failed: %w", err)
}
- kern := &env.cfg.Kernel
- _, imageDetails, err := env.inst.BuildKernel(&instance.BuildKernelConfig{
- CompilerBin: bisectEnv.Compiler,
- MakeBin: env.cfg.Make,
- LinkerBin: env.cfg.Linker,
- CcacheBin: env.cfg.Ccache,
- UserspaceDir: kern.Userspace,
- CmdlineFile: kern.Cmdline,
- SysctlFile: kern.Sysctl,
- KernelConfig: bisectEnv.KernelConfig,
- BuildCPUs: env.cfg.BuildCPUs,
- })
+ _, imageDetails, err := env.inst.BuildKernel(&buildCfg)
if imageDetails.CompilerID != "" {
env.logf("compiler: %v", imageDetails.CompilerID)
}
diff --git a/pkg/bisect/bisect_test.go b/pkg/bisect/bisect_test.go
index cb5e51c5b..6731eb235 100644
--- a/pkg/bisect/bisect_test.go
+++ b/pkg/bisect/bisect_test.go
@@ -35,6 +35,10 @@ func (env *testEnv) BuildSyzkaller(repo, commit string) (string, error) {
return "", nil
}
+func (env *testEnv) CleanKernel(buildCfg *instance.BuildKernelConfig) error {
+ return nil
+}
+
func (env *testEnv) BuildKernel(buildCfg *instance.BuildKernelConfig) (string, build.ImageDetails, error) {
commit := env.headCommit()
configHash := hash.String(buildCfg.KernelConfig)
diff --git a/pkg/build/android.go b/pkg/build/android.go
index be6301be0..e5f19a451 100644
--- a/pkg/build/android.go
+++ b/pkg/build/android.go
@@ -179,11 +179,11 @@ func (a android) embedImages(w io.Writer, srcDir string, imageNames ...string) e
return nil
}
-func (a android) clean(kernelDir, targetArch string) error {
- if err := osutil.RemoveAll(filepath.Join(kernelDir, "out")); err != nil {
+func (a android) clean(params Params) error {
+ if err := osutil.RemoveAll(filepath.Join(params.KernelDir, "out")); err != nil {
return fmt.Errorf("failed to clean 'out' directory: %w", err)
}
- if err := osutil.RemoveAll(filepath.Join(kernelDir, "dist")); err != nil {
+ if err := osutil.RemoveAll(filepath.Join(params.KernelDir, "dist")); err != nil {
return fmt.Errorf("failed to clean 'dist' directory: %w", err)
}
return nil
diff --git a/pkg/build/build.go b/pkg/build/build.go
index 764cc1ed5..b84adb20b 100644
--- a/pkg/build/build.go
+++ b/pkg/build/build.go
@@ -23,7 +23,7 @@ import (
"github.com/google/syzkaller/sys/targets"
)
-// Params is input arguments for the Image function.
+// Params is input arguments for the Image and Clean functions.
type Params struct {
TargetOS string
TargetArch string
@@ -113,12 +113,12 @@ func Image(params Params) (details ImageDetails, err error) {
return
}
-func Clean(targetOS, targetArch, vmType, kernelDir string) error {
- builder, err := getBuilder(targetOS, targetArch, vmType)
+func Clean(params Params) error {
+ builder, err := getBuilder(params.TargetOS, params.TargetArch, params.VMType)
if err != nil {
return err
}
- return builder.clean(kernelDir, targetArch)
+ return builder.clean(params)
}
type KernelError struct {
@@ -146,7 +146,7 @@ func (e InfraError) Error() string {
type builder interface {
build(params Params) (ImageDetails, error)
- clean(kernelDir, targetArch string) error
+ clean(params Params) error
}
func getBuilder(targetOS, targetArch, vmType string) (builder, error) {
diff --git a/pkg/build/cuttlefish.go b/pkg/build/cuttlefish.go
index bf345c2bc..18e1df178 100644
--- a/pkg/build/cuttlefish.go
+++ b/pkg/build/cuttlefish.go
@@ -165,9 +165,9 @@ func (c cuttlefish) build(params Params) (ImageDetails, error) {
return details, nil
}
-func (c cuttlefish) clean(kernelDir, targetArch string) error {
- if err := osutil.RemoveAll(filepath.Join(kernelDir, "out")); err != nil {
+func (c cuttlefish) clean(params Params) error {
+ if err := osutil.RemoveAll(filepath.Join(params.KernelDir, "out")); err != nil {
return err
}
- return osutil.RemoveAll(filepath.Join(kernelDir, "dist"))
+ return osutil.RemoveAll(filepath.Join(params.KernelDir, "dist"))
}
diff --git a/pkg/build/darwin.go b/pkg/build/darwin.go
index fbfbc0adc..93aff6925 100644
--- a/pkg/build/darwin.go
+++ b/pkg/build/darwin.go
@@ -14,7 +14,7 @@ func (ctx darwin) build(params Params) (ImageDetails, error) {
return ImageDetails{}, fmt.Errorf("pkg/build: darwin.build not implemented")
}
-func (ctx darwin) clean(kernelDir, targetArch string) error {
+func (ctx darwin) clean(params Params) error {
// TODO(HerrSpace): Implement this.
return fmt.Errorf("pkg/build: darwin.build not implemented")
}
diff --git a/pkg/build/freebsd.go b/pkg/build/freebsd.go
index 86d6f52ef..2d8ea0f77 100644
--- a/pkg/build/freebsd.go
+++ b/pkg/build/freebsd.go
@@ -119,9 +119,9 @@ sudo mdconfig -d -u ${md#md}
return ImageDetails{}, nil
}
-func (ctx freebsd) clean(kernelDir, targetArch string) error {
- objPrefix := filepath.Join(kernelDir, "obj")
- _, err := ctx.make(kernelDir, objPrefix, runtime.NumCPU(), "cleanworld")
+func (ctx freebsd) clean(params Params) error {
+ objPrefix := filepath.Join(params.KernelDir, "obj")
+ _, err := ctx.make(params.KernelDir, objPrefix, runtime.NumCPU(), "cleanworld")
return err
}
diff --git a/pkg/build/fuchsia.go b/pkg/build/fuchsia.go
index 759d6b842..c33bfab12 100644
--- a/pkg/build/fuchsia.go
+++ b/pkg/build/fuchsia.go
@@ -94,7 +94,7 @@ func (fu fuchsia) build(params Params) (ImageDetails, error) {
return ImageDetails{}, nil
}
-func (fu fuchsia) clean(kernelDir, targetArch string) error {
+func (fu fuchsia) clean(params Params) error {
// We always do clean build because incremental build is frequently broken.
// So no need to clean separately.
return nil
diff --git a/pkg/build/gvisor.go b/pkg/build/gvisor.go
index 49d78f2c7..077932938 100644
--- a/pkg/build/gvisor.go
+++ b/pkg/build/gvisor.go
@@ -95,7 +95,7 @@ func (gvisor gvisor) build(params Params) (ImageDetails, error) {
return ImageDetails{}, osutil.CopyFile(outBinary, filepath.Join(params.OutputDir, "obj", sysTarget.KernelObject))
}
-func (gvisor) clean(kernelDir, targetArch string) error {
+func (gvisor) clean(params Params) error {
// Let's assume that bazel always properly handles build without cleaning (until proven otherwise).
return nil
}
diff --git a/pkg/build/linux.go b/pkg/build/linux.go
index 5728005da..73baed5d8 100644
--- a/pkg/build/linux.go
+++ b/pkg/build/linux.go
@@ -14,7 +14,6 @@ import (
"path"
"path/filepath"
"regexp"
- "runtime"
"time"
"github.com/google/syzkaller/pkg/debugtracer"
@@ -141,8 +140,8 @@ func (linux) createImage(params Params, kernelPath string) error {
return nil
}
-func (linux) clean(kernelDir, targetArch string) error {
- return runMakeImpl(targetArch, "", "", "", "", kernelDir, runtime.NumCPU(), []string{"distclean"})
+func (linux) clean(params Params) error {
+ return runMake(params, "distclean")
}
func (linux) writeFile(file string, data []byte) error {
@@ -152,10 +151,11 @@ func (linux) writeFile(file string, data []byte) error {
return osutil.SandboxChown(file)
}
-func runMakeImpl(arch, compiler, linker, ccache, makeBin, kernelDir string, jobs int, extraArgs []string) error {
- target := targets.Get(targets.Linux, arch)
- args := LinuxMakeArgs(target, compiler, linker, ccache, "", jobs)
+func runMake(params Params, extraArgs ...string) error {
+ target := targets.Get(targets.Linux, params.TargetArch)
+ args := LinuxMakeArgs(target, params.Compiler, params.Linker, params.Ccache, "", params.BuildCPUs)
args = append(args, extraArgs...)
+ makeBin := params.Make
if makeBin == "" {
makeBin = "make"
}
@@ -163,7 +163,7 @@ func runMakeImpl(arch, compiler, linker, ccache, makeBin, kernelDir string, jobs
if err := osutil.Sandbox(cmd, true, true); err != nil {
return err
}
- cmd.Dir = kernelDir
+ cmd.Dir = params.KernelDir
cmd.Env = append([]string{}, os.Environ()...)
// This makes the build [more] deterministic:
// 2 builds from the same sources should result in the same vmlinux binary.
@@ -181,11 +181,6 @@ func runMakeImpl(arch, compiler, linker, ccache, makeBin, kernelDir string, jobs
return err
}
-func runMake(params Params, extraArgs ...string) error {
- return runMakeImpl(params.TargetArch, params.Compiler, params.Linker,
- params.Ccache, params.Make, params.KernelDir, params.BuildCPUs, extraArgs)
-}
-
func LinuxMakeArgs(target *targets.Target, compiler, linker, ccache, buildDir string, jobs int) []string {
args := []string{
"-j", fmt.Sprint(jobs),
diff --git a/pkg/build/netbsd.go b/pkg/build/netbsd.go
index 567fa122c..8a6c4d216 100644
--- a/pkg/build/netbsd.go
+++ b/pkg/build/netbsd.go
@@ -86,8 +86,8 @@ func (ctx netbsd) build(params Params) (ImageDetails, error) {
filepath.Join(compileDir, "netbsd"))
}
-func (ctx netbsd) clean(kernelDir, targetArch string) error {
- _, err := osutil.RunCmd(10*time.Minute, kernelDir, "./build.sh", "-m", targetArch,
+func (ctx netbsd) clean(params Params) error {
+ _, err := osutil.RunCmd(10*time.Minute, params.KernelDir, "./build.sh", "-m", params.TargetArch,
"-U", "-j"+strconv.Itoa(runtime.NumCPU()), "cleandir")
return err
}
diff --git a/pkg/build/openbsd.go b/pkg/build/openbsd.go
index bcc16dc8c..fb94b8a60 100644
--- a/pkg/build/openbsd.go
+++ b/pkg/build/openbsd.go
@@ -54,7 +54,7 @@ func (ctx openbsd) build(params Params) (ImageDetails, error) {
return ImageDetails{}, nil
}
-func (ctx openbsd) clean(kernelDir, targetArch string) error {
+func (ctx openbsd) clean(params Params) error {
// Building clean is fast enough and incremental builds in face of
// changing config files don't work. Instead of optimizing for the
// case where humans have to think, let's bludgeon it with a
diff --git a/pkg/build/test.go b/pkg/build/test.go
index a4f59d562..248bfe248 100644
--- a/pkg/build/test.go
+++ b/pkg/build/test.go
@@ -9,6 +9,6 @@ func (tb test) build(params Params) (ImageDetails, error) {
return ImageDetails{}, nil
}
-func (tb test) clean(string, string) error {
+func (tb test) clean(Params) error {
return nil
}
diff --git a/pkg/instance/instance.go b/pkg/instance/instance.go
index e1e222a3f..b21bbed9e 100644
--- a/pkg/instance/instance.go
+++ b/pkg/instance/instance.go
@@ -30,6 +30,7 @@ import (
type Env interface {
BuildSyzkaller(string, string) (string, error)
+ CleanKernel(*BuildKernelConfig) error
BuildKernel(*BuildKernelConfig) (string, build.ImageDetails, error)
Test(numVMs int, reproSyz, reproOpts, reproC []byte) ([]EnvTestResult, error)
}
@@ -135,19 +136,13 @@ func (env *env) BuildSyzkaller(repoURL, commit string) (string, error) {
return buildLog, nil
}
-func (env *env) BuildKernel(buildCfg *BuildKernelConfig) (
- string, build.ImageDetails, error) {
- if env.buildSem != nil {
- env.buildSem.Wait()
- defer env.buildSem.Signal()
- }
- imageDir := filepath.Join(env.cfg.Workdir, "image")
- params := build.Params{
+func (env *env) buildParamsFromCfg(buildCfg *BuildKernelConfig) build.Params {
+ return build.Params{
TargetOS: env.cfg.TargetOS,
TargetArch: env.cfg.TargetVMArch,
VMType: env.cfg.Type,
KernelDir: env.cfg.KernelSrc,
- OutputDir: imageDir,
+ OutputDir: filepath.Join(env.cfg.Workdir, "image"),
Make: buildCfg.MakeBin,
Compiler: buildCfg.CompilerBin,
Linker: buildCfg.LinkerBin,
@@ -158,20 +153,38 @@ func (env *env) BuildKernel(buildCfg *BuildKernelConfig) (
Config: buildCfg.KernelConfig,
BuildCPUs: buildCfg.BuildCPUs,
}
+}
+
+func (env *env) BuildKernel(buildCfg *BuildKernelConfig) (
+ string, build.ImageDetails, error) {
+ if env.buildSem != nil {
+ env.buildSem.Wait()
+ defer env.buildSem.Signal()
+ }
+ params := env.buildParamsFromCfg(buildCfg)
details, err := build.Image(params)
if err != nil {
return "", details, err
}
- if err := SetConfigImage(env.cfg, imageDir, true); err != nil {
+ if err := SetConfigImage(env.cfg, params.OutputDir, true); err != nil {
return "", details, err
}
- kernelConfigFile := filepath.Join(imageDir, "kernel.config")
+ kernelConfigFile := filepath.Join(params.OutputDir, "kernel.config")
if !osutil.IsExist(kernelConfigFile) {
kernelConfigFile = ""
}
return kernelConfigFile, details, nil
}
+func (env *env) CleanKernel(buildCfg *BuildKernelConfig) error {
+ if env.buildSem != nil {
+ env.buildSem.Wait()
+ defer env.buildSem.Signal()
+ }
+ params := env.buildParamsFromCfg(buildCfg)
+ return build.Clean(params)
+}
+
func SetConfigImage(cfg *mgrconfig.Config, imageDir string, reliable bool) error {
cfg.KernelObj = filepath.Join(imageDir, "obj")
cfg.Image = filepath.Join(imageDir, "image")
diff --git a/syz-ci/jobs.go b/syz-ci/jobs.go
index 91ef57f6b..0c2df74d4 100644
--- a/syz-ci/jobs.go
+++ b/syz-ci/jobs.go
@@ -622,7 +622,17 @@ func (jp *JobProcessor) testPatch(job *Job, mgrcfg *mgrconfig.Config) error {
resp.Build.KernelCommitTitle = kernelCommit.Title
resp.Build.KernelCommitDate = kernelCommit.CommitDate
- if err := build.Clean(mgrcfg.TargetOS, mgrcfg.TargetVMArch, mgrcfg.Type, mgrcfg.KernelSrc); err != nil {
+ buildCfg := &instance.BuildKernelConfig{
+ CompilerBin: mgr.mgrcfg.Compiler,
+ MakeBin: mgr.mgrcfg.Make,
+ LinkerBin: mgr.mgrcfg.Linker,
+ CcacheBin: mgr.mgrcfg.Ccache,
+ UserspaceDir: mgr.mgrcfg.Userspace,
+ CmdlineFile: mgr.mgrcfg.KernelCmdline,
+ SysctlFile: mgr.mgrcfg.KernelSysctl,
+ KernelConfig: req.KernelConfig,
+ }
+ if err := env.CleanKernel(buildCfg); err != nil {
return fmt.Errorf("kernel clean failed: %w", err)
}
if len(req.Patch) != 0 {
@@ -643,16 +653,7 @@ func (jp *JobProcessor) testPatch(job *Job, mgrcfg *mgrconfig.Config) error {
[]byte("# CONFIG_DEBUG_INFO_BTF is not set"), -1)
log.Logf(0, "job: building kernel...")
- kernelConfig, details, err := env.BuildKernel(&instance.BuildKernelConfig{
- CompilerBin: mgr.mgrcfg.Compiler,
- MakeBin: mgr.mgrcfg.Make,
- LinkerBin: mgr.mgrcfg.Linker,
- CcacheBin: mgr.mgrcfg.Ccache,
- UserspaceDir: mgr.mgrcfg.Userspace,
- CmdlineFile: mgr.mgrcfg.KernelCmdline,
- SysctlFile: mgr.mgrcfg.KernelSysctl,
- KernelConfig: req.KernelConfig,
- })
+ kernelConfig, details, err := env.BuildKernel(buildCfg)
resp.Build.CompilerID = details.CompilerID
if err != nil {
return err
diff --git a/tools/syz-testbuild/testbuild.go b/tools/syz-testbuild/testbuild.go
index b7d4af6fc..919ee0c67 100644
--- a/tools/syz-testbuild/testbuild.go
+++ b/tools/syz-testbuild/testbuild.go
@@ -30,7 +30,6 @@ import (
"os"
"runtime"
- "github.com/google/syzkaller/pkg/build"
"github.com/google/syzkaller/pkg/instance"
"github.com/google/syzkaller/pkg/mgrconfig"
"github.com/google/syzkaller/pkg/osutil"
@@ -131,10 +130,7 @@ func test(repo vcs.Repo, bisecter vcs.Bisecter, kernelConfig []byte, env instanc
tool.Fail(err)
}
log.Printf("testing: %v %v using %v", com.Hash, com.Title, bisectEnv.Compiler)
- if err := build.Clean(*flagOS, *flagArch, vmType, *flagKernelSrc); err != nil {
- tool.Fail(err)
- }
- _, _, err = env.BuildKernel(&instance.BuildKernelConfig{
+ buildCfg := &instance.BuildKernelConfig{
CompilerBin: bisectEnv.Compiler,
LinkerBin: linker,
CcacheBin: ccache,
@@ -142,7 +138,11 @@ func test(repo vcs.Repo, bisecter vcs.Bisecter, kernelConfig []byte, env instanc
CmdlineFile: *flagKernelCmdline,
SysctlFile: *flagKernelSysctl,
KernelConfig: bisectEnv.KernelConfig,
- })
+ }
+ if err := env.CleanKernel(buildCfg); err != nil {
+ tool.Fail(err)
+ }
+ _, _, err = env.BuildKernel(buildCfg)
if err != nil {
var verr *osutil.VerboseError
if errors.As(err, &verr) {