[CRIU] [PATCH 4/4] cg: A helper for getting controller's yard dir name (and opts)

Tycho Andersen tycho.andersen at canonical.com
Tue Aug 12 07:20:49 PDT 2014


On Tue, Aug 12, 2014 at 05:19:32PM +0400, Pavel Emelyanov wrote:
> Signed-off-by: Pavel Emelyanov <xemul at parallels.com>

Acked-by: Tycho Andersen <tycho.andersen at canonical.com>

> ---
>  cgroup.c | 79 +++++++++++++++++++++++++++++++++-------------------------------
>  1 file changed, 41 insertions(+), 38 deletions(-)
> 
> diff --git a/cgroup.c b/cgroup.c
> index f774a42..2409136 100644
> --- a/cgroup.c
> +++ b/cgroup.c
> @@ -815,6 +815,37 @@ int dump_cgroups(void)
>  	return pb_write_one(fdset_fd(glob_fdset, CR_FD_CGROUP), &cg, PB_CGROUP);
>  }
>  
> +static int ctrl_dir_and_opt(CgControllerEntry *ctl, char *dir, int ds,
> +		char *opt, int os)
> +{
> +	int i, doff = 0, ooff = 0;
> +	bool none_opt = false;
> +
> +	for (i = 0; i < ctl->n_cnames; i++) {
> +		char *n;
> +
> +		n = ctl->cnames[i];
> +		if (strstartswith(n, "name=")) {
> +			n += 5;
> +			if (opt && !none_opt) {
> +				ooff += snprintf(opt + ooff, os - ooff, "none,");
> +				none_opt = true;
> +			}
> +		}
> +
> +		doff += snprintf(dir + doff, ds - doff, "%s,", n);
> +		if (opt)
> +			ooff += snprintf(opt + ooff, os - ooff, "%s,", ctl->cnames[i]);
> +	}
> +
> +	/* Chop the trailing ','-s */
> +	dir[--doff] = '\0';
> +	if (opt)
> +		opt[ooff - 1] = '\0';
> +
> +	return doff;
> +}
> +
>  static int move_in_cgroup(CgSetEntry *se)
>  {
>  	int cg, i;
> @@ -840,21 +871,8 @@ static int move_in_cgroup(CgSetEntry *se)
>  			return -1;
>  		}
>  
> -		aux_off = 0;
> -		for (j = 0; j < ctrl->n_cnames; j++) {
> -			char *name;
> -			if (strstartswith(ctrl->cnames[j], "name="))
> -				name = ctrl->cnames[j] + 5;
> -			else
> -				name = ctrl->cnames[j];
> -			aux_off += snprintf(aux + aux_off, sizeof(aux) - aux_off, "%s,", name);
> -		}
> -
> -		/* Chop off the last ','. */
> -		aux_off -= 1;
> -
> +		aux_off = ctrl_dir_and_opt(ctrl, aux, sizeof(aux), NULL, 0);
>  		snprintf(aux + aux_off, sizeof(aux) - aux_off, "/%s/tasks", ce->path);
> -
>  		pr_debug("  `-> %s\n", aux);
>  		err = fd = openat(cg, aux, O_WRONLY);
>  		if (fd >= 0) {
> @@ -1120,38 +1138,23 @@ static int prepare_cgroup_sfd(CgroupEntry *ce)
>  		goto err;
>  	}
>  
> +	paux[off++] = '/';
> +
>  	for (i = 0; i < ce->n_controllers; i++) {
> +		int ctl_off = off;
> +		char opt[128];
>  		CgControllerEntry *ctrl = ce->controllers[i];
> -		int j, name_off, opt_off;
> -		char name[1024], opt[1024];
>  
>  		if (ctrl->n_cnames < 1) {
>  			pr_err("Each cg_controller_entry must have at least 1 controller");
>  			goto err;
>  		}
>  
> -		opt_off = 0;
> -		if (strstartswith(ctrl->cnames[0], "name="))
> -			opt_off = sprintf(opt, "none,");
> -
> -		name_off = 0;
> -		for (j = 0; j < ctrl->n_cnames; j++) {
> -			char *n = ctrl->cnames[j];
> -
> -			if (strstartswith(ctrl->cnames[j], "name="))
> -				n += 5;
> -
> -			name_off += sprintf(name + name_off, "%s,", n);
> -			opt_off += sprintf(opt + opt_off, "%s,", ctrl->cnames[j]);
> -		}
> -
> -		/* Chop off the last ',' to keep mount() happy. */
> -		opt[strlen(opt) - 1] = '\0';
> -		name[strlen(name) - 1] = '\0';
> -
> -		name_off = sprintf(paux + off, "/%s", name);
> +		ctl_off += ctrl_dir_and_opt(ctrl,
> +				paux + ctl_off, sizeof(paux) - ctl_off,
> +				opt, sizeof(opt));
>  
> -		pr_debug("\tMaking subdir %s\n", paux);
> +		pr_debug("\tMaking subdir %s (%s)\n", paux, opt);
>  		if (mkdir(paux, 0700)) {
>  			pr_perror("Can't make cgyard subdir %s", paux);
>  			goto err;
> @@ -1163,7 +1166,7 @@ static int prepare_cgroup_sfd(CgroupEntry *ce)
>  		}
>  
>  		if (opts.manage_cgroups &&
> -		    prepare_cgroup_dirs(paux, off + name_off, ctrl->dirs, ctrl->n_dirs))
> +		    prepare_cgroup_dirs(paux, ctl_off, ctrl->dirs, ctrl->n_dirs))
>  			goto err;
>  
>  	}
> -- 
> 1.8.4.2
> 
> 
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu


More information about the CRIU mailing list