[lxc-devel] [PATCH] c/r: teach criu about cgmanager's socket

Serge Hallyn serge.hallyn at ubuntu.com
Thu Apr 2 20:36:45 UTC 2015


Quoting Tycho Andersen (tycho.andersen at canonical.com):
> CRIU needs to be told when something is bind mounted into the container from
> the outside as cgmanager's socket is.
> 
> Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>

Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>

> ---
>  src/lxc/cgfs.c         |  1 +
>  src/lxc/cgmanager.c    |  1 +
>  src/lxc/cgroup.c       |  5 +++++
>  src/lxc/cgroup.h       |  7 +++++++
>  src/lxc/lxccontainer.c | 16 ++++++++++++++++
>  5 files changed, 30 insertions(+)
> 
> diff --git a/src/lxc/cgfs.c b/src/lxc/cgfs.c
> index 20325fa..11a5925 100644
> --- a/src/lxc/cgfs.c
> +++ b/src/lxc/cgfs.c
> @@ -2403,4 +2403,5 @@ static struct cgroup_ops cgfs_ops = {
>  	.chown = NULL,
>  	.mount_cgroup = cgroupfs_mount_cgroup,
>  	.nrtasks = cgfs_nrtasks,
> +	.driver = CGFS,
>  };
> diff --git a/src/lxc/cgmanager.c b/src/lxc/cgmanager.c
> index 0932d96..080e382 100644
> --- a/src/lxc/cgmanager.c
> +++ b/src/lxc/cgmanager.c
> @@ -1396,5 +1396,6 @@ static struct cgroup_ops cgmanager_ops = {
>  	.mount_cgroup = cgm_mount_cgroup,
>  	.nrtasks = cgm_get_nrtasks,
>  	.disconnect = NULL,
> +	.driver = CGMANAGER,
>  };
>  #endif
> diff --git a/src/lxc/cgroup.c b/src/lxc/cgroup.c
> index a413832..2362ad8 100644
> --- a/src/lxc/cgroup.c
> +++ b/src/lxc/cgroup.c
> @@ -189,3 +189,8 @@ void cgroup_disconnect(void)
>  	if (ops && ops->disconnect)
>  		ops->disconnect();
>  }
> +
> +cgroup_driver_t cgroup_driver(void)
> +{
> +	return ops->driver;
> +}
> diff --git a/src/lxc/cgroup.h b/src/lxc/cgroup.h
> index 281f404..6706939 100644
> --- a/src/lxc/cgroup.h
> +++ b/src/lxc/cgroup.h
> @@ -32,6 +32,11 @@ struct lxc_handler;
>  struct lxc_conf;
>  struct lxc_list;
>  
> +typedef enum {
> +	CGFS,
> +	CGMANAGER,
> +} cgroup_driver_t;
> +
>  struct cgroup_ops {
>  	const char *name;
>  
> @@ -51,6 +56,7 @@ struct cgroup_ops {
>  	bool (*mount_cgroup)(void *hdata, const char *root, int type);
>  	int (*nrtasks)(void *hdata);
>  	void (*disconnect)(void);
> +	cgroup_driver_t driver;
>  };
>  
>  extern bool cgroup_attach(const char *name, const char *lxcpath, pid_t pid);
> @@ -72,5 +78,6 @@ extern const char *cgroup_get_cgroup(struct lxc_handler *handler, const char *su
>  extern const char *cgroup_canonical_path(struct lxc_handler *handler);
>  extern bool cgroup_unfreeze(struct lxc_handler *handler);
>  extern void cgroup_disconnect(void);
> +extern cgroup_driver_t cgroup_driver(void);
>  
>  #endif
> diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
> index c3369cd..d84543f 100644
> --- a/src/lxc/lxccontainer.c
> +++ b/src/lxc/lxccontainer.c
> @@ -3548,6 +3548,11 @@ static void exec_criu(struct criu_opts *opts)
>  		return;
>  	}
>  
> +	// We need to tell criu where cgmanager's socket is bind mounted from
> +	// if it exists since it's external.
> +	if (cgroup_driver() == CGMANAGER)
> +		static_args+=2;
> +
>  	argv = malloc(static_args * sizeof(*argv));
>  	if (!argv)
>  		return;
> @@ -3590,6 +3595,11 @@ static void exec_criu(struct criu_opts *opts)
>  	if (strcmp(opts->action, "dump") == 0) {
>  		char pid[32];
>  
> +		if (cgroup_driver() == CGMANAGER) {
> +			DECLARE_ARG("--ext-mount-map");
> +			DECLARE_ARG("/sys/fs/cgroup/cgmanager:cgmanager");
> +		}
> +
>  		if (sprintf(pid, "%d", lxcapi_init_pid(opts->c)) < 0)
>  			goto err;
>  
> @@ -3598,6 +3608,12 @@ static void exec_criu(struct criu_opts *opts)
>  		if (!opts->stop)
>  			DECLARE_ARG("--leave-running");
>  	} else if (strcmp(opts->action, "restore") == 0) {
> +
> +		if (cgroup_driver() == CGMANAGER) {
> +			DECLARE_ARG("--ext-mount-map");
> +			DECLARE_ARG("cgmanager:/sys/fs/cgroup/cgmanager");
> +		}
> +
>  		DECLARE_ARG("--root");
>  		DECLARE_ARG(opts->c->lxc_conf->rootfs.mount);
>  		DECLARE_ARG("--restore-detached");
> -- 
> 2.1.0
> 
> _______________________________________________
> 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