[CRIU] [PATCH 1/2] page-server: Fix incompatibility of page server protocol

Andrei Vagin avagin at virtuozzo.com
Sat Jul 29 08:09:06 MSK 2017


Applied, thanks!
On Fri, Jul 14, 2017 at 06:30:57PM +0300, Pavel Emelyanov wrote:
> It turned out (surprise surprise) that page server exchanges CR_FD_PAGEMAP
> and CR_FD_SHMEM_PAGEMAP values in ps_iov_msg. The problem is that these
> constants sit in enum and change their values from version to version %)
> 
> So here's the fixed version of the protocol including the backward compat
> checks on all the values that could be met from older CRIUs (we're lucky
> and they didn't intersect).
> 
> Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
> ---
>  criu/page-xfer.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 58 insertions(+), 1 deletion(-)
> 
> diff --git a/criu/page-xfer.c b/criu/page-xfer.c
> index d949c06..56d1853 100644
> --- a/criu/page-xfer.c
> +++ b/criu/page-xfer.c
> @@ -54,14 +54,61 @@ static void psi2iovec(struct page_server_iov *ps, struct iovec *iov)
>  #define PS_TYPE_BITS	8
>  #define PS_TYPE_MASK	((1 << PS_TYPE_BITS) - 1)
>  
> +#define PS_TYPE_PID	(1)
> +#define PS_TYPE_SHMEM	(2)
> +/*
> + * XXX: When adding new types here check decode_pm_type for legacy
> + * numbers that can be met from older CRIUs
> + */
> +
>  static inline u64 encode_pm_id(int type, long id)
>  {
> +	if (type == CR_FD_PAGEMAP)
> +		type = PS_TYPE_PID;
> +	else if (type == CR_FD_SHMEM_PAGEMAP)
> +		type = PS_TYPE_SHMEM;
> +	else {
> +		BUG();
> +		return 0;
> +	}
> +
>  	return ((u64)id) << PS_TYPE_BITS | type;
>  }
>  
>  static int decode_pm_type(u64 dst_id)
>  {
> -	return dst_id & PS_TYPE_MASK;
> +	int type;
> +
> +	/*
> +	 * Magic numbers below came from the older CRIU versions that
> +	 * errorneously used the changing CR_FD_* constants. The
> +	 * changes were made when we merged images together and moved
> +	 * the CR_FD_-s at the tail of the enum
> +	 */
> +	type = dst_id & PS_TYPE_MASK;
> +	switch (type) {
> +	case 10: /* 3.1 3.2 */
> +	case 11: /* 1.3 1.4 1.5 1.6 1.7 1.8 2.* 3.0 */
> +	case 16: /* 1.2 */
> +	case 17: /* 1.0 1.1 */
> +	case PS_TYPE_PID:
> +		type = CR_FD_PAGEMAP;
> +		break;
> +	case 27: /* 1.3 */
> +	case 28: /* 1.4 1.5 */
> +	case 29: /* 1.6 1.7 */
> +	case 32: /* 1.2 1.8 */
> +	case 33: /* 1.0 1.1 3.1 3.2 */
> +	case 34: /* 2.* 3.0 */
> +	case PS_TYPE_SHMEM:
> +		type = CR_FD_SHMEM_PAGEMAP;
> +		break;
> +	default:
> +		type = -1;
> +		break;
> +	}
> +
> +	return type;
>  }
>  
>  static long decode_pm_id(u64 dst_id)
> @@ -497,6 +544,11 @@ static int page_server_check_parent(int sk, struct page_server_iov *pi)
>  	type = decode_pm_type(pi->dst_id);
>  	id = decode_pm_id(pi->dst_id);
>  
> +	if (type == -1) {
> +		pr_err("Unknown pagemap type received\n");
> +		return -1;
> +	}
> +
>  	ret = check_parent_local_xfer(type, id);
>  	if (ret < 0)
>  		return -1;
> @@ -571,6 +623,11 @@ static int page_server_open(int sk, struct page_server_iov *pi)
>  
>  	type = decode_pm_type(pi->dst_id);
>  	id = decode_pm_id(pi->dst_id);
> +	if (type == -1) {
> +		pr_err("Unknown pagemap type received\n");
> +		return -1;
> +	}
> +
>  	pr_info("Opening %d/%ld\n", type, id);
>  
>  	page_server_close();
> -- 
> 2.1.4
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu


More information about the CRIU mailing list