[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