From 03b217c0a66bb18fb99df116e95b5de1d620bc7b Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Mon, 9 Nov 2015 15:46:58 +0300 Subject: [PATCH] restore: Restore as many pages at once as possible 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 --- cr-restore.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/cr-restore.c b/cr-restore.c index cd03f4ede..bf80238be 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)