[CRIU] [PATCH] page-xfer: Sanitize xfer core routine (v2)

Pavel Emelyanov xemul at virtuozzo.com
Thu Jun 29 13:30:56 MSK 2017


Make it call .write_pagemap once and decide whether or not to
call .write_pages based on the flags caluculated in one place
as well.

v2: Slightly reshuffle code in ppb_xfer_flags and added a 
    comment as suggested by Mike.

Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
---
 criu/page-xfer.c | 28 +++++++++++++++++-----------
 1 file changed, 17 insertions(+), 11 deletions(-)

diff --git a/criu/page-xfer.c b/criu/page-xfer.c
index 10da75f..24fc565 100644
--- a/criu/page-xfer.c
+++ b/criu/page-xfer.c
@@ -405,6 +405,19 @@ static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp,
 	return 0;
 }
 
+static inline u32 ppb_xfer_flags(struct page_xfer *xfer, struct page_pipe_buf *ppb)
+{
+	if (ppb->flags & PPB_LAZY)
+		/*
+		 * Pages that can be lazily restored are always marked as such.
+		 * In the case we actually transfer them into image mark them
+		 * as present as well.
+		 */
+		return (xfer->transfer_lazy ? PE_PRESENT : 0) | PE_LAZY;
+	else
+		return PE_PRESENT;
+}
+
 int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp)
 {
 	struct page_pipe_buf *ppb;
@@ -420,7 +433,7 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp)
 
 		for (i = 0; i < ppb->nr_segs; i++) {
 			struct iovec iov = ppb->iov[i];
-			u32 flags = PE_PRESENT;
+			u32 flags;
 
 			ret = dump_holes(xfer, pp, &cur_hole, iov.iov_base);
 			if (ret)
@@ -431,19 +444,12 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp)
 			pr_debug("\tp %p [%u]\n", iov.iov_base,
 					(unsigned int)(iov.iov_len / PAGE_SIZE));
 
-			if (ppb->flags & PPB_LAZY) {
-				if (!xfer->transfer_lazy) {
-					if (xfer->write_pagemap(xfer, &iov, PE_LAZY))
-						return -1;
-					continue;
-				} else {
-					flags |= PE_LAZY;
-				}
-			}
+			flags = ppb_xfer_flags(xfer, ppb);
 
 			if (xfer->write_pagemap(xfer, &iov, flags))
 				return -1;
-			if (xfer->write_pages(xfer, ppb->p[0], iov.iov_len))
+			if ((flags & PE_PRESENT) && xfer->write_pages(xfer,
+						ppb->p[0], iov.iov_len))
 				return -1;
 		}
 	}
-- 
2.1.4



More information about the CRIU mailing list