From f2f5fd68dd44ebc07f9d4b5ecebe21f658383f80 Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Thu, 6 Jul 2017 12:41:28 +0300 Subject: [PATCH] page-xfer: Sanitize xfer core routine 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. Acked-by: Mike Rapoport Signed-off-by: Pavel Emelyanov Signed-off-by: Andrei Vagin --- 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 8237e7749..1bf1d1cb9 100644 --- a/criu/page-xfer.c +++ b/criu/page-xfer.c @@ -434,6 +434,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; @@ -449,7 +462,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) @@ -460,19 +473,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; } }