Skip to content

Commit 5388eec

Browse files
committed
tools/syz-declextract: parallelize
Do kernel probing, source code analysis and loading of syscall rename map in parallel. Also change probe caching to the scheme we now use for the clang tool cache so the same reasons.
1 parent 7ab3e22 commit 5388eec

File tree

3 files changed

+56
-27
lines changed

3 files changed

+56
-27
lines changed

tools/syz-declextract/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ go run tools/syz-declextract -binary=$LLVM_BUILD/bin/syz-declextract -config=man
4646
syz-env make extract SOURCEDIR=$KERNEL
4747
```
4848

49-
The tool caches results of static kernel analysis in manager.workdir/declextract.cache,
50-
and results of the dynamic kernel probing in manager.workdir/interfaces.json.
51-
These can be examined for debugging purposes, and reused separately by passing
52-
-cache-extract and -cache-probe flags. Caching greatly saves time if only part
53-
of the system has changed. If only the Go tool has changed, then both caches can be reused.
49+
The tool caches results of static kernel analysis in manager.workdir/declextract.cache file,
50+
and results of the dynamic kernel probing in manager.workdir/interfaces.json file.
51+
These can be examined for debugging purposes, and will be reused in future runs if exist
52+
(greatly saves time). If the clang tool/kernel has changed, delete these cache files
53+
so that they are updated.

tools/syz-declextract/declextract.go

Lines changed: 47 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
3334
var target = targets.Get(targets.Linux, targets.AMD64)
3435

3536
func 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

tools/syz-declextract/declextract_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,11 @@ func TestDeclextract(t *testing.T) {
6363
t.Fatal(err)
6464
}
6565
}
66+
loadProbeInfo := func() (*ifaceprobe.Info, error) {
67+
return probeInfo, nil
68+
}
6669
autoFile := filepath.Join(cfg.KernelObj, filepath.Base(file)+".txt")
67-
if err := run(autoFile, probeInfo, cfg); err != nil {
70+
if err := run(autoFile, loadProbeInfo, cfg); err != nil {
6871
if *flagUpdate {
6972
osutil.CopyFile(autoFile, file+".txt")
7073
osutil.CopyFile(autoFile+".info", file+".info")

0 commit comments

Comments
 (0)