[CRIU] [PATCH 03/28] pid_ns: Make add_child_task() working with last_level_pid()
Kirill Tkhai
ktkhai at virtuozzo.com
Mon Jun 5 20:23:52 MSK 2017
The original idea was to sort children and to keep child
reapers at the beginning of the list. But there a mistake
happened: we must look for last_level_pid() as it is
an indicator of a child_reaper.
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
criu/pstree.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/criu/pstree.c b/criu/pstree.c
index dec77b81a..908e070d1 100644
--- a/criu/pstree.c
+++ b/criu/pstree.c
@@ -256,15 +256,21 @@ struct pstree_item *__alloc_pstree_item(bool rst, int level)
return item;
}
+/*
+ * Link child task to parent and try to keep parent's children sorted:
+ * child reapers at the beginning of list, the less pid->level is first.
+ * This gives basic protection against deadlock, when a tasks is waiting
+ * for pid_ns child reaper creation, while it's in the end of the list.
+ */
void add_child_task(struct pstree_item *child, struct pstree_item *parent)
{
struct pstree_item *item;
- if (vpid(child) != INIT_PID)
+ if (last_level_pid(child->pid) != INIT_PID)
list_add_tail(&child->sibling, &parent->children);
else {
list_for_each_entry(item, &parent->children, sibling)
- if (vpid(item) != INIT_PID ||
+ if (last_level_pid(item->pid) != INIT_PID ||
item->pid->level >= child->pid->level)
break;
/* Add child before item */
More information about the CRIU
mailing list