2
0
mirror of git://github.com/lxc/lxc synced 2025-08-30 09:42:03 +00:00

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: Tycho Andersen <tycho.andersen@canonical.com>
Acked-by: Stéphane Graber <stgraber@ubuntu.com>
This commit is contained in:
Tycho Andersen 2015-11-06 17:26:43 -07:00 committed by Stéphane Graber
parent 8d2ede581f
commit dc259399a4

View File

@ -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) {