[lxc-devel] [PATCH] cgmanager: fix 'attach' with "all" controller support

Stéphane Graber stgraber at ubuntu.com
Sun Nov 2 21:58:48 UTC 2014


On Sun, Nov 02, 2014 at 02:01:18PM +0000, Serge Hallyn wrote:
> "all" is not a supported keyword for cgmanager's get_pid_cgroup.
> Pass the first mounted cgroup subsystem instead of passing "all" when
> getting the container's cgorup to attach to.
> 
> Also, make sure that the target cgroup is in fact in all identical
> cgroups before attaching with 'all".  If not, then we must attach to
> each cgroup separately, or else we will not be in all the same cgroups
> as the target container.
> 
> Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>

Acked-by: Stéphane Graber <stgraber at ubuntu.com>

> ---
>  src/lxc/cgmanager.c | 28 +++++++++++++++++++++++-----
>  1 file changed, 23 insertions(+), 5 deletions(-)
> 
> diff --git a/src/lxc/cgmanager.c b/src/lxc/cgmanager.c
> index 4e26cc0..00ef75b 100644
> --- a/src/lxc/cgmanager.c
> +++ b/src/lxc/cgmanager.c
> @@ -189,11 +189,22 @@ static bool cgm_supports_multiple_controllers;
>   */
>  static bool cgm_all_controllers_same;
>  
> -static void check_supports_multiple_controllers(void)
> +/*
> + * Check whether we can use "all" when talking to cgmanager.
> + * We check two things:
> + * 1. whether cgmanager is new enough to support this.
> + * 2. whether the task we are interested in is in the same
> + *    cgroup for all controllers.
> + * In cgm_init (before an lxc-start) we care about our own
> + * cgroup.  In cgm_attach, we care about the target task's
> + * cgroup.
> + */
> +static void check_supports_multiple_controllers(pid_t pid)
>  {
>  	FILE *f;
>  	char *line = NULL, *prevpath = NULL;
>  	size_t sz = 0;
> +	char path[100];
>  
>  	cgm_supports_multiple_controllers = false;
>  	cgm_all_controllers_same = false;
> @@ -205,7 +216,11 @@ static void check_supports_multiple_controllers(void)
>  
>  	cgm_supports_multiple_controllers = true;
>  
> -	f = fopen("/proc/self/cgroup", "r");
> +	if (pid == -1)
> +		sprintf(path, "/proc/self/cgroup");
> +	else
> +		sprintf(path, "/proc/%d/cgroup", pid);
> +	f = fopen(path, "r");
>  	if (!f)
>  		return;
>  
> @@ -517,7 +532,7 @@ static void *cgm_init(const char *name)
>  		return NULL;
>  	}
>  
> -	check_supports_multiple_controllers();
> +	check_supports_multiple_controllers(-1);
>  
>  	d = malloc(sizeof(*d));
>  	if (!d) {
> @@ -1289,13 +1304,16 @@ static bool cgm_attach(const char *name, const char *lxcpath, pid_t pid)
>  		return false;
>  	}
>  
> -	check_supports_multiple_controllers();
> +	check_supports_multiple_controllers(pid);
>  
>  	if (cgm_all_controllers_same)
>  		slist = subsystems_inone;
>  
>  	for (i = 0; slist[i]; i++) {
> -		cgroup = try_get_abs_cgroup(name, lxcpath, slist[i]);
> +		if (slist == subsystems_inone)
> +			cgroup = try_get_abs_cgroup(name, lxcpath, subsystems[0]);
> +		else
> +			cgroup = try_get_abs_cgroup(name, lxcpath, slist[i]);
>  		if (!cgroup) {
>  			ERROR("Failed to get cgroup for controller %s", slist[i]);
>  			cgm_dbus_disconnect();
> -- 
> 2.1.0
> 
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel

-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20141102/e5c24944/attachment.sig>


More information about the lxc-devel mailing list