Quoting Tycho Andersen (tycho.ander...@canonical.com): > 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.ander...@canonical.com>
Acked-by: Serge E. Hallyn <serge.hal...@ubuntu.com> > --- > src/lxc/cgfs.c | 13 +++++++++++++ > src/lxc/cgmanager.c | 1 + > src/lxc/cgroup.c | 9 +++++++++ > src/lxc/cgroup.h | 2 ++ > src/lxc/lxccontainer.c | 11 +++++++++++ > 5 files changed, 36 insertions(+) > > diff --git a/src/lxc/cgfs.c b/src/lxc/cgfs.c > index 796b220..0f181c6 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 a11d42f..4038c41 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 63a2ad4..56d0e56 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 7e03370..0c2e566 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 94ecc68..4f90f35 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; > -- > 1.9.1 > > _______________________________________________ > lxc-devel mailing list > lxc-devel@lists.linuxcontainers.org > http://lists.linuxcontainers.org/listinfo/lxc-devel _______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel