[CRIU] [PATCH] restore: handle errors of restore_wait_other_tasks

Andrei Vagin avagin at virtuozzo.com
Tue Jun 27 22:01:03 MSK 2017


Applied
On Tue, Jun 20, 2017 at 11:49:03PM +0300, Andrei Vagin wrote:
> From: Andrei Vagin <avagin at virtuozzo.com>
> 
> In a error case, task_entries->nr_in_progress is set to -1
> and we have to handle this case.
> 
> Signed-off-by: Andrei Vagin <avagin at virtuozzo.com>
> ---
>  criu/cr-restore.c | 38 ++++++++++++++++++++++----------------
>  1 file changed, 22 insertions(+), 16 deletions(-)
> 
> diff --git a/criu/cr-restore.c b/criu/cr-restore.c
> index 298fb69..ed02474 100644
> --- a/criu/cr-restore.c
> +++ b/criu/cr-restore.c
> @@ -164,12 +164,12 @@ static inline int stage_current_participants(int next_stage)
>  	return -1;
>  }
>  
> -static int restore_wait_inprogress_tasks()
> +static int __restore_wait_inprogress_tasks(int participants)
>  {
>  	int ret;
>  	futex_t *np = &task_entries->nr_in_progress;
>  
> -	futex_wait_while_gt(np, 0);
> +	futex_wait_while_gt(np, participants);
>  	ret = (int)futex_get(np);
>  	if (ret < 0) {
>  		set_cr_errno(get_task_cr_err());
> @@ -179,6 +179,22 @@ static int restore_wait_inprogress_tasks()
>  	return 0;
>  }
>  
> +static int restore_wait_inprogress_tasks()
> +{
> +	return __restore_wait_inprogress_tasks(0);
> +}
> +
> +/* Wait all tasks except the current one */
> +static int restore_wait_other_tasks()
> +{
> +	int participants, stage;
> +
> +	stage = futex_get(&task_entries->start);
> +	participants = stage_current_participants(stage);
> +
> +	return __restore_wait_inprogress_tasks(participants);
> +}
> +
>  static inline void __restore_switch_stage_nw(int next_stage)
>  {
>  	futex_set(&task_entries->nr_in_progress,
> @@ -200,18 +216,6 @@ static int restore_switch_stage(int next_stage)
>  	return restore_wait_inprogress_tasks();
>  }
>  
> -/* Wait all tasks except the current one */
> -static void restore_wait_other_tasks()
> -{
> -	int participants, stage;
> -
> -	stage = futex_get(&task_entries->start);
> -	participants = stage_current_participants(stage);
> -
> -	futex_wait_while_gt(&task_entries->nr_in_progress,
> -				participants);
> -}
> -
>  static int restore_finish_ns_stage(int from, int to)
>  {
>  	if (root_ns_mask)
> @@ -1826,7 +1830,8 @@ static int restore_task_with_children(void *_arg)
>  		 *
>  		 * It means that all tasks entered into their namespaces.
>  		 */
> -		restore_wait_other_tasks();
> +		if (restore_wait_other_tasks())
> +			goto err;
>  		fini_restore_mntns();
>  		__restore_switch_stage(CR_STATE_RESTORE);
>  	} else {
> @@ -3333,7 +3338,8 @@ static int sigreturn_restore(pid_t pid, struct task_restore_args *task_args, uns
>  
>  	if (current->parent == NULL) {
>  		/* Wait when all tasks restored all files */
> -		restore_wait_other_tasks();
> +		if (restore_wait_other_tasks())
> +			goto err;
>  	}
>  
>  	/*
> -- 
> 2.9.4
> 


More information about the CRIU mailing list