[CRIU] [PATCH 4/6] pstree: resort code about abandoned tasks

Pavel Emelyanov xemul at virtuozzo.com
Tue Mar 15 06:11:01 PDT 2016


On 03/15/2016 09:37 AM, Andrey Vagin wrote:
> From: Andrew Vagin <avagin at virtuozzo.com>
> 
> Currently we enumirate all children of the init task and
> if a task isn't a session leader, we create a helper,
> collect all children with this sid to the children list of this helper.
> 
> When all children of the init task has been enumirated, we try to find
> a session leader for each helper.
> 
> We use this way to enumirate all tasks only once.
> 
> Now we are going to collect all tasks in rbtree, so we can find
> a sessial leader when we need it. It will not affect performance,
> because without searching a session leader, we can't add a helper
> to the tree.
> 
> Signed-off-by: Andrew Vagin <avagin at virtuozzo.com>
> ---
>  criu/include/pstree.h |  2 --
>  criu/pstree.c         | 69 +++++++++++++++++++++------------------------------
>  2 files changed, 28 insertions(+), 43 deletions(-)
> 
> diff --git a/criu/include/pstree.h b/criu/include/pstree.h
> index a742a48..6ff8781 100644
> --- a/criu/include/pstree.h
> +++ b/criu/include/pstree.h
> @@ -64,8 +64,6 @@ static inline bool task_alive(struct pstree_item *i)
>  extern void free_pstree(struct pstree_item *root_item);
>  extern struct pstree_item *__alloc_pstree_item(bool rst);
>  #define alloc_pstree_item() __alloc_pstree_item(false)
> -#define alloc_pstree_item_with_rst() __alloc_pstree_item(true)
> -extern struct pstree_item *alloc_pstree_helper(void);
>  extern void init_pstree_helper(struct pstree_item *ret);
>  
>  extern struct pstree_item *lookup_create_item(pid_t pid);
> diff --git a/criu/pstree.c b/criu/pstree.c
> index 8e3c0c9..3274f56 100644
> --- a/criu/pstree.c
> +++ b/criu/pstree.c
> @@ -24,6 +24,8 @@ static struct rb_root pid_root_rb;
>  
>  #define CLONE_ALLNS     (CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC | CLONE_NEWUTS | CLONE_NEWNS | CLONE_NEWUSER)
>  
> +#define alloc_pstree_item_with_rst() __alloc_pstree_item(true)
> +
>  void core_entry_free(CoreEntry *core)
>  {
>  	if (core->tc && core->tc->timers)
> @@ -230,17 +232,6 @@ void init_pstree_helper(struct pstree_item *ret)
>  	task_entries->nr_helpers++;
>  }
>  
> -struct pstree_item *alloc_pstree_helper(void)
> -{
> -	struct pstree_item *ret;
> -
> -	ret = alloc_pstree_item_with_rst();
> -	if (ret)
> -		init_pstree_helper(ret);
> -
> -	return ret;
> -}
> -
>  /* Deep first search on children */
>  struct pstree_item *pstree_item_next(struct pstree_item *item)
>  {
> @@ -586,6 +577,7 @@ static int prepare_pstree_ids(void)
>  	 * reparented to init.
>  	 */
>  	list_for_each_entry(item, &root_item->children, sibling) {
> +		struct pstree_item *leader;
>  
>  		/*
>  		 * If a child belongs to the root task's session or it's
> @@ -595,15 +587,31 @@ static int prepare_pstree_ids(void)
>  		if (item->sid == root_item->sid || item->sid == item->pid.virt)
>  			continue;
>  
> -		helper = alloc_pstree_helper();
> -		if (helper == NULL)
> -			return -1;
> -		helper->sid = item->sid;
> -		helper->pgid = item->sid;
> -		helper->pid.virt = item->sid;
> -		helper->parent = root_item;
> -		helper->ids = root_item->ids;
> -		list_add_tail(&helper->sibling, &helpers);
> +		leader = insert_item(item->sid);

There's no such call neither in this patch, nor in criu. At the same time
this line gets removed in patch #6 with commend "fix return code from insert_item".

Would you fix the set not to contain this?

> +		if (leader->pid.state != TASK_UNDEF) {
> +			helper = insert_item(++max_pid);
> +			if (helper == NULL)
> +				return -1;
> +
> +			pr_info("Session leader %d\n", item->sid);
> +
> +			helper->sid = item->sid;
> +			helper->pgid = leader->pgid;
> +			helper->ids = leader->ids;
> +			helper->parent = leader;
> +			list_add(&helper->sibling, &leader->children);
> +
> +			pr_info("Attach %d to the task %d\n",
> +					helper->pid.virt, leader->pid.virt);
> +		} else {
> +			helper = leader;
> +			helper->sid = item->sid;
> +			helper->pgid = item->sid;
> +			helper->parent = root_item;
> +			helper->ids = root_item->ids;
> +			list_add_tail(&helper->sibling, &helpers);
> +		}
> +		init_pstree_helper(helper);
>  
>  		pr_info("Add a helper %d for restoring SID %d\n",
>  				helper->pid.virt, helper->sid);
> @@ -663,27 +671,6 @@ static int prepare_pstree_ids(void)
>  
>  			continue;
>  		}
> -
> -		pr_info("Session leader %d\n", item->sid);
> -
> -		/* Try to find helpers, who should be connected to the leader */
> -		list_for_each_entry(child, &helpers, sibling) {
> -			if (child->pid.state != TASK_HELPER)
> -				continue;
> -
> -			if (child->sid != item->sid)
> -				continue;
> -
> -			child->pgid = item->pgid;
> -			child->pid.virt = ++max_pid;
> -			child->parent = item;
> -			list_move(&child->sibling, &item->children);
> -
> -			pr_info("Attach %d to the task %d\n",
> -					child->pid.virt, item->pid.virt);
> -
> -			break;
> -		}
>  	}
>  
>  	/* All other helpers are session leaders for own sessions */
> 



More information about the CRIU mailing list