@@ -27,28 +27,26 @@ import (
2727 _ "github.com/google/syzkaller/pkg/subsystem/lists"
2828 "github.com/google/syzkaller/pkg/tool"
2929 "github.com/google/syzkaller/sys/targets"
30+ "golang.org/x/sync/errgroup"
3031)
3132
3233// The target we currently assume for extracted descriptions.
3334var target = targets .Get (targets .Linux , targets .AMD64 )
3435
3536func main () {
3637 var (
37- flagConfig = flag .String ("config" , "" , "manager config file" )
38- flagBinary = flag .String ("binary" , "syz-declextract" , "path to syz-declextract binary" )
39- flagCacheProbe = flag .Bool ("cache-probe" , false , "use cached probe results if present" +
40- " (cached in manager.workdir/interfaces.json)" )
38+ flagConfig = flag .String ("config" , "" , "manager config file" )
39+ flagBinary = flag .String ("binary" , "syz-declextract" , "path to syz-declextract binary" )
4140 )
4241 defer tool .Init ()()
4342 cfg , err := mgrconfig .LoadFile (* flagConfig )
4443 if err != nil {
4544 tool .Fail (err )
4645 }
47- probeInfo , err := probe (cfg , * flagConfig , * flagCacheProbe )
48- if err != nil {
49- tool .Failf ("kernel probing failed: %v" , err )
46+ loadProbeInfo := func () (* ifaceprobe.Info , error ) {
47+ return probe (cfg , * flagConfig )
5048 }
51- if err := run (filepath .FromSlash ("sys/linux/auto.txt" ), probeInfo , & clangtool.Config {
49+ if err := run (filepath .FromSlash ("sys/linux/auto.txt" ), loadProbeInfo , & clangtool.Config {
5250 ToolBin : * flagBinary ,
5351 KernelSrc : cfg .KernelSrc ,
5452 KernelObj : cfg .KernelObj ,
@@ -58,12 +56,8 @@ func main() {
5856 }
5957}
6058
61- func run (autoFile string , probeInfo * ifaceprobe.Info , cfg * clangtool.Config ) error {
62- syscallRename , err := buildSyscallRenameMap (cfg .KernelSrc )
63- if err != nil {
64- return fmt .Errorf ("failed to build syscall rename map: %w" , err )
65- }
66- out , err := clangtool .Run (cfg )
59+ func run (autoFile string , loadProbeInfo func () (* ifaceprobe.Info , error ), cfg * clangtool.Config ) error {
60+ out , probeInfo , syscallRename , err := prepare (loadProbeInfo , cfg )
6761 if err != nil {
6862 return err
6963 }
@@ -113,15 +107,47 @@ func run(autoFile string, probeInfo *ifaceprobe.Info, cfg *clangtool.Config) err
113107 return osutil .WriteFile (autoFile , formatted )
114108}
115109
116- func probe (cfg * mgrconfig.Config , cfgFile string , cache bool ) (* ifaceprobe.Info , error ) {
117- cacheFile := filepath .Join (cfg .Workdir , "interfaces.json" )
118- if cache {
119- info , err := readProbeResult (cacheFile )
120- if err == nil {
121- return info , nil
110+ func prepare (loadProbeInfo func () (* ifaceprobe.Info , error ), cfg * clangtool.Config ) (
111+ * declextract.Output , * ifaceprobe.Info , map [string ][]string , error ) {
112+ var eg errgroup.Group
113+ var out * declextract.Output
114+ eg .Go (func () error {
115+ var err error
116+ out , err = clangtool .Run (cfg )
117+ if err != nil {
118+ return err
119+ }
120+ return nil
121+ })
122+ var probeInfo * ifaceprobe.Info
123+ eg .Go (func () error {
124+ var err error
125+ probeInfo , err = loadProbeInfo ()
126+ if err != nil {
127+ return fmt .Errorf ("kernel probing failed: %w" , err )
122128 }
129+ return nil
130+ })
131+ var syscallRename map [string ][]string
132+ eg .Go (func () error {
133+ var err error
134+ syscallRename , err = buildSyscallRenameMap (cfg .KernelSrc )
135+ if err != nil {
136+ return fmt .Errorf ("failed to build syscall rename map: %w" , err )
137+ }
138+ return nil
139+ })
140+ err := eg .Wait ()
141+ return out , probeInfo , syscallRename , err
142+ }
143+
144+ func probe (cfg * mgrconfig.Config , cfgFile string ) (* ifaceprobe.Info , error ) {
145+ cacheFile := filepath .Join (cfg .Workdir , "interfaces.json" )
146+ info , err := readProbeResult (cacheFile )
147+ if err == nil {
148+ return info , nil
123149 }
124- _ , err : = osutil .RunCmd (30 * time .Minute , "" , filepath .Join (cfg .Syzkaller , "bin" , "syz-manager" ),
150+ _ , err = osutil .RunCmd (30 * time .Minute , "" , filepath .Join (cfg .Syzkaller , "bin" , "syz-manager" ),
125151 "-config" , cfgFile , "-mode" , "iface-probe" )
126152 if err != nil {
127153 return nil , err
0 commit comments