From c5f8748b7239bdae65a8beeb6329a547781f0df9 Mon Sep 17 00:00:00 2001 From: Cyrill Gorcunov Date: Fri, 10 Aug 2018 18:00:51 +0300 Subject: [PATCH] page-xfer: Handle partial splicing In case if pipe buffers are full the splicing may wakeup reader first with incomplete data transfer. Thus splice data in cycle. Signed-off-by: Cyrill Gorcunov Acked-by: Mike Rapoport Signed-off-by: Andrei Vagin --- criu/page-xfer.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/criu/page-xfer.c b/criu/page-xfer.c index e653de5b3..81a7dfd4a 100644 --- a/criu/page-xfer.c +++ b/criu/page-xfer.c @@ -147,11 +147,19 @@ static inline int send_psi(int sk, struct page_server_iov *pi) static int write_pages_to_server(struct page_xfer *xfer, int p, unsigned long len) { + ssize_t ret, left = len; + pr_debug("Splicing %lu bytes / %lu pages into socket\n", len, len / PAGE_SIZE); - if (splice(p, NULL, xfer->sk, NULL, len, SPLICE_F_MOVE) != len) { - pr_perror("Can't write pages to socket"); - return -1; + while (left > 0) { + ret = splice(p, NULL, xfer->sk, NULL, left, SPLICE_F_MOVE); + if (ret < 0) { + pr_perror("Can't write pages to socket"); + return -1; + } + + pr_debug("\tSpliced: %lu bytes sent\n", (unsigned long)ret); + left -= ret; } return 0;