[CRIU] [PATCH 2/2] restore: Restore as many pages at once as possible
Pavel Emelyanov
xemul at parallels.com
Mon Nov 9 04:46:58 PST 2015
When the VMA being restored is not COW-ed we read pages from images
one-by-one which results in suboptimal pages.img access. Fix this
by reading as many pages from iamge at once as possible withing the
active pagemap and VMA.
Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
---
cr-restore.c | 28 ++++++++++++++++++++++++----
1 file changed, 24 insertions(+), 4 deletions(-)
diff --git a/cr-restore.c b/cr-restore.c
index 8770f57..e06570d 100644
--- a/cr-restore.c
+++ b/cr-restore.c
@@ -468,8 +468,8 @@ static int restore_priv_vma_content(void)
ret = pr.read_pages(&pr, va, 1, buf);
if (ret < 0)
goto err_read;
- va += PAGE_SIZE;
+ va += PAGE_SIZE;
nr_compared++;
if (memcmp(p, buf, PAGE_SIZE) == 0) {
@@ -477,15 +477,35 @@ static int restore_priv_vma_content(void)
continue;
}
+ nr_restored++;
memcpy(p, buf, PAGE_SIZE);
} else {
- ret = pr.read_pages(&pr, va, 1, p);
+ int nr, j;
+
+ /*
+ * Try to read as many pages as possible at once.
+ *
+ * Within the current pagemap we still have
+ * nr_pages - i pages (not all, as we might have
+ * switched VMA above), within the current VMA
+ * we have at most (vma->end - current_addr) bytes.
+ */
+
+ nr = min(nr_pages - i, (vma->e->end - va) / PAGE_SIZE);
+
+ ret = pr.read_pages(&pr, va, nr, p);
if (ret < 0)
goto err_read;
- va += PAGE_SIZE;
+
+ va += nr * PAGE_SIZE;
+ nr_restored += nr;
+ i += nr - 1;
+
+ /* FIXME -- optimize */
+ for (j = 1; j < nr; j++)
+ set_bit(off + j, vma->page_bitmap);
}
- nr_restored++;
}
if (pr.put_pagemap)
--
1.9.3
More information about the CRIU
mailing list