diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2024-04-16 11:16:23 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2024-04-22 13:16:11 +0000 |
| commit | 7c35019920784b8d86f15d0fd5647a18c9b74115 (patch) | |
| tree | 2312ae8dd1af7a6a72a3ef82c709596df02a2c99 /syz-manager | |
| parent | 18eaba3335a6ce7cf26a20fab0021f0c925d1ed6 (diff) | |
syz-manager: refactor filtered coverage updates
Simplify code. It does not belong to rpc handler.
Diffstat (limited to 'syz-manager')
| -rw-r--r-- | syz-manager/http.go | 2 | ||||
| -rw-r--r-- | syz-manager/manager.go | 18 | ||||
| -rw-r--r-- | syz-manager/rpc.go | 40 | ||||
| -rw-r--r-- | syz-manager/stats.go | 3 |
4 files changed, 20 insertions, 43 deletions
diff --git a/syz-manager/http.go b/syz-manager/http.go index 587171d16..7b37bbd70 100644 --- a/syz-manager/http.go +++ b/syz-manager/http.go @@ -492,7 +492,7 @@ func (mgr *Manager) modulesInfo(w http.ResponseWriter, r *http.Request) { return } // NewCanonicalizer() is initialized with serv.modules. - modules, err := json.MarshalIndent(mgr.serv.modules, "", "\t") + modules, err := json.MarshalIndent(mgr.modules, "", "\t") if err != nil { fmt.Fprintf(w, "unable to create JSON modules info: %v", err) return diff --git a/syz-manager/manager.go b/syz-manager/manager.go index 660fb231e..797c5b600 100644 --- a/syz-manager/manager.go +++ b/syz-manager/manager.go @@ -1195,8 +1195,17 @@ func fullReproLog(stats *repro.Stats) []byte { func (mgr *Manager) corpusInputHandler(updates <-chan corpus.NewItemEvent) { for update := range updates { - mgr.serv.updateFilteredCover(update.NewCover) - + if len(update.NewCover) != 0 && mgr.coverFilter != nil { + if rg, _ := getReportGenerator(mgr.cfg, mgr.modules); rg != nil { + filtered := 0 + for _, pc := range update.NewCover { + if mgr.coverFilter[uint32(rg.RestorePC(pc))] != 0 { + filtered++ + } + } + mgr.statCoverFiltered.Add(filtered) + } + } if update.Exists { // We only save new progs into the corpus.db file. continue @@ -1322,8 +1331,7 @@ func (mgr *Manager) collectSyscallInfo() map[string]*corpus.CallCov { return calls } -func (mgr *Manager) fuzzerConnect(modules []host.KernelModule) ( - BugFrames, map[uint32]uint32, map[uint32]uint32, error) { +func (mgr *Manager) fuzzerConnect(modules []host.KernelModule) (BugFrames, map[uint32]uint32) { mgr.mu.Lock() defer mgr.mu.Unlock() @@ -1346,7 +1354,7 @@ func (mgr *Manager) fuzzerConnect(modules []host.KernelModule) ( } mgr.modulesInitialized = true } - return frames, mgr.coverFilter, mgr.execCoverFilter, nil + return frames, mgr.execCoverFilter } func (mgr *Manager) machineChecked(features *host.Features, globFiles map[string][]string, diff --git a/syz-manager/rpc.go b/syz-manager/rpc.go index 577533cb9..64f3bb83c 100644 --- a/syz-manager/rpc.go +++ b/syz-manager/rpc.go @@ -27,10 +27,8 @@ type RPCServer struct { mgr RPCManagerView cfg *mgrconfig.Config server *rpctype.RPCServer - modules []host.KernelModule port int targetEnabledSyscalls map[*prog.Syscall]bool - coverFilter map[uint32]uint32 canonicalModules *cover.Canonicalizer mu sync.Mutex @@ -52,7 +50,6 @@ type RPCServer struct { statExchangeProgs *stats.Val statExchangeServerLatency *stats.Val statExchangeClientLatency *stats.Val - statCorpusCoverFiltered *stats.Val } type Runner struct { @@ -84,7 +81,7 @@ type BugFrames struct { // RPCManagerView restricts interface between RPCServer and Manager. type RPCManagerView interface { - fuzzerConnect([]host.KernelModule) (BugFrames, map[uint32]uint32, map[uint32]uint32, error) + fuzzerConnect([]host.KernelModule) (BugFrames, map[uint32]uint32) machineChecked(features *host.Features, globFiles map[string][]string, enabledSyscalls map[*prog.Syscall]bool) getFuzzer() *fuzzer.Fuzzer } @@ -111,7 +108,6 @@ func startRPCServer(mgr *Manager) (*RPCServer, error) { "Manager RPC Exchange call latency (us)", stats.Distribution{}), statExchangeClientLatency: stats.Create("exchange fuzzer latency", "End-to-end fuzzer RPC Exchange call latency (us)", stats.Distribution{}), - statCorpusCoverFiltered: stats.Create("filtered coverage", "", stats.NoGraph), } s, err := rpctype.NewRPCServer(mgr.cfg.RPC, "Manager", serv, mgr.netCompression) if err != nil { @@ -128,23 +124,14 @@ func (serv *RPCServer) Connect(a *rpctype.ConnectArgs, r *rpctype.ConnectRes) er log.Logf(1, "fuzzer %v connected", a.Name) serv.statVMRestarts.Add(1) + bugFrames, execCoverFilter := serv.mgr.fuzzerConnect(a.Modules) + serv.mu.Lock() + defer serv.mu.Unlock() if serv.canonicalModules == nil { serv.canonicalModules = cover.NewCanonicalizer(a.Modules, serv.cfg.Cover) - serv.modules = a.Modules - } - serv.mu.Unlock() - - bugFrames, coverFilter, execCoverFilter, err := serv.mgr.fuzzerConnect(serv.modules) - if err != nil { - return err } - serv.mu.Lock() - defer serv.mu.Unlock() - - serv.coverFilter = coverFilter - runner := serv.findRunner(a.Name) runner.mu.Lock() defer runner.mu.Unlock() @@ -322,25 +309,6 @@ func (serv *RPCServer) findRunner(name string) *Runner { return nil } -func (serv *RPCServer) updateFilteredCover(pcs []uint32) error { - if len(pcs) == 0 || serv.coverFilter == nil { - return nil - } - // Note: ReportGenerator is already initialized if coverFilter is enabled. - rg, err := getReportGenerator(serv.cfg, serv.modules) - if err != nil { - return err - } - filtered := 0 - for _, pc := range pcs { - if serv.coverFilter[uint32(rg.RestorePC(pc))] != 0 { - filtered++ - } - } - serv.statCorpusCoverFiltered.Add(filtered) - return nil -} - func (serv *RPCServer) createInstance(name string, injectLog chan<- []byte) { runner := &Runner{ name: name, diff --git a/syz-manager/stats.go b/syz-manager/stats.go index 41c488f40..69f6483e1 100644 --- a/syz-manager/stats.go +++ b/syz-manager/stats.go @@ -18,6 +18,7 @@ type Stats struct { statCrashes *stats.Val statCrashTypes *stats.Val statSuppressed *stats.Val + statCoverFiltered *stats.Val statUptime *stats.Val statFuzzingTime *stats.Val statAvgBootTime *stats.Val @@ -38,7 +39,7 @@ func (mgr *Manager) initStats() { stats.Simple, stats.Graph("crashes")) mgr.statFuzzingTime = stats.Create("fuzzing", "Total fuzzing time in all VMs (seconds)", stats.NoGraph, func(v int, period time.Duration) string { return fmt.Sprintf("%v sec", v/1e9) }) - + mgr.statCoverFiltered = stats.Create("filtered coverage", "", stats.NoGraph) mgr.statUptime = stats.Create("uptime", "Total uptime (seconds)", stats.Simple, stats.NoGraph, func() int { firstConnect := mgr.firstConnect.Load() |
