[CRIU] [PATCH 2/2] Make lacking cgroup properties non-fatal

Andrew Vagin avagin at parallels.com
Wed Aug 13 12:43:49 PDT 2014


On Wed, Aug 13, 2014 at 11:59:33AM -0700, gbellack at google.com wrote:
> From: Garrison Bellack <gbellack at google.com>
> 
> Because different kernel versions have different cgroup properties, criu
> shouldn't crash just because the properties statically listed aren't exact.
> Instead, during dump, ignore properties the kernel doesn't have and continue.
> In addition, during restore, in the event of migration to a kernel that is
> missing a property that was dumped, print an error but continue.

I am not sure that we can continue in this case. Why do you think that
it's safe? I think we need to ask a user about this. So can we add a new
option to allow continuing in this case?

> 
> Change-Id: I5a8b93d6a8a3a9664914f10cf8e2110340dd8b31
> Signed-off-by: Garrison Bellack <gbellack at google.com>
> ---
>  cgroup.c | 40 ++++++++++++++++++++++++++--------------
>  1 file changed, 26 insertions(+), 14 deletions(-)
> 
> diff --git a/cgroup.c b/cgroup.c
> index f8dbbde..b727a50 100644
> --- a/cgroup.c
> +++ b/cgroup.c
> @@ -284,35 +284,30 @@ static int find_dir(const char *path, struct list_head *dirs, struct cgroup_dir
>   * Currently this function only supports properties that have 1 value, under 100
>   * chars
>   */
> -static int read_cgroup_prop(struct cgroup_prop *property, const char *fpath)
> +static int read_cgroup_prop(struct cgroup_prop *property, const char *fullpath)
>  {
> -	char pbuf[PATH_MAX], buf[100];
> +	char buf[100];
>  	FILE *f;
>  	char *endptr;
>  
> -	if (snprintf(pbuf, PATH_MAX, "%s/%s", fpath, property->name) >= PATH_MAX) {
> -		pr_err("snprintf output was truncated");
> -		return -1;
> -	}
> -
> -	f = fopen(pbuf, "r");
> +	f = fopen(fullpath, "r");
>  	if (!f) {
> -		pr_err("Failed opening %s\n", pbuf);
>  		property->value = NULL;
> +		pr_perror("Failed opening %s\n", fullpath);
>  		return -1;
>  	}
>  
>  	memset(buf, 0, sizeof(buf));
>  	if (fread(buf, sizeof(buf), 1, f) != 1) {
>  		if (!feof(f)) {
> -			pr_err("Failed scanning %s\n", pbuf);
> +			pr_err("Failed scanning %s\n", fullpath);
>  			fclose(f);
>  			return -1;
>  		}
>  	}
>  
>  	if (fclose(f) != 0) {
> -		pr_err("Failed closing %s\n", pbuf);
> +		pr_err("Failed closing %s\n", fullpath);
>  		return -1;
>  	}
>  
> @@ -390,6 +385,7 @@ static int add_cgroup_properties(const char *fpath, struct cgroup_dir *ncd,
>  				 struct cg_controller *controller)
>  {
>  	int i, j;
> +	char buf[PATH_MAX];
>  	struct cgroup_prop *prop;
>  
>  	for (i = 0; i < controller->n_controllers; ++i) {
> @@ -397,16 +393,28 @@ static int add_cgroup_properties(const char *fpath, struct cgroup_dir *ncd,
>  		const char **prop_arr = get_known_properties(controller->controllers[i]);
>  
>  		for (j = 0; prop_arr != NULL && prop_arr[j] != NULL; ++j) {
> +			if (snprintf(buf, PATH_MAX, "%s/%s", fpath, prop_arr[j]) >= PATH_MAX) {
> +				pr_err("snprintf output was truncated");
> +				return -1;
> +			}
> +
> +			if (access(buf, F_OK) < 0 && errno == ENOENT) {
> +				pr_info("Couldn't open %s. This cgroup property may not exist on this kernel\n", buf);
> +				continue;
> +			}
> +
>  			prop = create_cgroup_prop(prop_arr[j]);
>  			if (!prop) {
>  				free_all_cgroup_props(ncd);
>  				return -1;
>  			}
> -			if (read_cgroup_prop(prop, fpath) < 0) {
> +
> +			if (read_cgroup_prop(prop, buf) < 0) {
>  				free_cgroup_prop(prop);
>  				free_all_cgroup_props(ncd);
>  				return -1;
>  			}
> +
>  			pr_info("Dumping value %s from %s/%s\n", prop->value, fpath, prop->name);
>  			list_add_tail(&prop->list, &ncd->properties);
>  			ncd->n_properties++;
> @@ -924,8 +932,12 @@ static int restore_cgroup_prop(const CgroupPropEntry * cg_prop_entry_p,
>  
>  	f = fopenat(cg, path, "w+");
>  	if (!f) {
> -		pr_perror("Failed opening %s for writing\n", path);
> -		return -1;
> +		if (errno != ENOENT) {
> +			pr_perror("Failed opening %s\n", path);
> +			return -1;
> +		}
> +		pr_perror("Couldn't open %s. This cgroup property may not exist on this kernel\n", path);
> +		return 0;
>  	}
>  
>  	if (fprintf(f, "%s", cg_prop_entry_p->value) < 0) {
> -- 
> 2.1.0.rc2.206.gedb03e5
> 
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu


More information about the CRIU mailing list