[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