[CRIU] Re: [PATCH cr 2/2] sk-queue: use write/read instread of sendfile

Pavel Emelyanov xemul at parallels.com
Fri Sep 28 08:39:37 EDT 2012


On 09/28/2012 08:37 PM, Andrey Vagin wrote:
> sendfile uses sendpage() and all data are splitted on pages and
> a new skb is allocated for each page. It creates a big overhead on SNDBUF.
> 
> sendfile() isn't suatable for DGRAM sockets, because message boundaries
> should be saved.
> 
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
>  sk-queue.c |   28 ++++++++++++++++++++++++++--
>  1 files changed, 26 insertions(+), 2 deletions(-)
> 
> diff --git a/sk-queue.c b/sk-queue.c
> index 6cc2153..f8394b8 100644
> --- a/sk-queue.c
> +++ b/sk-queue.c
> @@ -209,6 +209,7 @@ int restore_sk_queue(int fd, unsigned int peer_id)
>  
>  	list_for_each_entry_safe(pkt, tmp, &packets_list, list) {
>  		SkPacketEntry *entry = pkt->entry;
> +		char *buf;
>  
>  		if (entry->id_for != peer_id)
>  			continue;
> @@ -216,9 +217,32 @@ int restore_sk_queue(int fd, unsigned int peer_id)
>  		pr_info("\tRestoring %d-bytes skb for %u\n",
>  			(unsigned int)entry->length, peer_id);
>  
> -		ret = sendfile(fd, img_fd, &pkt->img_off, entry->length);
> +		/*
> +		 * Don't try to use sendfile here, because it use sendpage() and
> +		 * all data are splitted on pages and a new skb is allocated for
> +		 * each page. It creates a big overhead on SNDBUF.
> +		 * sendfile() isn't suatable for DGRAM sockets, because message
> +		 * boundaries messages should be saved.
> +		 */
> +
> +		buf = xmalloc(entry->length);
> +		if (buf ==NULL)
> +			return -1;
> +
> +		if (lseek(img_fd, pkt->img_off, SEEK_SET) == -1) {

Please, no lseeks. This makes piplined migration impossible.

> +			pr_perror("lseek() failed");
> +			xfree(buf);
> +			return -1;
> +		}
> +		if (read_img_buf(img_fd, buf, entry->length) != 1) {
> +			xfree(buf);
> +			return -1;
> +		}
> +
> +		ret = write(fd, buf, entry->length);
> +		xfree(buf);
>  		if (ret < 0) {
> -			pr_perror("Failed to sendfile packet");
> +			pr_perror("Failed to send packet");
>  			return -1;
>  		}
>  		if (ret != entry->length) {



More information about the CRIU mailing list