]> git.proxmox.com Git - mirror_lxc.git/commitdiff
Initialize cgroups on lxc-checkpoint -r
authorTycho Andersen <tycho.andersen@canonical.com>
Wed, 24 Sep 2014 13:38:41 +0000 (08:38 -0500)
committerStéphane Graber <stgraber@ubuntu.com>
Wed, 24 Sep 2014 15:26:49 +0000 (11:26 -0400)
With cgmanager, the cgroups are polled on demand, so these steps aren't needed.
However, with cgfs, lxc doesn't know about the cgroups for a container and so
it can't report any of the statistics about e.g. how much memory or CPU a
container is using.

Signed-off-by: Tycho Andersen <tycho.andersen@canonical.com>
Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com>
src/lxc/cgfs.c
src/lxc/cgmanager.c
src/lxc/cgroup.c
src/lxc/cgroup.h
src/lxc/lxccontainer.c

index 796b2202fe5154792e216c88714188e8046cc5ff..0f181c6499198112c8e80e1124145b526de0f89b 100644 (file)
@@ -2376,6 +2376,18 @@ static bool lxc_cgroupfs_attach(const char *name, const char *lxcpath, pid_t pid
        return true;
 }
 
+static bool cgfs_parse_existing_cgroups(void *hdata, pid_t init)
+{
+       struct cgfs_data *d = hdata;
+
+       if (!d)
+               return false;
+
+       d->info = lxc_cgroup_process_info_get(init, d->meta);
+
+       return !!(d->info);
+}
+
 static struct cgroup_ops cgfs_ops = {
        .init = cgfs_init,
        .destroy = cgfs_destroy,
@@ -2390,6 +2402,7 @@ static struct cgroup_ops cgfs_ops = {
        .name = "cgroupfs",
        .attach = lxc_cgroupfs_attach,
        .chown = NULL,
+       .parse_existing_cgroups = cgfs_parse_existing_cgroups,
        .mount_cgroup = cgroupfs_mount_cgroup,
        .nrtasks = cgfs_nrtasks,
 };
index a11d42f516beda1871fe909d761eceec34c00676..4038c41de43a714afee68e6510d9d93c27aca391 100644 (file)
@@ -1313,6 +1313,7 @@ static struct cgroup_ops cgmanager_ops = {
        .setup_limits = cgm_setup_limits,
        .name = "cgmanager",
        .chown = cgm_chown,
+       .parse_existing_cgroups = NULL,
        .attach = cgm_attach,
        .mount_cgroup = cgm_mount_cgroup,
        .nrtasks = cgm_get_nrtasks,
index 63a2ad4defb289927c8d127cfc32098cacff4b06..56d0e564f4329b2c71c5ebcb8a4ac0a2a1333976 100644 (file)
@@ -128,6 +128,15 @@ bool cgroup_chown(struct lxc_handler *handler)
        return true;
 }
 
+bool cgroup_parse_existing_cgroups(struct lxc_handler *handler)
+{
+       if (ops && ops->parse_existing_cgroups)
+               return ops->parse_existing_cgroups(handler->cgroup_data, handler->pid);
+
+       /* cgmanager does this automatically */
+       return true;
+}
+
 bool cgroup_mount(const char *root, struct lxc_handler *handler, int type)
 {
        if (ops) {
index 7e033702f9c3c1cf89afe5068a767c91cd7bf9e6..0c2e566fe9b595d2d2e37aafa054b74d2c6369d7 100644 (file)
@@ -46,6 +46,7 @@ struct cgroup_ops {
        bool (*unfreeze)(void *hdata);
        bool (*setup_limits)(void *hdata, struct lxc_list *cgroup_conf, bool with_devices);
        bool (*chown)(void *hdata, struct lxc_conf *conf);
+       bool (*parse_existing_cgroups)(void *hdata, pid_t pid);
        bool (*attach)(const char *name, const char *lxcpath, pid_t pid);
        bool (*mount_cgroup)(void *hdata, const char *root, int type);
        int (*nrtasks)(void *hdata);
@@ -59,6 +60,7 @@ extern bool cgroup_init(struct lxc_handler *handler);
 extern bool cgroup_create(struct lxc_handler *handler);
 extern bool cgroup_setup_limits(struct lxc_handler *handler, bool with_devices);
 extern bool cgroup_chown(struct lxc_handler *handler);
+extern bool cgroup_parse_existing_cgroups(struct lxc_handler *handler);
 extern bool cgroup_enter(struct lxc_handler *handler);
 extern void cgroup_cleanup(struct lxc_handler *handler);
 extern bool cgroup_create_legacy(struct lxc_handler *handler);
index 94ecc6845fa93b66093f5c959ae8859aec9ee083..4f90f356effd74842b34b59f94604ada62affc81 100644 (file)
@@ -3895,6 +3895,17 @@ static bool lxcapi_restore(struct lxc_container *c, char *directory, bool verbos
                                        goto out_fini_handler;
                                }
 
+                               if (!cgroup_init(handler)) {
+                                       error = true;
+                                       ERROR("failed initing cgroups");
+                                       goto out_fini_handler;
+                               }
+
+                               if (!cgroup_parse_existing_cgroups(handler)) {
+                                       ERROR("failed creating cgroups");
+                                       goto out_fini_handler;
+                               }
+
                                if (container_mem_lock(c)) {
                                        error = true;
                                        goto out_fini_handler;