]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
c/r: use freezer to seize tasks
authorTycho Andersen <tycho.andersen@canonical.com>
Sat, 7 Nov 2015 00:26:43 +0000 (17:26 -0700)
committerStéphane Graber <stgraber@ubuntu.com>
Sat, 7 Nov 2015 04:24:31 +0000 (23:24 -0500)
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>
src/lxc/criu.c

index 7ee6cbea2ca9f4fa22e7f851dca62b97113706b8..695a763c9a66b64754c11f2b29c0f1b5a13f83e9 100644 (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) {