diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2018-03-27 11:39:58 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2018-03-27 11:39:58 +0200 |
| commit | bf5e585c5e1b12fe80ee486fdd48eeb71a13fa21 (patch) | |
| tree | 95748ad5d0c86675e3fd4264b8e66c3ba0c4a9c5 /pkg/csource/linux_common.go | |
| parent | c7e0d50a76c1970d8f326a49ef24fc5d19ee93c1 (diff) | |
executor: rework cgroups support
Turns out creating a cgroup per test is too expensive.
Moreover, it leads to hanged tasks as cgroup destruction
is asynchronous and overloads kernel work queues.
Create only a single cgroup per proc, but restrict
descriptions to mess with that single group,
instead test processes create own nested cgroups for messing.
Diffstat (limited to 'pkg/csource/linux_common.go')
| -rw-r--r-- | pkg/csource/linux_common.go | 55 |
1 files changed, 23 insertions, 32 deletions
diff --git a/pkg/csource/linux_common.go b/pkg/csource/linux_common.go index 0c9d6571e..250b366d4 100644 --- a/pkg/csource/linux_common.go +++ b/pkg/csource/linux_common.go @@ -2698,6 +2698,29 @@ static void loop() snprintf(cgroupdir_cpu, sizeof(cgroupdir_cpu), "/syzcgroup/cpu/syz%llu", procid); char cgroupdir_net[64]; snprintf(cgroupdir_net, sizeof(cgroupdir_net), "/syzcgroup/net/syz%llu", procid); + if (mkdir(cgroupdir, 0777)) { + debug("mkdir(%s) failed: %d\n", cgroupdir, errno); + } + if (mkdir(cgroupdir_cpu, 0777)) { + debug("mkdir(%s) failed: %d\n", cgroupdir_cpu, errno); + } + if (mkdir(cgroupdir_net, 0777)) { + debug("mkdir(%s) failed: %d\n", cgroupdir_net, errno); + } + int pid = getpid(); + char procs_file[128]; + snprintf(procs_file, sizeof(procs_file), "%s/cgroup.procs", cgroupdir); + if (!write_file(procs_file, "%d", pid)) { + debug("write(%s) failed: %d\n", procs_file, errno); + } + snprintf(procs_file, sizeof(procs_file), "%s/cgroup.procs", cgroupdir_cpu); + if (!write_file(procs_file, "%d", pid)) { + debug("write(%s) failed: %d\n", procs_file, errno); + } + snprintf(procs_file, sizeof(procs_file), "%s/cgroup.procs", cgroupdir_net); + if (!write_file(procs_file, "%d", pid)) { + debug("write(%s) failed: %d\n", procs_file, errno); + } #endif int iter; for (iter = 0;; iter++) { @@ -2707,17 +2730,6 @@ static void loop() if (mkdir(cwdbuf, 0777)) fail("failed to mkdir"); #endif -#if defined(SYZ_EXECUTOR) || defined(SYZ_ENABLE_CGROUPS) - if (mkdir(cgroupdir, 0777)) { - debug("mkdir(%s) failed: %d\n", cgroupdir, errno); - } - if (mkdir(cgroupdir_cpu, 0777)) { - debug("mkdir(%s) failed: %d\n", cgroupdir_cpu, errno); - } - if (mkdir(cgroupdir_net, 0777)) { - debug("mkdir(%s) failed: %d\n", cgroupdir_net, errno); - } -#endif #if defined(SYZ_EXECUTOR) receive_execute(false); #endif @@ -2745,16 +2757,6 @@ static void loop() if (symlink(cgroupdir_net, "./cgroup.net")) { debug("symlink(%s, ./cgroup.net) failed: %d\n", cgroupdir_net, errno); } - int pid = getpid(); - if (!write_file("./cgroup/cgroup.procs", "%d", pid)) { - debug("write(./cgroup/cgroup.procs) failed: %d\n", errno); - } - if (!write_file("./cgroup.cpu/cgroup.procs", "%d", pid)) { - debug("write(./cgroup.cpu/cgroup.procs) failed: %d\n", errno); - } - if (!write_file("./cgroup.net/cgroup.procs", "%d", pid)) { - debug("write(./cgroup.net/cgroup.procs) failed: %d\n", errno); - } #endif #if defined(SYZ_EXECUTOR) if (flag_enable_tun) { @@ -2815,17 +2817,6 @@ static void loop() #if defined(SYZ_EXECUTOR) || defined(SYZ_USE_TMP_DIR) remove_dir(cwdbuf); #endif -#if defined(SYZ_EXECUTOR) || defined(SYZ_ENABLE_CGROUPS) - if (rmdir(cgroupdir)) { - debug("rmdir(%s) failed: %d\n", cgroupdir, errno); - } - if (rmdir(cgroupdir_cpu)) { - debug("rmdir(%s) failed: %d\n", cgroupdir_cpu, errno); - } - if (rmdir(cgroupdir_net)) { - debug("rmdir(%s) failed: %d\n", cgroupdir_net, errno); - } -#endif #if defined(SYZ_EXECUTOR) || defined(SYZ_RESET_NET_NAMESPACE) reset_net_namespace(); #endif |
