Skip to content

Commit

Permalink
Initialize cgroups on lxc-checkpoint -r
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Tycho Andersen authored and stgraber committed Sep 24, 2014
1 parent c49ecd7 commit a328942
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 0 deletions.
13 changes: 13 additions & 0 deletions src/lxc/cgfs.c
Expand Up @@ -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,
Expand All @@ -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,
};
1 change: 1 addition & 0 deletions src/lxc/cgmanager.c
Expand Up @@ -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,
Expand Down
9 changes: 9 additions & 0 deletions src/lxc/cgroup.c
Expand Up @@ -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) {
Expand Down
2 changes: 2 additions & 0 deletions src/lxc/cgroup.h
Expand Up @@ -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);
Expand All @@ -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);
Expand Down
11 changes: 11 additions & 0 deletions src/lxc/lxccontainer.c
Expand Up @@ -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;
Expand Down

0 comments on commit a328942

Please sign in to comment.