[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