mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-08-03 23:33:01 +00:00
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 <gorcunov@gmail.com> Acked-by: Mike Rapoport <rppt@linux.vnet.ibm.com> Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
This commit is contained in:
parent
1c37c0d46b
commit
c5f8748b72
1 changed files with 11 additions and 3 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue