[06/11] vma: Keep pointer on parent vma

Submitted by Pavel Emelianov on May 5, 2017, 4:03 p.m.

Details

Message ID b2cf3b0b-c991-bf95-1164-572a023fbc89@virtuozzo.com
State New
Series "Do not remap vmas when not needed"
Headers show

Commit Message

Pavel Emelianov May 5, 2017, 4:03 p.m.
We currently keep pointer on parent vma bitmap, but more info
about the parent will be needed soon.

Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
---
 criu/include/vma.h |  2 +-
 criu/mem.c         | 10 +++++-----
 2 files changed, 6 insertions(+), 6 deletions(-)

Patch hide | download patch | download mbox

diff --git a/criu/include/vma.h b/criu/include/vma.h
index 37f8b4b..12f03fb 100644
--- a/criu/include/vma.h
+++ b/criu/include/vma.h
@@ -54,8 +54,8 @@  struct vma_area {
 		struct /* for restore */ {
 			int (*vm_open)(int pid, struct vma_area *vma);
 			struct file_desc *vmfd;
+			struct vma_area	*pvma;		/* parent for inherited VMAs */
 			unsigned long	*page_bitmap;	/* existent pages */
-			unsigned long	*ppage_bitmap;	/* parent's existent pages */
 			unsigned long	premmaped_addr;	/* restore only */
 		};
 	};
diff --git a/criu/mem.c b/criu/mem.c
index 2d50f8e..1b805cd 100644
--- a/criu/mem.c
+++ b/criu/mem.c
@@ -646,7 +646,7 @@  static int premap_private_vma(struct pstree_item *t,
 		 * This region was found in parent -- remap it to inherit physical
 		 * pages (if any) from it (and COW them later if required).
 		 */
-		vma->ppage_bitmap = p->page_bitmap;
+		vma->pvma = p;
 
 		addr = mremap(paddr, size, size,
 				MREMAP_FIXED | MREMAP_MAYMOVE, *tgt_addr);
@@ -790,8 +790,8 @@  static int restore_priv_vma_content(struct pstree_item *t, struct page_read *pr)
 					vma->premmaped_addr);
 
 			set_bit(off, vma->page_bitmap);
-			if (vma->ppage_bitmap) { /* inherited vma */
-				clear_bit(off, vma->ppage_bitmap);
+			if (vma->pvma) { /* inherited vma */
+				clear_bit(off, vma->pvma->page_bitmap);
 
 				ret = pr->read_pages(pr, va, 1, buf, 0);
 				if (ret < 0)
@@ -848,13 +848,13 @@  err_read:
 		unsigned long size, i = 0;
 		void *addr = decode_pointer(vma->premmaped_addr);
 
-		if (vma->ppage_bitmap == NULL)
+		if (vma->pvma == NULL)
 			continue;
 
 		size = vma_entry_len(vma->e) / PAGE_SIZE;
 		while (1) {
 			/* Find all pages, which are not shared with this child */
-			i = find_next_bit(vma->ppage_bitmap, size, i);
+			i = find_next_bit(vma->pvma->page_bitmap, size, i);
 
 			if ( i >= size)
 				break;