aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-12-22 12:01:52 +0100
committerDmitry Vyukov <dvyukov@google.com>2020-12-25 10:12:41 +0100
commitf8f67d67d3daa783c2bb7c9993c0ccb637af1a0e (patch)
treed17cd1f31315f1466673d951dad6ee9e309d66ec /pkg
parent549d0d03df068e7cc1d48f92ba1ba76153c91339 (diff)
executor: remove hardcoded timeouts
In preparation for making timeouts tunable based on OS/arch/VM/etc de-hardcode all (almost) timeouts in executor.
Diffstat (limited to 'pkg')
-rw-r--r--pkg/csource/csource.go3
-rw-r--r--pkg/csource/generated.go14
-rw-r--r--pkg/ipc/ipc.go34
3 files changed, 32 insertions, 19 deletions
diff --git a/pkg/csource/csource.go b/pkg/csource/csource.go
index 49babbf41..b53b3b97f 100644
--- a/pkg/csource/csource.go
+++ b/pkg/csource/csource.go
@@ -93,13 +93,14 @@ func Write(p *prog.Prog, opts Options) ([]byte, error) {
replacements["SANDBOX_FUNC"] = replacements["SYSCALLS"]
replacements["SYSCALLS"] = "unused"
}
+ replacements["PROGRAM_TIMEOUT_MS"] = "5000"
timeoutExpr := "45"
for i, call := range p.Calls {
if timeout := call.Meta.Attrs.Timeout; timeout != 0 {
timeoutExpr += fmt.Sprintf(" + (call == %d ? %d : 0)", i, timeout)
}
}
- replacements["CALL_TIMEOUT"] = timeoutExpr
+ replacements["CALL_TIMEOUT_MS"] = timeoutExpr
result, err := createCommonHeader(p, mmapProg, replacements, opts)
if err != nil {
return nil, err
diff --git a/pkg/csource/generated.go b/pkg/csource/generated.go
index 5f38c02c6..a1d204fd1 100644
--- a/pkg/csource/generated.go
+++ b/pkg/csource/generated.go
@@ -10093,7 +10093,7 @@ again:
if (collide && (call % 2) == 0)
break;
#endif
- event_timedwait(&th->done, /*{{{CALL_TIMEOUT}}}*/);
+ event_timedwait(&th->done, /*{{{CALL_TIMEOUT_MS}}}*/);
break;
}
}
@@ -10208,17 +10208,23 @@ static void loop(void)
break;
sleep_ms(1);
#if SYZ_EXECUTOR && SYZ_EXECUTOR_USES_SHMEM
+ uint64 min_timeout_ms = program_timeout_ms * 3 / 5;
+ uint64 inactive_timeout_ms = syscall_timeout_ms * 20;
uint64 now = current_time_ms();
uint32 now_executed = __atomic_load_n(output_data, __ATOMIC_RELAXED);
if (executed_calls != now_executed) {
executed_calls = now_executed;
last_executed = now;
}
- if ((now - start < 5 * 1000) && (now - start < 3 * 1000 || now - last_executed < 1000))
+ if ((now - start < program_timeout_ms) &&
+ (now - start < min_timeout_ms || now - last_executed < inactive_timeout_ms))
continue;
-#else
- if (current_time_ms() - start < 5 * 1000)
+#elif SYZ_EXECUTOR
+ if (current_time_ms() - start < program_timeout_ms)
continue;
+#else
+ if (current_time_ms() - start < /*{{{PROGRAM_TIMEOUT_MS}}}*/)
+ continue;
#endif
debug("killing hanging pid %d\n", pid);
kill_and_wait(pid, &status);
diff --git a/pkg/ipc/ipc.go b/pkg/ipc/ipc.go
index cb6dcd8e9..0f1bd50a6 100644
--- a/pkg/ipc/ipc.go
+++ b/pkg/ipc/ipc.go
@@ -500,13 +500,16 @@ type handshakeReply struct {
}
type executeReq struct {
- magic uint64
- envFlags uint64 // env flags
- execFlags uint64 // exec flags
- pid uint64
- faultCall uint64
- faultNth uint64
- progSize uint64
+ magic uint64
+ envFlags uint64 // env flags
+ execFlags uint64 // exec flags
+ pid uint64
+ faultCall uint64
+ faultNth uint64
+ syscallTimeoutMS uint64
+ programTimeoutMS uint64
+ slowdownScale uint64
+ progSize uint64
// This structure is followed by a serialized test program in encodingexec format.
// Both when sent over a pipe or in shared memory.
}
@@ -722,13 +725,16 @@ func (c *command) wait() error {
func (c *command) exec(opts *ExecOpts, progData []byte) (output []byte, hanged bool, err0 error) {
req := &executeReq{
- magic: inMagic,
- envFlags: uint64(c.config.Flags),
- execFlags: uint64(opts.Flags),
- pid: uint64(c.pid),
- faultCall: uint64(opts.FaultCall),
- faultNth: uint64(opts.FaultNth),
- progSize: uint64(len(progData)),
+ magic: inMagic,
+ envFlags: uint64(c.config.Flags),
+ execFlags: uint64(opts.Flags),
+ pid: uint64(c.pid),
+ faultCall: uint64(opts.FaultCall),
+ faultNth: uint64(opts.FaultNth),
+ syscallTimeoutMS: 50,
+ programTimeoutMS: 5000,
+ slowdownScale: 1,
+ progSize: uint64(len(progData)),
}
reqData := (*[unsafe.Sizeof(*req)]byte)(unsafe.Pointer(req))[:]
if _, err := c.outwp.Write(reqData); err != nil {