[lxc-devel] [PATCH 2/2] Initialize cgroups on lxc-checkpoint -r

Serge Hallyn serge.hallyn at ubuntu.com
Wed Sep 24 14:37:03 UTC 2014


Quoting Tycho Andersen (tycho.andersen at 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.andersen at canonical.com>

Acked-by: Serge E. Hallyn <serge.hallyn at 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 at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel


More information about the lxc-devel mailing list