From b4056f6cfcfee54a6aecd7322518a95d941bbdc0 Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Tue, 16 Jan 2024 16:17:48 +0100 Subject: syz-ci: limit fuzzing of old kernel images Introduce a new manager config -- the maximum allowed (non-)freshness of the kernel image that we fuzz. Once the kernel image is old enough and we're unable to build a newer version, don't start the instance. Enforce the restriction only after we have tried to build a newer kernel and failed. --- syz-ci/manager.go | 11 +++++++++++ syz-ci/syz-ci.go | 11 +++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/syz-ci/manager.go b/syz-ci/manager.go index dfa6940b5..c19c4cb52 100644 --- a/syz-ci/manager.go +++ b/syz-ci/manager.go @@ -88,6 +88,7 @@ type Manager struct { stop chan struct{} debug bool lastBuild *dashapi.Build + buildFailed bool } type ManagerDashapi interface { @@ -241,6 +242,7 @@ loop: func (mgr *Manager) pollAndBuild(lastCommit string, latestInfo *BuildInfo) ( string, *BuildInfo, time.Duration) { + var success bool rebuildAfter := buildRetryPeriod commit, err := mgr.repo.Poll(mgr.mgrcfg.Repo, mgr.mgrcfg.Branch) if err != nil { @@ -263,6 +265,8 @@ func (mgr *Manager) pollAndBuild(lastCommit string, latestInfo *BuildInfo) ( latestInfo = mgr.checkLatest() if latestInfo == nil { mgr.Errorf("failed to read build info after build") + } else { + success = true } } buildSem.Signal() @@ -270,6 +274,7 @@ func (mgr *Manager) pollAndBuild(lastCommit string, latestInfo *BuildInfo) ( } } } + mgr.buildFailed = !success return lastCommit, latestInfo, rebuildAfter } @@ -410,6 +415,12 @@ func (mgr *Manager) restartManager() { mgr.Errorf("failed to upload build: %v", err) return } + daysSinceCommit := time.Since(info.KernelCommitDate).Hours() / 24 + if mgr.buildFailed && daysSinceCommit > float64(mgr.mgrcfg.MaxKernelLagDays) { + mgr.Errorf("the kernel is now too old (%.1f days since last commit), fuzzing is stopped", + daysSinceCommit) + return + } cfgFile, err := mgr.writeConfig(buildTag) if err != nil { mgr.Errorf("failed to create manager config: %v", err) diff --git a/syz-ci/syz-ci.go b/syz-ci/syz-ci.go index 138bf2104..ae6ff0f87 100644 --- a/syz-ci/syz-ci.go +++ b/syz-ci/syz-ci.go @@ -199,9 +199,13 @@ type ManagerConfig struct { Jobs ManagerJobs `json:"jobs"` // Extra commits to cherry pick to older kernel revisions. BisectBackports []vcs.BackportCommit `json:"bisect_backports"` - + // Base syz-manager config for the instance. ManagerConfig json.RawMessage `json:"manager_config"` - managercfg *mgrconfig.Config + // If the kernel's commit is older than MaxKernelLagDays days, + // fuzzing won't be started on this instance. + // By default it's 30 days. + MaxKernelLagDays int + managercfg *mgrconfig.Config } type ManagerJobs struct { @@ -444,6 +448,9 @@ func loadManagerConfig(cfg *Config, mgr *ManagerConfig) error { if mgr.KernelConfig != "" && mgr.KernelBaselineConfig == "" { mgr.KernelBaselineConfig = inferBaselineConfig(mgr.KernelConfig) } + if mgr.MaxKernelLagDays == 0 { + mgr.MaxKernelLagDays = 30 + } if err := mgr.validate(cfg); err != nil { return err } -- cgit mrf-deployment