[CRIU] [PATCH 12/12] page-xfer: Sanitize xfer core routine
Pavel Emelyanov
xemul at virtuozzo.com
Wed Jun 28 16:48:45 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.
Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
---
criu/page-xfer.c | 23 ++++++++++++-----------
1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/criu/page-xfer.c b/criu/page-xfer.c
index 10da75f..256cac6 100644
--- a/criu/page-xfer.c
+++ b/criu/page-xfer.c
@@ -405,6 +405,14 @@ 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)
+ return PE_LAZY | (xfer->transfer_lazy ? PE_PRESENT : 0);
+ else
+ return PE_PRESENT;
+}
+
int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp)
{
struct page_pipe_buf *ppb;
@@ -420,7 +428,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 +439,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