Commit 30098d45 authored by Pavel Emelyanov's avatar Pavel Emelyanov

mem: Split draning pages from xfer-ing them

Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Acked-by: 's avatarMike Rapoport <rppt@linux.vnet.ibm.com>
parent 41c3ca86
...@@ -215,8 +215,8 @@ static struct parasite_dump_pages_args *prep_dump_pages_args(struct parasite_ctl ...@@ -215,8 +215,8 @@ static struct parasite_dump_pages_args *prep_dump_pages_args(struct parasite_ctl
return args; return args;
} }
static int dump_pages(struct page_pipe *pp, struct parasite_ctl *ctl, static int drain_pages(struct page_pipe *pp, struct parasite_ctl *ctl,
struct parasite_dump_pages_args *args, struct page_xfer *xfer) struct parasite_dump_pages_args *args)
{ {
struct page_pipe_buf *ppb; struct page_pipe_buf *ppb;
int ret = 0; int ret = 0;
...@@ -244,15 +244,20 @@ static int dump_pages(struct page_pipe *pp, struct parasite_ctl *ctl, ...@@ -244,15 +244,20 @@ static int dump_pages(struct page_pipe *pp, struct parasite_ctl *ctl,
args->off += args->nr_segs; args->off += args->nr_segs;
} }
return 0;
}
static int xfer_pages(struct page_pipe *pp, struct page_xfer *xfer)
{
int ret;
/* /*
* Step 3 -- write pages into image (or delay writing for * Step 3 -- write pages into image (or delay writing for
* pre-dump action (see pre_dump_one_task) * pre-dump action (see pre_dump_one_task)
*/ */
if (xfer) { timing_start(TIME_MEMWRITE);
timing_start(TIME_MEMWRITE); ret = page_xfer_dump_pages(xfer, pp, 0);
ret = page_xfer_dump_pages(xfer, pp, 0); timing_stop(TIME_MEMWRITE);
timing_stop(TIME_MEMWRITE);
}
return ret; return ret;
} }
...@@ -340,7 +345,9 @@ again: ...@@ -340,7 +345,9 @@ again:
if (ret == -EAGAIN) { if (ret == -EAGAIN) {
BUG_ON(mdc->delayed_dump); BUG_ON(mdc->delayed_dump);
ret = dump_pages(pp, ctl, args, &xfer); ret = drain_pages(pp, ctl, args);
if (!ret)
ret = xfer_pages(pp, &xfer);
if (!ret) { if (!ret) {
page_pipe_reinit(pp); page_pipe_reinit(pp);
goto again; goto again;
...@@ -351,7 +358,9 @@ again: ...@@ -351,7 +358,9 @@ again:
goto out_xfer; goto out_xfer;
} }
ret = dump_pages(pp, ctl, args, mdc->delayed_dump ? NULL : &xfer); ret = drain_pages(pp, ctl, args);
if (!ret && !mdc->delayed_dump)
ret = xfer_pages(pp, &xfer);
if (ret) if (ret)
goto out_xfer; goto out_xfer;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment