[CRIU] [PATCH 03/11] pstree/pid: add helper to get free pids in pidns and all it's ancestors

Kirill Tkhai ktkhai at virtuozzo.com
Mon May 29 08:20:48 PDT 2017


Not critical notes, but:

On 26.05.2017 20:02, Pavel Tikhomirov wrote:
> Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
> ---
>  criu/include/pstree.h |  2 +-
>  criu/namespaces.c     | 19 ++++---------------
>  criu/pstree.c         | 23 ++++++++++++++++++++++-
>  3 files changed, 27 insertions(+), 17 deletions(-)
> 
> diff --git a/criu/include/pstree.h b/criu/include/pstree.h
> index 892a1cd..bae5ce6 100644
> --- a/criu/include/pstree.h
> +++ b/criu/include/pstree.h
> @@ -88,7 +88,7 @@ static inline bool task_alive(struct pstree_item *i)
>  	return is_alive_state(i->pid->state);
>  }
>  
> -extern int get_free_pid(struct ns_id *ns);
> +extern int get_free_pids(struct ns_id *ns, pid_t *pids);
>  extern void free_pstree_item(struct pstree_item *item);
>  extern void free_pstree(struct pstree_item *root_item);
>  extern struct pstree_item *__alloc_pstree_item(bool rst, int level);
> diff --git a/criu/namespaces.c b/criu/namespaces.c
> index 3473ab1..0c901e6 100644
> --- a/criu/namespaces.c
> +++ b/criu/namespaces.c
> @@ -2526,25 +2526,14 @@ int set_user_ns(u32 id)
>  static int do_reserve_pid_ns_helpers(struct ns_id *ns, void *oarg)
>  {
>  	struct pstree_item *helper;
> -	struct ns_id *iter = ns;
>  	pid_t pid[MAX_NS_NESTING], *p;
> -	int i, level;
> +	int level;
>  
> -	for (i = MAX_NS_NESTING-1; iter && i >= 0; i--, iter = iter->parent) {
> -		pid[i] = get_free_pid(iter);
> -		if (pid[i] < 0) {
> -			pr_err("Can't find free pid\n");
> -			return -1;
> -		}
> -	}
> -
> -	if (iter) {
> -		pr_err("Too many pids levels\n");
> +	level = get_free_pids(ns, pid);
> +	if (level < 0)

If we need this check, than we should add "level == 0", which is also error.

>  		return -1;
> -	}
>  
> -	p = &pid[++i];
> -	level = MAX_NS_NESTING - i;
> +	p = &pid[MAX_NS_NESTING - level];
>  	helper = lookup_create_item(p, level, ns->id);
>  	if (helper == NULL)
>  		return -1;
> diff --git a/criu/pstree.c b/criu/pstree.c
> index 83bb966..1fe5f2d 100644
> --- a/criu/pstree.c
> +++ b/criu/pstree.c
> @@ -833,7 +833,7 @@ static int read_pstree_image(pid_t *pid_max)
>  }
>  
>  #define RESERVED_PIDS		300
> -int get_free_pid(struct ns_id *ns)
> +static int get_free_pid(struct ns_id *ns)
>  {
>  	struct pid *prev, *next;
>  	struct ns_id *i = ns;
> @@ -863,6 +863,27 @@ int get_free_pid(struct ns_id *ns)
>  	return -1;
>  }
>  
> +int get_free_pids(struct ns_id *ns, pid_t *pids)
> +{
> +	struct ns_id *iter = ns;

We may use ns as only variable, as we we are not going to use original ns after cycle..

> +	int i;
> +
> +	for (i = MAX_NS_NESTING-1; iter && i >= 0; i--, iter = iter->parent) {
> +		pids[i] = get_free_pid(iter);
> +		if (pids[i] < 0) {
> +			pr_err("Can't find free pid\n");
> +			return -1;
> +		}
> +	}
> +
> +	if (iter) {
> +		pr_err("Too many pids levels\n");
> +		return -1;
> +	}
> +
> +	return MAX_NS_NESTING - i - 1;
> +}
> +
>  static int prepare_pstree_ids(void)
>  {
>  	struct pstree_item *item, *child, *helper, *tmp;
> 


More information about the CRIU mailing list