[CRIU] Re: [RFC 0/4] Lets try PB again

Pavel Emelyanov xemul at parallels.com
Fri Jul 6 08:21:25 EDT 2012


On 07/06/2012 04:10 PM, Cyrill Gorcunov wrote:
> Hi guys, here is another attempt for PB sake. Take a look,
> I'm converting reg-files now but wanted to share the code
> early.
> 
> 

I definitely like it :) Few questions a comments:

> @@ -206,13 +208,15 @@ int prepare_fd_pid(int pid, struct rst_info *rst_info)
>  	}
>  
>  	while (1) {
> -		struct fdinfo_entry e;
> +		FdinfoEntry *e;
>  
> -		ret = read_img_eof(fdinfo_fd, &e);
> +		ret = pb_read_eof(fdinfo_fd, &e, fdinfo_entry__unpack);
>  		if (ret <= 0)
>  			break;
>  
> -		ret = collect_fd(pid, &e, rst_info);
> +		ret = collect_fd(pid, e, rst_info);
> +		fdinfo_entry__free_unpacked(e, NULL);
> +
>  		if (ret < 0)
>  			break;
>  	}

Is there a way to unpack an object into a static buffer rather than
allocating one dynamically?

> -err:
> -	return ret;
> +	return pb_write(fdset_fd(cr_fdset, CR_FD_FDINFO), &e,
> +			fdinfo_entry__get_packed_size,
> +			fdinfo_entry__pack);

I'd appreciate if this looked like

pc_write(fd, &e, fdinfo_entry);

where __get_packet_size and __pack are concatenated inside the macro

> +#define pb_read_op(__fd, __obj_pptr, __unpack, __op)				\
> +({										\
> +	int __ret = -1;								\
> +	u32 __size;								\
> +	u8 *__buf;								\
> +										\
> +	__ret = read_img ##__op(__fd, &__size);					\
> +	if (__ret > 0) {							\
> +		__buf = xmalloc(__size);					\
> +		if (__buf) {							\
> +			__ret = read_img_buf(__fd, __buf, __size);		\
> +			if (__ret > 0)						\
> +				*(__obj_pptr) = __unpack(NULL, __size, __buf);	\
> +			xfree(__buf);						\
> +		} else								\
> +			__ret = -1;						\
> +	}									\
> +										\
> +	__ret;									\
> +})
> +#define pb_write(__fd, __obj_ptr, __get_pksize, __pack)				\
> +({										\
> +	u32 __size = __get_pksize(__obj_ptr);					\
> +	u8 *__buf = xmalloc(__size);						\
> +	int __ret = -1;								\
> +										\
> +	if (__buf) {								\
> +		__pack(__obj_ptr, __buf);					\
> +		__ret = write_img(__fd, &__size);				\
> +		if (!__ret)							\
> +			__ret = write_img_buf(__fd, __buf, __size);		\
> +		xfree(__buf);							\
> +	}									\
> +										\
> +	__ret;									\
> +})

That's too big for a macro. Turn it into a macro + outlined function.


More information about the CRIU mailing list