[CRIU] [PATCH 5/9] Handle vmsplice failure for read mode pre-dump
Abhishek Dubey
dubeyabhishek777 at gmail.com
Sun Sep 22 07:24:54 MSK 2019
vmsplice fails to completely splice 2^k pages
from user-buffer to ppb pipes. Sometimes last
page is partially spliced.
To overcome this, page count for splicing is
kept 1 less than the size of pipe.
Signed-off-by: Abhishek Dubey <dubeyabhishek777 at gmail.com>
---
criu/page-pipe.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/criu/page-pipe.c b/criu/page-pipe.c
index a821696..e60dd85 100644
--- a/criu/page-pipe.c
+++ b/criu/page-pipe.c
@@ -40,6 +40,22 @@ static int __ppb_resize_pipe(struct page_pipe_buf *ppb, unsigned long new_size)
ret /= PAGE_SIZE;
BUG_ON(ret < ppb->pipe_size);
+ /*
+ * TODO: Investigate and handle
+ * Sometimes vmsplice fails to splice N pages(where N=2^k)
+ * from user buffer to pipe, so restricting page-pipe
+ * capacity to accommodate N-1 pages.
+ * e.g. Pipe size can be 512 pages, but it's filled till
+ * 511 pages.
+ *
+ * Steps to reproduce issue:
+ * 1. Comment-out next two lines following this comment
+ * 2. Run maps007/maps004 from transitive tests with
+ * --pre-dump-mode=read option
+ */
+ if (opts.pre_dump_mode == PRE_DUMP_READ)
+ ret -= 1;
+
pr_debug("Grow pipe %x -> %x\n", ppb->pipe_size, ret);
ppb->pipe_size = ret;
--
2.7.4
More information about the CRIU
mailing list