[CRIU] [PATCH 2/4] criu: dedup/pagemap: move most of the dedup code to pagemap.c
Mike Rapoport
rppt at linux.vnet.ibm.com
Thu Jun 23 09:46:51 PDT 2016
The deduplication code uses pagemap internal implementation details, so
it's better to have this code in the pagemap.c
Signed-off-by: Mike Rapoport <rppt at linux.vnet.ibm.com>
---
criu/cr-dedup.c | 95 ---------------------------------------------------------
criu/pagemap.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 95 insertions(+), 95 deletions(-)
diff --git a/criu/cr-dedup.c b/criu/cr-dedup.c
index 726cec9..538f650 100644
--- a/criu/cr-dedup.c
+++ b/criu/cr-dedup.c
@@ -7,8 +7,6 @@
#include "pagemap.h"
#include "restorer.h"
-#define MAX_BUNCH_SIZE 256
-
static int cr_dedup_one_pagemap(int pid);
int cr_dedup(void)
@@ -102,96 +100,3 @@ exit:
return 0;
}
-
-static inline bool can_extend_batch(struct iovec *bunch,
- unsigned long off, unsigned long len)
-{
- return /* The next region is the continuation of the existing */
- ((unsigned long)bunch->iov_base + bunch->iov_len == off) &&
- /* The resulting region is non empty and is small enough */
- (bunch->iov_len == 0 || bunch->iov_len + len < MAX_BUNCH_SIZE * PAGE_SIZE);
-}
-
-int punch_hole(struct page_read *pr, unsigned long off, unsigned long len,
- bool cleanup)
-{
- int ret;
- struct iovec * bunch = &pr->bunch;
-
- if (!cleanup && can_extend_batch(bunch, off, len)) {
- pr_debug("pr%d:Extend bunch len from %zu to %lu\n", pr->id,
- bunch->iov_len, bunch->iov_len + len);
- bunch->iov_len += len;
- } else {
- if (bunch->iov_len > 0) {
- pr_debug("Punch!/%p/%zu/\n", bunch->iov_base, bunch->iov_len);
- ret = fallocate(img_raw_fd(pr->pi), FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
- (unsigned long)bunch->iov_base, bunch->iov_len);
- if (ret != 0) {
- pr_perror("Error punching hole");
- return -1;
- }
- }
- bunch->iov_base = (void *)off;
- bunch->iov_len = len;
- pr_debug("pr%d:New bunch/%p/%zu/\n", pr->id, bunch->iov_base, bunch->iov_len);
- }
- return 0;
-}
-
-int dedup_one_iovec(struct page_read *pr, struct iovec *iov)
-{
- unsigned long off;
- unsigned long off_real;
- unsigned long iov_end;
-
- iov_end = (unsigned long)iov->iov_base + iov->iov_len;
- off = (unsigned long)iov->iov_base;
- while (1) {
- int ret;
- struct iovec piov;
- unsigned long piov_end;
- struct iovec tiov;
- struct page_read * prp;
-
- ret = pr->seek_page(pr, off, false);
- if (ret == -1)
- return -1;
-
- if (ret == 0) {
- if (off < pr->cvaddr && pr->cvaddr < iov_end)
- off = pr->cvaddr;
- else
- return 0;
- }
-
- if (!pr->pe)
- return -1;
- pagemap2iovec(pr->pe, &piov);
- piov_end = (unsigned long)piov.iov_base + piov.iov_len;
- off_real = lseek(img_raw_fd(pr->pi), 0, SEEK_CUR);
- if (!pr->pe->in_parent) {
- ret = punch_hole(pr, off_real, min(piov_end, iov_end) - off, false);
- if (ret == -1)
- return ret;
- }
-
- prp = pr->parent;
- if (prp) {
- /* recursively */
- pr_debug("Go to next parent level\n");
- tiov.iov_base = (void*)off;
- tiov.iov_len = min(piov_end, iov_end) - off;
- ret = dedup_one_iovec(prp, &tiov);
- if (ret != 0)
- return -1;
- }
-
- if (piov_end < iov_end) {
- off = piov_end;
- continue;
- } else
- return 0;
- }
- return 0;
-}
diff --git a/criu/pagemap.c b/criu/pagemap.c
index 278eb77..8a08097 100644
--- a/criu/pagemap.c
+++ b/criu/pagemap.c
@@ -15,6 +15,8 @@
#define SEEK_HOLE 4
#endif
+#define MAX_BUNCH_SIZE 256
+
void pagemap2iovec(PagemapEntry *pe, struct iovec *iov)
{
iov->iov_base = decode_pointer(pe->vaddr);
@@ -27,6 +29,99 @@ void iovec2pagemap(struct iovec *iov, PagemapEntry *pe)
pe->nr_pages = iov->iov_len / PAGE_SIZE;
}
+static inline bool can_extend_batch(struct iovec *bunch,
+ unsigned long off, unsigned long len)
+{
+ return /* The next region is the continuation of the existing */
+ ((unsigned long)bunch->iov_base + bunch->iov_len == off) &&
+ /* The resulting region is non empty and is small enough */
+ (bunch->iov_len == 0 || bunch->iov_len + len < MAX_BUNCH_SIZE * PAGE_SIZE);
+}
+
+int punch_hole(struct page_read *pr, unsigned long off, unsigned long len,
+ bool cleanup)
+{
+ int ret;
+ struct iovec * bunch = &pr->bunch;
+
+ if (!cleanup && can_extend_batch(bunch, off, len)) {
+ pr_debug("pr%d:Extend bunch len from %zu to %lu\n", pr->id,
+ bunch->iov_len, bunch->iov_len + len);
+ bunch->iov_len += len;
+ } else {
+ if (bunch->iov_len > 0) {
+ pr_debug("Punch!/%p/%zu/\n", bunch->iov_base, bunch->iov_len);
+ ret = fallocate(img_raw_fd(pr->pi), FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
+ (unsigned long)bunch->iov_base, bunch->iov_len);
+ if (ret != 0) {
+ pr_perror("Error punching hole");
+ return -1;
+ }
+ }
+ bunch->iov_base = (void *)off;
+ bunch->iov_len = len;
+ pr_debug("pr%d:New bunch/%p/%zu/\n", pr->id, bunch->iov_base, bunch->iov_len);
+ }
+ return 0;
+}
+
+int dedup_one_iovec(struct page_read *pr, struct iovec *iov)
+{
+ unsigned long off;
+ unsigned long off_real;
+ unsigned long iov_end;
+
+ iov_end = (unsigned long)iov->iov_base + iov->iov_len;
+ off = (unsigned long)iov->iov_base;
+ while (1) {
+ int ret;
+ struct iovec piov;
+ unsigned long piov_end;
+ struct iovec tiov;
+ struct page_read * prp;
+
+ ret = pr->seek_page(pr, off, false);
+ if (ret == -1)
+ return -1;
+
+ if (ret == 0) {
+ if (off < pr->cvaddr && pr->cvaddr < iov_end)
+ off = pr->cvaddr;
+ else
+ return 0;
+ }
+
+ if (!pr->pe)
+ return -1;
+ pagemap2iovec(pr->pe, &piov);
+ piov_end = (unsigned long)piov.iov_base + piov.iov_len;
+ off_real = lseek(img_raw_fd(pr->pi), 0, SEEK_CUR);
+ if (!pr->pe->in_parent) {
+ ret = punch_hole(pr, off_real, min(piov_end, iov_end) - off, false);
+ if (ret == -1)
+ return ret;
+ }
+
+ prp = pr->parent;
+ if (prp) {
+ /* recursively */
+ pr_debug("Go to next parent level\n");
+ tiov.iov_base = (void*)off;
+ tiov.iov_len = min(piov_end, iov_end) - off;
+ ret = dedup_one_iovec(prp, &tiov);
+ if (ret != 0)
+ return -1;
+ }
+
+ if (piov_end < iov_end) {
+ off = piov_end;
+ continue;
+ } else
+ return 0;
+ }
+ return 0;
+}
+
static int get_pagemap(struct page_read *pr, struct iovec *iov)
{
PagemapEntry *pe;
--
1.9.1
More information about the CRIU
mailing list