[CRIU] [PATCH v2 15/28] files: Merge states iteration into open_fdinfos()

Pavel Emelyanov xemul at virtuozzo.com
Mon Dec 5 02:04:23 PST 2016


On 11/30/2016 07:31 PM, Kirill Tkhai wrote:
> TTY masters and slaves have no post_open stage,
> so these two blocks may safely have their stages merged together.
> 
> The third is eventpoll, but two above do not depend
> on it (their .post_open do not depend on its .open).

Epoll's .post_open depends on anybody's .open

> Unix sockets would have been, but this isn't implemented yet.
> 
> So, we may safely execute all stages for different
> file types separatelly.
> 
> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> ---
>  criu/files.c |   62 +++++++++++++++++++++++-----------------------------------
>  1 file changed, 25 insertions(+), 37 deletions(-)
> 
> diff --git a/criu/files.c b/criu/files.c
> index 23ff3f9..df38f58 100644
> --- a/criu/files.c
> +++ b/criu/files.c
> @@ -1061,15 +1061,17 @@ static int open_fdinfo(int pid, struct fdinfo_list_entry *fle, int state)
>  	return states[state].cb(pid, fle);
>  }
>  
> -static int open_fdinfos(int pid, struct list_head *list, int state)
> +static int open_fdinfos(int pid, struct list_head *list)
>  {
> -	int ret = 0;
> +	int state, ret = 0;
>  	struct fdinfo_list_entry *fle;
>  
> -	list_for_each_entry(fle, list, ps_list) {
> -		ret = open_fdinfo(pid, fle, state);
> -		if (ret)
> -			break;
> +	for (state = 0; state < ARRAY_SIZE(states); state++) {
> +		list_for_each_entry(fle, list, ps_list) {
> +			ret = open_fdinfo(pid, fle, state);
> +			if (ret)
> +				break;
> +		}
>  	}
>  
>  	return ret;
> @@ -1111,7 +1113,6 @@ int close_old_fds(void)
>  int prepare_fds(struct pstree_item *me)
>  {
>  	u32 ret = 0;
> -	int state;
>  
>  	pr_info("Opening fdinfo-s\n");
>  
> @@ -1142,41 +1143,28 @@ int prepare_fds(struct pstree_item *me)
>  		}
>  	}
>  
> -	for (state = 0; state < ARRAY_SIZE(states); state++) {
> -		ret = open_fdinfos(me->pid.virt, &rsti(me)->fds, state);
> -		if (ret)
> -			break;
> -
> -		/*
> -		 * Now handle TTYs. Slaves are delayed to be sure masters
> -		 * are already opened.
> -		 */
> -		ret = open_fdinfos(me->pid.virt, &rsti(me)->tty_slaves, state);
> -		if (ret)
> -			break;
> +	ret = open_fdinfos(me->pid.virt, &rsti(me)->fds);
> +	if (ret)
> +		goto out_w;
>  
> -		/*
> -		 * The eventpoll descriptors require all the other ones
> -		 * to be already restored, thus we store them in a separate
> -		 * list and restore at the very end.
> -		 */
> -		ret = open_fdinfos(me->pid.virt, &rsti(me)->eventpoll, state);
> -		if (ret)
> -			break;
> -	}
> +	/*
> +	 * Now handle TTYs. Slaves are delayed to be sure masters
> +	 * are already opened.
> +	 */
> +	ret = open_fdinfos(me->pid.virt, &rsti(me)->tty_slaves);
> +	if (ret)
> +		goto out_w;
>  
> +	/*
> +	 * The eventpoll descriptors require all the other ones
> +	 * to be already restored, thus we store them in a separate
> +	 * list and restore at the very end.
> +	 */
> +	ret = open_fdinfos(me->pid.virt, &rsti(me)->eventpoll);
>  	if (ret)
>  		goto out_w;
>  
> -	for (state = 0; state < ARRAY_SIZE(states); state++) {
> -		/*
> -		 * Opening current TTYs require session to be already set up,
> -		 * thus slave peers already handled now it's time for cttys,
> -		 */
> -		ret = open_fdinfos(me->pid.virt, &rsti(me)->tty_ctty, state);
> -		if (ret)
> -			break;
> -	}
> +	ret = open_fdinfos(me->pid.virt, &rsti(me)->tty_ctty);
>  out_w:
>  	close_service_fd(TRANSPORT_FD_OFF);
>  	if (rsti(me)->fdt)
> 
> .
> 



More information about the CRIU mailing list