[CRIU] [PATCH 1/6] collect: Clean children and threads recurring collect checks

Pavel Emelyanov xemul at parallels.com
Mon Nov 10 05:04:41 PST 2014


Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
---
 cr-dump.c | 42 +++++++++++++++++++++++++++++-------------
 1 file changed, 29 insertions(+), 13 deletions(-)

diff --git a/cr-dump.c b/cr-dump.c
index 799a76f..f56006d 100644
--- a/cr-dump.c
+++ b/cr-dump.c
@@ -784,6 +784,17 @@ err:
 	return -1;
 }
 
+static inline bool child_collected(struct pstree_item *i, pid_t pid)
+{
+	struct pstree_item *c;
+
+	list_for_each_entry(c, &i->children, sibling)
+		if (c->pid.real == pid)
+			return true;
+
+	return false;
+}
+
 static int collect_task(struct pstree_item *item);
 static int get_children(struct pstree_item *item)
 {
@@ -800,11 +811,7 @@ static int get_children(struct pstree_item *item)
 		pid_t pid = ch[i];
 
 		/* Is it already frozen? */
-		list_for_each_entry(c, &item->children, sibling)
-			if (c->pid.real == pid)
-				break;
-
-		if (&c->sibling != &item->children)
+		if (child_collected(item, pid))
 			continue;
 
 		nr_inprogress++;
@@ -879,10 +886,24 @@ static pid_t item_ppid(const struct pstree_item *item)
 	return item ? item->pid.real : -1;
 }
 
+static inline bool thread_collected(struct pstree_item *i, pid_t tid)
+{
+	int t;
+
+	if (i->pid.real == tid) /* thread leader is collected as task */
+		return true;
+
+	for (t = 0; t < i->nr_threads; t++)
+		if (tid == i->threads[t].real)
+			return true;
+
+	return false;
+}
+
 static int seize_threads(struct pstree_item *item,
 				struct pid *threads, int nr_threads)
 {
-	int i = 0, ret, j, nr_inprogress, nr_stopped = 0;
+	int i = 0, ret, nr_inprogress, nr_stopped = 0;
 
 	if ((item->state == TASK_DEAD) && (nr_threads > 1)) {
 		pr_err("Zombies with threads are not supported\n");
@@ -902,15 +923,10 @@ static int seize_threads(struct pstree_item *item,
 	nr_inprogress = 0;
 	for (i = 0; i < nr_threads; i++) {
 		pid_t pid = threads[i].real;
-		if (item->pid.real == pid)
-			continue;
-
-		for (j = 0; j < item->nr_threads; j++)
-			if (pid == item->threads[j].real)
-				break;
 
-		if (j != item->nr_threads)
+		if (thread_collected(item, pid))
 			continue;
+
 		nr_inprogress++;
 
 		pr_info("\tSeizing %d's %d thread\n",
-- 
1.8.4.2




More information about the CRIU mailing list