[CRIU] [PATCH v2 02/21] pstree: Add helpers for ordered linking child task to parent
Andrei Vagin
avagin at virtuozzo.com
Fri Jun 2 23:59:27 MSK 2017
On Wed, May 31, 2017 at 08:51:58PM +0300, Kirill Tkhai wrote:
> Place child reapers of pid namespaces at the beginning
> of pstree_item::children list and sort them by nesting
> level.
>
> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> ---
> criu/pstree.c | 35 ++++++++++++++++++++++++++++++-----
> 1 file changed, 30 insertions(+), 5 deletions(-)
>
> diff --git a/criu/pstree.c b/criu/pstree.c
> index 85fec6d36..f33da75a9 100644
> --- a/criu/pstree.c
> +++ b/criu/pstree.c
> @@ -256,6 +256,28 @@ struct pstree_item *__alloc_pstree_item(bool rst, int level)
> return item;
> }
>
Pls, write commets before these function to explain what they do and why
we need them.
> +void add_child_task(struct pstree_item *child, struct pstree_item *parent)
> +{
> + struct pstree_item *item;
> +
> + if (vpid(child) != INIT_PID)
> + list_add_tail(&child->sibling, &parent->children);
> + else {
> + list_for_each_entry(item, &parent->children, sibling)
> + if (vpid(item) != INIT_PID ||
> + item->pid->level >= child->pid->level)
> + break;
> + /* Add child before item */
> + list_add_tail(&child->sibling, &item->sibling);
> + }
> +}
> +
> +void move_child_task(struct pstree_item *child, struct pstree_item *new_parent)
> +{
> + list_del(&child->sibling);
> + add_child_task(child, new_parent);
> +}
> +
> int init_pstree_helper(struct pstree_item *ret)
> {
> BUG_ON(!ret->parent);
> @@ -789,7 +811,7 @@ static int read_pstree_image(pid_t *pid_max)
> pi->parent = NULL;
> } else {
> pi->parent = parent;
> - list_add(&pi->sibling, &parent->children);
> + add_child_task(pi, parent);
> }
>
> pi->nr_threads = e->n_tids;
> @@ -907,7 +929,7 @@ static int prepare_pstree_ids(void)
> vpgid(helper) = vpgid(leader);
> helper->ids = leader->ids;
> helper->parent = leader;
> - list_add(&helper->sibling, &leader->children);
> + add_child_task(helper, leader);
>
> pr_info("Attach %d to the task %d\n",
> vpid(helper), vpid(leader));
> @@ -943,7 +965,7 @@ static int prepare_pstree_ids(void)
> vpid(child), vpid(helper));
>
> child->parent = helper;
> - list_move(&child->sibling, &helper->children);
> + move_child_task(child, helper);
> }
> }
>
> @@ -985,7 +1007,10 @@ static int prepare_pstree_ids(void)
> }
>
> /* All other helpers are session leaders for own sessions */
> - list_splice(&helpers, &root_item->children);
> + while (!list_empty(&helpers)) {
> + item = list_first_entry(&helpers, struct pstree_item, sibling);
> + move_child_task(item, root_item);
> + }
>
> /* Add a process group leader if it is absent */
> for_each_pstree_item(item) {
> @@ -1020,7 +1045,7 @@ static int prepare_pstree_ids(void)
> pr_err("Can't init helper\n");
> return -1;
> }
> - list_add(&helper->sibling, &item->children);
> + add_child_task(helper, item);
> rsti(item)->pgrp_leader = helper;
>
> pr_info("Add a helper %d for restoring PGID %d\n",
>
More information about the CRIU
mailing list