[CRIU] [PATCH 10/13] page-xfer: Move iov offset on xfer

Pavel Emelyanov xemul at virtuozzo.com
Thu Jul 6 12:40:56 MSK 2017


The offset in question is used by shmem dumping code to dump
memory segments relative to shmem segment start, no to task
mapping start. The offset value is now the part of the xfer
callback and is typically 0 :) Let's keep this on xfer object
to simplify the xfer API.

Acked-by: Mike Rapoport <rppt at linux.vnet.ibm.com>
Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
---
 criu/cr-dump.c           |  2 +-
 criu/include/page-xfer.h |  9 +++++++--
 criu/mem.c               |  2 +-
 criu/page-xfer.c         | 22 ++++++++++++----------
 criu/shmem.c             | 10 ++++++----
 5 files changed, 27 insertions(+), 18 deletions(-)

diff --git a/criu/cr-dump.c b/criu/cr-dump.c
index 308cc4e..98edf17 100644
--- a/criu/cr-dump.c
+++ b/criu/cr-dump.c
@@ -1574,7 +1574,7 @@ static int cr_pre_dump_finish(int ret)
 			goto err;
 
 		mem_pp = dmpi(item)->mem_pp;
-		ret = page_xfer_dump_pages(&xfer, mem_pp, 0, true);
+		ret = page_xfer_dump_pages(&xfer, mem_pp, true);
 
 		xfer.close(&xfer);
 
diff --git a/criu/include/page-xfer.h b/criu/include/page-xfer.h
index 1a00d9c..38ea59c 100644
--- a/criu/include/page-xfer.h
+++ b/criu/include/page-xfer.h
@@ -22,6 +22,12 @@ struct page_xfer {
 	int (*write_pages)(struct page_xfer *self, int pipe, unsigned long len);
 	void (*close)(struct page_xfer *self);
 
+	/*
+	 * In case we need to dump pagemaps not as-is, but
+	 * relative to some address. Used, e.g. by shmem.
+	 */
+	unsigned long offset;
+
 	/* private data for every page-xfer engine */
 	union {
 		struct /* local */ {
@@ -40,8 +46,7 @@ struct page_xfer {
 
 extern int open_page_xfer(struct page_xfer *xfer, int fd_type, long id);
 struct page_pipe;
-extern int page_xfer_dump_pages(struct page_xfer *, struct page_pipe *,
-				unsigned long off, bool dump_lazy);
+extern int page_xfer_dump_pages(struct page_xfer *, struct page_pipe *, bool dump_lazy);
 extern int connect_to_page_server_to_send(void);
 extern int connect_to_page_server_to_recv(int epfd);
 extern int disconnect_from_page_server(void);
diff --git a/criu/mem.c b/criu/mem.c
index d9bf1cd..4b4b3c8 100644
--- a/criu/mem.c
+++ b/criu/mem.c
@@ -284,7 +284,7 @@ static int xfer_pages(struct page_pipe *pp, struct page_xfer *xfer, bool lazy)
 	 *           pre-dump action (see pre_dump_one_task)
 	 */
 	timing_start(TIME_MEMWRITE);
-	ret = page_xfer_dump_pages(xfer, pp, 0, !lazy);
+	ret = page_xfer_dump_pages(xfer, pp, !lazy);
 	timing_stop(TIME_MEMWRITE);
 
 	return ret;
diff --git a/criu/page-xfer.c b/criu/page-xfer.c
index 41a0e68..91398e7 100644
--- a/criu/page-xfer.c
+++ b/criu/page-xfer.c
@@ -349,6 +349,8 @@ out:
 
 int open_page_xfer(struct page_xfer *xfer, int fd_type, long id)
 {
+	xfer->offset = 0;
+
 	if (opts.use_page_server)
 		return open_page_server_xfer(xfer, fd_type, id);
 	else
@@ -356,10 +358,10 @@ int open_page_xfer(struct page_xfer *xfer, int fd_type, long id)
 }
 
 static int page_xfer_dump_hole(struct page_xfer *xfer,
-			       struct iovec *hole, unsigned long off, u32 flags)
+			       struct iovec *hole, u32 flags)
 {
-	BUG_ON(hole->iov_base < (void *)off);
-	hole->iov_base -= off;
+	BUG_ON(hole->iov_base < (void *)xfer->offset);
+	hole->iov_base -= xfer->offset;
 	pr_debug("\th %p [%u]\n", hole->iov_base,
 			(unsigned int)(hole->iov_len / PAGE_SIZE));
 
@@ -382,7 +384,7 @@ static int get_hole_flags(struct page_pipe *pp, int n)
 }
 
 static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp,
-		      unsigned int *cur_hole, void *limit, unsigned long off)
+		      unsigned int *cur_hole, void *limit)
 {
 	int ret;
 
@@ -394,7 +396,7 @@ static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp,
 			break;
 
 		hole_flags = get_hole_flags(pp, *cur_hole);
-		ret = page_xfer_dump_hole(xfer, &hole, off, hole_flags);
+		ret = page_xfer_dump_hole(xfer, &hole, hole_flags);
 		if (ret)
 			return ret;
 	}
@@ -403,7 +405,7 @@ static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp,
 }
 
 int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp,
