From dc259399a453b68811a9c62fcf739b8e77e3fbe8 Mon Sep 17 00:00:00 2001 From: Tycho Andersen Date: Fri, 6 Nov 2015 17:26:43 -0700 Subject: [PATCH] c/r: use freezer to seize tasks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of relying on the old ptrace loop, we should instead put all the tasks in the container into the freezer. This will stop them all at the same time, preventing fork bombs from causing criu to infinite loop (and is also simply a lot faster). Note that this uses --freeze-cgroup which isn't in criu 1.7, so it should only go into master. Signed-off-by: Tycho Andersen Acked-by: Stéphane Graber --- src/lxc/criu.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/lxc/criu.c b/src/lxc/criu.c index 7ee6cbea2..695a763c9 100644 --- a/src/lxc/criu.c +++ b/src/lxc/criu.c @@ -37,6 +37,7 @@ #include "bdev.h" #include "cgroup.h" #include "conf.h" +#include "commands.h" #include "criu.h" #include "log.h" #include "lxc.h" @@ -64,8 +65,8 @@ void exec_criu(struct criu_opts *opts) * +1 for final NULL */ if (strcmp(opts->action, "dump") == 0) { - /* -t pid */ - static_args += 2; + /* -t pid --freeze-cgroup /lxc/ct */ + static_args += 4; /* --leave-running */ if (!opts->stop) @@ -133,13 +134,30 @@ void exec_criu(struct criu_opts *opts) DECLARE_ARG("-vvvvvv"); if (strcmp(opts->action, "dump") == 0) { - char pid[32]; + char pid[32], *freezer_relative; if (sprintf(pid, "%d", opts->c->init_pid(opts->c)) < 0) goto err; + DECLARE_ARG("-t"); DECLARE_ARG(pid); + + freezer_relative = lxc_cmd_get_cgroup_path(opts->c->name, + opts->c->config_path, + "freezer"); + if (!freezer_relative) { + ERROR("failed getting freezer path"); + goto err; + } + + ret = snprintf(log, sizeof(log), "/sys/fs/cgroup/freezer/%s", freezer_relative); + if (ret < 0 || ret >= sizeof(log)) + goto err; + + DECLARE_ARG("--freeze-cgroup"); + DECLARE_ARG(log); + if (!opts->stop) DECLARE_ARG("--leave-running"); } else if (strcmp(opts->action, "restore") == 0) {