Commit dc259399 by Tycho Andersen Committed by Stéphane Graber

c/r: use freezer to seize tasks

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: 's avatarTycho Andersen <tycho.andersen@canonical.com> Acked-by: 's avatarStéphane Graber <stgraber@ubuntu.com>
parent 8d2ede58
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "bdev.h" #include "bdev.h"
#include "cgroup.h" #include "cgroup.h"
#include "conf.h" #include "conf.h"
#include "commands.h"
#include "criu.h" #include "criu.h"
#include "log.h" #include "log.h"
#include "lxc.h" #include "lxc.h"
...@@ -64,8 +65,8 @@ void exec_criu(struct criu_opts *opts) ...@@ -64,8 +65,8 @@ void exec_criu(struct criu_opts *opts)
* +1 for final NULL */ * +1 for final NULL */
if (strcmp(opts->action, "dump") == 0) { if (strcmp(opts->action, "dump") == 0) {
/* -t pid */ /* -t pid --freeze-cgroup /lxc/ct */
static_args += 2; static_args += 4;
/* --leave-running */ /* --leave-running */
if (!opts->stop) if (!opts->stop)
...@@ -133,13 +134,30 @@ void exec_criu(struct criu_opts *opts) ...@@ -133,13 +134,30 @@ void exec_criu(struct criu_opts *opts)
DECLARE_ARG("-vvvvvv"); DECLARE_ARG("-vvvvvv");
if (strcmp(opts->action, "dump") == 0) { 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) if (sprintf(pid, "%d", opts->c->init_pid(opts->c)) < 0)
goto err; goto err;
DECLARE_ARG("-t"); DECLARE_ARG("-t");
DECLARE_ARG(pid); 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) if (!opts->stop)
DECLARE_ARG("--leave-running"); DECLARE_ARG("--leave-running");
} else if (strcmp(opts->action, "restore") == 0) { } else if (strcmp(opts->action, "restore") == 0) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment