[CRIU] [PATCH 2/5]v2 deduplication: add auto-dedup on restore

Tikhomirov Pavel snorcht at gmail.com
Wed Feb 19 06:56:31 PST 2014


if option --auto-dedup is set on restore, then as soon as page is
restored it will be punched from the image.

open image in O_RDWR mode

Signed-off-by: Tikhomirov Pavel <snorcht at gmail.com>
---
 cr-restore.c | 12 +++++++++---
 page-read.c  |  8 ++++++++
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/cr-restore.c b/cr-restore.c
index 22614db..63768d8 100644
--- a/cr-restore.c
+++ b/cr-restore.c
@@ -338,9 +338,15 @@ static int restore_priv_vma_content(pid_t pid)
 	struct page_read pr;
 
 	vma = list_first_entry(vmas, struct vma_area, list);
-	ret = open_page_read(pid, &pr);
-	if (ret)
-		return -1;
+	if (!opts.auto_dedup) {
+		ret = open_page_read(pid, &pr);
+		if (ret)
+			return -1;
+	} else {
+		ret = open_page_rw(pid, &pr);
+		if (ret)
+			return -1;
+	}
 
 	/*
 	 * Read page contents.
diff --git a/page-read.c b/page-read.c
index a499b2a..3f1d326 100644
--- a/page-read.c
+++ b/page-read.c
@@ -3,6 +3,7 @@
 #include <unistd.h>
 
 #include "image.h"
+#include "cr_options.h"
 #include "servicefd.h"
 #include "page-read.h"
 
@@ -146,6 +147,13 @@ static int read_pagemap_page(struct page_read *pr, unsigned long vaddr, void *bu
 			pr_perror("Can't read mapping page %d", ret);
 			return -1;
 		}
+
+		if (opts.auto_dedup) {
+			ret = punch_hole(pr->fd_pg, current_vaddr, (unsigned int)PAGE_SIZE);
+			if (ret == -1) {
+				return -1;
+			}
+		}
 	}
 
 	pr->cvaddr += PAGE_SIZE;
-- 
1.8.3.2



More information about the CRIU mailing list