[lxc-devel] [PATCH] set non device cgroup items before the cgroup is entered

Serge Hallyn serge.hallyn at ubuntu.com
Thu May 16 02:11:29 UTC 2013


Quoting Dwight Engen (dwight.engen at oracle.com):
> This allows some special cgroup items such as memory.kmem.limit_in_bytes
> to be successfully set, since they must be set before any task is put
> into the cgroup.
> 
> The devices cgroup is setup later giving the container a chance to mount
> file systems before the device it might want to mount from becomes
> unavailable.
> 
> Signed-off-by: Dwight Engen <dwight.engen at oracle.com>

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

thanks, Dwight.

-serge

> ---
>  src/lxc/conf.c  | 25 +++++++++++++++++++------
>  src/lxc/conf.h  |  3 +--
>  src/lxc/start.c | 10 +++++++---
>  3 files changed, 27 insertions(+), 11 deletions(-)
> 
> diff --git a/src/lxc/conf.c b/src/lxc/conf.c
> index 746a2db..9877cc3 100644
> --- a/src/lxc/conf.c
> +++ b/src/lxc/conf.c
> @@ -1401,7 +1401,8 @@ static int setup_kmsg(const struct lxc_rootfs *rootfs,
>  	return 0;
>  }
>  
> -int setup_cgroup(const char *cgpath, struct lxc_list *cgroups)
> +static int _setup_cgroup(const char *cgpath, struct lxc_list *cgroups,
> +			  int devices)
>  {
>  	struct lxc_list *iterator;
>  	struct lxc_cgroup *cg;
> @@ -1411,13 +1412,15 @@ int setup_cgroup(const char *cgpath, struct lxc_list *cgroups)
>  		return 0;
>  
>  	lxc_list_for_each(iterator, cgroups) {
> -
>  		cg = iterator->elem;
>  
> -		if (lxc_cgroup_set_bypath(cgpath, cg->subsystem, cg->value)) {
> -			ERROR("Error setting %s to %s for %s\n", cg->subsystem,
> -				cg->value, cgpath);
> -			goto out;
> +		if (devices == !strncmp("devices", cg->subsystem, 7)) {
> +			if (lxc_cgroup_set_bypath(cgpath, cg->subsystem,
> +			    cg->value)) {
> +				ERROR("Error setting %s to %s for %s\n",
> +				      cg->subsystem, cg->value, cgpath);
> +				goto out;
> +			}
>  		}
>  
>  		DEBUG("cgroup '%s' set to '%s'", cg->subsystem, cg->value);
> @@ -1429,6 +1432,16 @@ out:
>  	return ret;
>  }
>  
> +int setup_cgroup_devices(const char *cgpath, struct lxc_list *cgroups)
> +{
> +	return _setup_cgroup(cgpath, cgroups, 1);
> +}
> +
> +int setup_cgroup(const char *cgpath, struct lxc_list *cgroups)
> +{
> +	return _setup_cgroup(cgpath, cgroups, 0);
> +}
> +
>  static void parse_mntopt(char *opt, unsigned long *flags, char **data)
>  {
>  	struct mount_opt *mo;
> diff --git a/src/lxc/conf.h b/src/lxc/conf.h
> index 465b1ec..8180e18 100644
> --- a/src/lxc/conf.h
> +++ b/src/lxc/conf.h
> @@ -287,6 +287,7 @@ struct lxc_conf {
>  int run_lxc_hooks(const char *name, char *hook, struct lxc_conf *conf);
>  
>  extern int setup_cgroup(const char *cgpath, struct lxc_list *cgroups);
> +extern int setup_cgroup_devices(const char *cgpath, struct lxc_list *cgroups);
>  extern int detect_shared_rootfs(void);
>  
>  /*
> @@ -313,8 +314,6 @@ extern int lxc_clear_cgroups(struct lxc_conf *c, const char *key);
>  extern int lxc_clear_mount_entries(struct lxc_conf *c);
>  extern int lxc_clear_hooks(struct lxc_conf *c, const char *key);
>  
> -extern int setup_cgroup(const char *name, struct lxc_list *cgroups);
> -
>  extern int uid_shift_ttys(int pid, struct lxc_conf *conf);
>  
>  /*
> diff --git a/src/lxc/start.c b/src/lxc/start.c
> index fd96d4f..cf5f9bd 100644
> --- a/src/lxc/start.c
> +++ b/src/lxc/start.c
> @@ -809,6 +809,11 @@ int lxc_spawn(struct lxc_handler *handler)
>  	if ((handler->cgroup = lxc_cgroup_path_create(NULL, name)) == NULL)
>  		goto out_delete_net;
>  
> +	if (setup_cgroup(handler->cgroup, &handler->conf->cgroup)) {
> +		ERROR("failed to setup the cgroups for '%s'", name);
> +		goto out_delete_net;
> +	}
> +
>  	if (lxc_cgroup_enter(handler->cgroup, handler->pid) < 0)
>  		goto out_delete_net;
>  
> @@ -839,12 +844,11 @@ int lxc_spawn(struct lxc_handler *handler)
>  	if (lxc_sync_barrier_child(handler, LXC_SYNC_POST_CONFIGURE))
>  		goto out_delete_net;
>  
> -	if (setup_cgroup(handler->cgroup, &handler->conf->cgroup)) {
> -		ERROR("failed to setup the cgroups for '%s'", name);
> +	if (setup_cgroup_devices(handler->cgroup, &handler->conf->cgroup)) {
> +		ERROR("failed to setup the devices cgroup for '%s'", name);
>  		goto out_delete_net;
>  	}
>  
> -
>  	/* Tell the child to complete its initialization and wait for
>  	 * it to exec or return an error.  (the child will never
>  	 * return LXC_SYNC_POST_CGROUP+1.  It will either close the
> -- 
> 1.8.1.4
> 




More information about the lxc-devel mailing list