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>
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,
.name = "cgroupfs",
.attach = lxc_cgroupfs_attach,
.chown = NULL,
+ .parse_existing_cgroups = cgfs_parse_existing_cgroups,
.mount_cgroup = cgroupfs_mount_cgroup,
.nrtasks = cgfs_nrtasks,
};
.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,
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) {
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);
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);
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;