-			 unsigned long off, bool dump_lazy)
+		bool dump_lazy)
 {
 	struct page_pipe_buf *ppb;
 	unsigned int cur_hole = 0;
@@ -420,12 +422,12 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp,
 			struct iovec iov = ppb->iov[i];
 			u32 flags = PE_PRESENT;
 
-			ret = dump_holes(xfer, pp, &cur_hole, iov.iov_base, off);
+			ret = dump_holes(xfer, pp, &cur_hole, iov.iov_base);
 			if (ret)
 				return ret;
 
-			BUG_ON(iov.iov_base < (void *)off);
-			iov.iov_base -= off;
+			BUG_ON(iov.iov_base < (void *)xfer->offset);
+			iov.iov_base -= xfer->offset;
 			pr_debug("\tp %p [%u]\n", iov.iov_base,
 					(unsigned int)(iov.iov_len / PAGE_SIZE));
 
@@ -446,7 +448,7 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp,
 		}
 	}
 
-	return dump_holes(xfer, pp, &cur_hole, NULL, off);
+	return dump_holes(xfer, pp, &cur_hole, NULL);
 }
 
 /*
diff --git a/criu/shmem.c b/criu/shmem.c
index ce3746a..27778f9 100644
--- a/criu/shmem.c
+++ b/criu/shmem.c
@@ -624,7 +624,7 @@ int add_shmem_area(pid_t pid, VmaEntry *vma, u64 *map)
 	return 0;
 }
 
-static int dump_pages(struct page_pipe *pp, struct page_xfer *xfer, void *addr)
+static int dump_pages(struct page_pipe *pp, struct page_xfer *xfer)
 {
 	struct page_pipe_buf *ppb;
 
@@ -636,7 +636,7 @@ static int dump_pages(struct page_pipe *pp, struct page_xfer *xfer, void *addr)
 			return -1;
 		}
 
-	return page_xfer_dump_pages(xfer, pp, (unsigned long)addr, true);
+	return page_xfer_dump_pages(xfer, pp, true);
 }
 
 static int next_data_segment(int fd, unsigned long pfn,
@@ -683,6 +683,8 @@ static int do_dump_one_shmem(int fd, void *addr, struct shmem_info *si)
 	if (err)
 		goto err_pp;
 
+	xfer.offset = (unsigned long)addr;
+
 	for (pfn = 0; pfn < nrpages; pfn++) {
 		unsigned int pgstate = PST_DIRTY;
 		bool use_mc = true;
@@ -714,7 +716,7 @@ again:
 			ret = page_pipe_add_page(pp, pgaddr, 0);
 
 		if (ret == -EAGAIN) {
-			ret = dump_pages(pp, &xfer, addr);
+			ret = dump_pages(pp, &xfer);
 			if (ret)
 				goto err_xfer;
 			page_pipe_reinit(pp);
@@ -723,7 +725,7 @@ again:
 			goto err_xfer;
 	}
 
-	ret = dump_pages(pp, &xfer, addr);
+	ret = dump_pages(pp, &xfer);
 
 err_xfer:
 	xfer.close(&xfer);
-- 
2.1.4



More information about the CRIU mailing list