[CRIU] [PATCH 2/2] pre_dump: Assign parasite pid only if it hasn't collected yet

Kirill Tkhai ktkhai at virtuozzo.com
Mon Jun 5 13:29:37 MSK 2017


Parasite returns last level pid (pid in task's pid namespace),
so we mustn't rewrite already collected from /proc/[pid]/status
vpid.

We handle that correctly on dump, do the same on pre-dump.

Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 criu/cr-dump.c |   36 ++++++++++++++++++++++--------------
 1 file changed, 22 insertions(+), 14 deletions(-)

diff --git a/criu/cr-dump.c b/criu/cr-dump.c
index ccd651970..913273743 100644
--- a/criu/cr-dump.c
+++ b/criu/cr-dump.c
@@ -1194,6 +1194,24 @@ static int dump_zombies(void)
 	return ret;
 }
 
+static int assign_parasite_pids(struct pstree_item *item, struct parasite_dump_misc *misc)
+{
+	if (vpid(item) == -1) {
+		vpid(item) = misc->pid;
+		vsid(item) = misc->sid;
+		vpgid(item) = misc->pgid;
+	} else {
+		/* They were collected in parse_pid_status() */
+		if (last_level_pid(item->pid) != misc->pid ||
+		    last_level_pid(item->sid) != misc->sid ||
+		    last_level_pid(item->pgid) != misc->pgid) {
+			pr_err("Parasite and /proc/[pid]/status gave different pids\n");
+			return -1;
+		}
+	}
+	return 0;
+}
+
 static int pre_dump_one_task(struct pstree_item *item)
 {
 	pid_t pid = item->pid->real;
@@ -1249,7 +1267,8 @@ static int pre_dump_one_task(struct pstree_item *item)
 		goto err_cure;
 	}
 
-	vpid(item) = misc.pid;
+	if (assign_parasite_pids(item, &misc))
+		goto err;
 
 	mdc.pre_dump = true;
 	mdc.lazy = false;
@@ -1379,19 +1398,8 @@ static int dump_one_task(struct pstree_item *item)
 		goto err_cure_imgset;
 	}
 
-	if (vpid(item) == -1) {
-		vpid(item) = misc.pid;
-		vsid(item) = misc.sid;
-		vpgid(item) = misc.pgid;
-	} else {
-		/* They were collected in parse_pid_status() */
-		if (last_level_pid(item->pid) != misc.pid ||
-		    last_level_pid(item->sid) != misc.sid ||
-		    last_level_pid(item->pgid) != misc.pgid) {
-			pr_err("Parasite and /proc/[pid]/status gave different pids\n");
-			goto err;
-		}
-	}
+	if (assign_parasite_pids(item, &misc))
+		goto err;
 
 	pstree_insert_pid(item->pid, item->ids->pid_ns_id);
 



More information about the CRIU mailing list