[CRIU] [PATCH 09/15] pstree: allocate fdt shared data

Andrey Vagin avagin at openvz.org
Thu Jan 10 05:00:34 EST 2013


Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 include/crtools.h |  9 +++++++++
 include/pstree.h  |  8 ++++++++
 pstree.c          | 33 +++++++++++++++++++++++++++++++++
 3 files changed, 50 insertions(+)

diff --git a/include/crtools.h b/include/crtools.h
index 2dc30c7..ff07ce1 100644
--- a/include/crtools.h
+++ b/include/crtools.h
@@ -8,6 +8,7 @@
 #include "list.h"
 #include "util.h"
 #include "image.h"
+#include "lock.h"
 
 #include "../protobuf/vma.pb-c.h"
 
@@ -229,6 +230,12 @@ struct vma_area {
 #define vma_area_is(vma_area, s)	vma_entry_is(&((vma_area)->vma), s)
 #define vma_area_len(vma_area)		vma_entry_len(&((vma_area)->vma))
 
+struct fdt {
+	futex_t			fdt_lock;
+	int			nr;
+	pid_t			pid;
+};
+
 struct rst_info {
 	struct list_head	fds;
 	struct list_head	eventpoll;
@@ -236,6 +243,8 @@ struct rst_info {
 
 	void			*premmapped_addr;
 	unsigned long		premmapped_len;
+
+	struct fdt		*fdt;
 };
 
 static inline int in_vma_area(struct vma_area *vma, unsigned long addr)
diff --git a/include/pstree.h b/include/pstree.h
index 7e1a40c..f53d1f6 100644
--- a/include/pstree.h
+++ b/include/pstree.h
@@ -46,6 +46,14 @@ struct pstree_item {
 	struct rst_info		rst[0];
 };
 
+static inline int shared_fdtable(struct pstree_item *item) {
+	return (item->parent && item->parent->state != TASK_HELPER &&
+		item->ids &&
+		item->parent->ids &&
+		item->ids->files_id &&
+		item->ids->files_id == item->parent->ids->files_id);
+}
+
 extern void free_pstree(struct pstree_item *root_item);
 extern struct pstree_item *__alloc_pstree_item(bool rst);
 #define alloc_pstree_item() __alloc_pstree_item(false)
diff --git a/pstree.c b/pstree.c
index 2e2171b..7df42e3 100644
--- a/pstree.c
+++ b/pstree.c
@@ -5,6 +5,7 @@
 #include "pstree.h"
 #include "restorer.h"
 #include "util.h"
+#include "lock.h"
 
 #include "protobuf.h"
 #include "protobuf/pstree.pb-c.h"
@@ -434,6 +435,38 @@ static int prepare_pstree_ids(void)
 				helper->pid.virt, helper->pgid);
 	}
 
+	for_each_pstree_item(item) {
+		struct pstree_item *parent = item->parent;
+		struct fdt *fdt;
+
+		if (item->state == TASK_HELPER)
+			continue;
+
+		if (parent == NULL)
+			continue;
+
+		if (!shared_fdtable(item))
+			continue;
+
+		if (!parent->rst->fdt) {
+			fdt = shmalloc(sizeof(*item->rst->fdt));
+			if (fdt == NULL)
+				return -1;
+
+			parent->rst->fdt = fdt;
+
+			futex_init(&fdt->fdt_lock);
+			fdt->nr = 1;
+			fdt->pid = parent->pid.virt;
+		} else
+			fdt = parent->rst->fdt;
+
+		item->rst->fdt = fdt;
+		fdt->nr++;
+		if (fdt->pid > item->pid.virt)
+			fdt->pid = item->pid.virt;
+	}
+
 	return 0;
 }
 
-- 
1.7.11.7



More information about the CRIU mailing list