[CRIU] [PATCH] [RFC] tcp: split packets if it can't be restored with the ENOMEM error

Andrew Vagin avagin at parallels.com
Fri Nov 21 05:50:30 PST 2014


Pls, ignore this patch. I need to investigate a problem deeper.

On Fri, Nov 21, 2014 at 12:40:06AM +0300, Andrey Vagin wrote:
> Currently CRIU restore fails if a packet can't be restored.
> (00.000164) Error (sysctl.c:194): Can't open sysctl net/ipv4/tcp_wmem: No such file or directory
> (00.019311)     95: Error (sk-tcp.c:477): Can't restore 1 queue data (-1), want (1534662:1534662): Cannot allocate memory
> (00.019969) Error (cr-restore.c:1838): Restoring FAILED.
> 
> This patch splits packets and tries to restore them again.
> 
> Reported-by: Mr Jenkins
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
>  sk-tcp.c | 15 +++++++++++++++
>  1 file changed, 15 insertions(+)
> 
> diff --git a/sk-tcp.c b/sk-tcp.c
> index eb6dd15..f2b03c2 100644
> --- a/sk-tcp.c
> +++ b/sk-tcp.c
> @@ -472,6 +472,21 @@ static int __send_tcp_queue(int sk, int queue, u32 len, struct cr_img *img)
>  		int chunk = (len > max ? max : len);
>  
>  		ret = send(sk, buf + off, chunk, 0);
> +		if (ret == -1 && errno == ENOMEM && max > 0) {
> +			/*
> +			 * The maximum value is set for per-socket limits,
> +			 * send() fails due to global limits, so we can fixup
> +			 * maximum size of packet for all socket.
> +			 */
> +			if (queue == TCP_SEND_QUEUE) {
> +				kdat.tcp_max_wshare >>= 1;
> +				max = kdat.tcp_max_wshare;
> +			} else {
> +				kdat.tcp_max_rshare >>= 1;
> +				max = kdat.tcp_max_rshare;
> +			}
> +			continue;
> +		}
>  		if (ret != chunk) {
>  			pr_perror("Can't restore %d queue data (%d), want (%d:%d)",
>  				  queue, ret, chunk, len);
> -- 
> 1.9.3
> 


More information about the CRIU mailing list