[CRIU] [PATCH RESEND v1 27/55] pstree: Add pid_ns id argument to lookup_create_pid()

Kirill Tkhai ktkhai at virtuozzo.com
Fri Mar 24 08:13:22 PDT 2017


Pass a namespace of item to the function.
This will allow to link the pid in correct ns::pid::root_rb
in next patches.

Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 criu/cr-dump.c        |    4 ++--
 criu/files-reg.c      |    2 +-
 criu/include/pstree.h |    4 ++--
 criu/pstree.c         |   24 ++++++++++++------------
 4 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/criu/cr-dump.c b/criu/cr-dump.c
index 8d7ed439..5e4f2dfa 100644
--- a/criu/cr-dump.c
+++ b/criu/cr-dump.c
@@ -843,7 +843,7 @@ static int dump_task_thread(struct parasite_ctl *parasite_ctl,
 	}
 	tid->ns[0].virt = parasite_tid;
 
-	pstree_insert_pid(tid);
+	pstree_insert_pid(tid, item->ids->pid_ns_id);
 
 	img = open_image(CR_FD_CORE, O_DUMP, tid->ns[0].virt);
 	if (!img)
@@ -1314,7 +1314,7 @@ static int dump_one_task(struct pstree_item *item)
 	item->pid->ns[0].virt = misc.pid;
 	item->sid->ns[0].virt = misc.sid;
 	item->pgid->ns[0].virt = misc.pgid;
-	pstree_insert_pid(item->pid);
+	pstree_insert_pid(item->pid, item->ids->pid_ns_id);
 
 	pr_info("sid=%d pgid=%d pid=%d\n",
 		item->sid->ns[0].virt, item->pgid->ns[0].virt, vpid(item));
diff --git a/criu/files-reg.c b/criu/files-reg.c
index 48f068d2..d59c825e 100644
--- a/criu/files-reg.c
+++ b/criu/files-reg.c
@@ -379,7 +379,7 @@ static int open_remap_dead_process(struct reg_file_info *rfi,
 {
 	struct pstree_item *helper;
 
-	helper = lookup_create_item(rfe->remap_id);
+	helper = lookup_create_item(rfe->remap_id, root_item->ids->pid_ns_id);
 	if (!helper)
 		return -1;
 
diff --git a/criu/include/pstree.h b/criu/include/pstree.h
index 0a62bfde..9978b8a7 100644
--- a/criu/include/pstree.h
+++ b/criu/include/pstree.h
@@ -90,8 +90,8 @@ extern struct pstree_item *__alloc_pstree_item(bool rst, int level);
 #define alloc_pstree_item() __alloc_pstree_item(false, 1)
 extern void init_pstree_helper(struct pstree_item *ret);
 
-extern struct pstree_item *lookup_create_item(pid_t pid);
-extern void pstree_insert_pid(struct pid *pid_node);
+extern struct pstree_item *lookup_create_item(pid_t pid, uint32_t ns_id);
+extern void pstree_insert_pid(struct pid *pid_node, uint32_t ns_id);
 extern struct pid *pstree_pid_by_virt(pid_t pid);
 
 extern struct pstree_item *root_item;
diff --git a/criu/pstree.c b/criu/pstree.c
index da2dc9fb..76672631 100644
--- a/criu/pstree.c
+++ b/criu/pstree.c
@@ -398,9 +398,9 @@ static int prepare_pstree_for_shell_job(void)
 			pi->sid->ns[0].virt = current_sid;
 	}
 
-	if (lookup_create_item(current_sid) == NULL)
+	if (lookup_create_item(current_sid, root_item->ids->pid_ns_id) == NULL)
 		return -1;
-	if (lookup_create_item(current_gid) == NULL)
+	if (lookup_create_item(current_gid, root_item->ids->pid_ns_id) == NULL)
 		return -1;
 
 	return 0;
@@ -434,7 +434,7 @@ static struct pid *find_pid_or_place_in_hier(struct rb_node **root, pid_t pid, i
  * it is not there yet. If pid_node isn't set, pstree_item
  * is inserted.
  */
-static struct pid *lookup_create_pid(pid_t pid, struct pid *pid_node)
+static struct pid *lookup_create_pid(pid_t pid, struct pid *pid_node, int ns_id)
 {
 	struct rb_node **new = NULL, *parent = NULL;
 	struct pid *found;
@@ -457,20 +457,20 @@ static struct pid *lookup_create_pid(pid_t pid, struct pid *pid_node)
 	return pid_node;
 }
 
-void pstree_insert_pid(struct pid *pid_node)
+void pstree_insert_pid(struct pid *pid_node, uint32_t ns_id)
 {
 	struct pid* n;
 
-	n = lookup_create_pid(pid_node->ns[0].virt, pid_node);
+	n = lookup_create_pid(pid_node->ns[0].virt, pid_node, ns_id);
 
 	BUG_ON(n != pid_node);
 }
 
-struct pstree_item *lookup_create_item(pid_t pid)
+struct pstree_item *lookup_create_item(pid_t pid, uint32_t ns_id)
 {
 	struct pid *node;;
 
-	node = lookup_create_pid(pid, NULL);
+	node = lookup_create_pid(pid, NULL, ns_id);
 	if (!node)
 		return NULL;
 	BUG_ON(node->state == TASK_THREAD);
@@ -597,7 +597,7 @@ static int read_pstree_image(pid_t *pid_max)
 			break;
 		}
 
-		pi = lookup_create_item(e->pid);
+		pi = lookup_create_item(e->pid, ids->pid_ns_id);
 		if (pi == NULL)
 			break;
 		BUG_ON(pi->pid->state != TASK_UNDEF);
@@ -610,9 +610,9 @@ static int read_pstree_image(pid_t *pid_max)
 		 * be initialized when we meet PstreeEntry with this pid or
 		 * we will create helpers for them.
 		 */
-		if (lookup_create_item(e->pgid) == NULL)
+		if (lookup_create_item(e->pgid, ids->pid_ns_id) == NULL)
 			break;
-		if (lookup_create_item(e->sid) == NULL)
+		if (lookup_create_item(e->sid, ids->pid_ns_id) == NULL)
 			break;
 
 		pi->pid->ns[0].virt = e->pid;
@@ -656,7 +656,7 @@ static int read_pstree_image(pid_t *pid_max)
 			pi->threads[i]->item = NULL;
 			if (i == 0)
 				continue; /* A thread leader is in a tree already */
-			node = lookup_create_pid(pi->threads[i]->ns[0].virt, pi->threads[i]);
+			node = lookup_create_pid(pi->threads[i]->ns[0].virt, pi->threads[i], ids->pid_ns_id);
 
 			BUG_ON(node == NULL);
 			if (node != pi->threads[i]) {
@@ -737,7 +737,7 @@ static int prepare_pstree_ids(void)
 			pid = get_free_pid();
 			if (pid < 0)
 				break;
-			helper = lookup_create_item(pid);
+			helper = lookup_create_item(pid, item->ids->pid_ns_id);
 			if (helper == NULL)
 				return -1;
 



More information about the CRIU mailing list