From: Tycho Andersen Date: Wed, 24 Sep 2014 13:38:41 +0000 (-0500) Subject: Initialize cgroups on lxc-checkpoint -r X-Git-Tag: lxc-1.1.0.alpha2~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a3289423ebeb949c1f37e8fd1016d0531fad5d81;p=thirdparty%2Flxc.git Initialize cgroups on lxc-checkpoint -r 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 Acked-by: Serge E. Hallyn --- diff --git a/src/lxc/cgfs.c b/src/lxc/cgfs.c index 796b2202f..0f181c649 100644 --- a/src/lxc/cgfs.c +++ b/src/lxc/cgfs.c @@ -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, }; diff --git a/src/lxc/cgmanager.c b/src/lxc/cgmanager.c index a11d42f51..4038c41de 100644 --- a/src/lxc/cgmanager.c +++ b/src/lxc/cgmanager.c @@ -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, diff --git a/src/lxc/cgroup.c b/src/lxc/cgroup.c index 63a2ad4de..56d0e564f 100644 --- a/src/lxc/cgroup.c +++ b/src/lxc/cgroup.c @@ -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) { diff --git a/src/lxc/cgroup.h b/src/lxc/cgroup.h index 7e033702f..0c2e566fe 100644 --- a/src/lxc/cgroup.h +++ b/src/lxc/cgroup.h @@ -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); diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 94ecc6845..4f90f356e 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -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;