[CRIU] [PATCH 5/7] restore: use less convoluted method to calculate the number of zombies

Pavel Emelyanov xemul at virtuozzo.com
Tue Jun 28 05:49:30 PDT 2016


On 06/23/2016 06:13 PM, Tycho Andersen wrote:
> Instead of doing this crazy thing where we pass the number of zombies back
> from the restorer blob to the main restore thread, let's just calculate the
> number in the main restore thread when we need it.
> 
> Also, note that this patch shifts the location of this calculation: we used
> to do a decrement of nr_in_progress when we waited() on a zombie, to sort
> of lie about the fact that they did go through CR_STATE_RESTORE_SIGCHLD,
> but since we're waiting on them anyway explicitly, there's no reason to do
> all this hackery. Let's just calculate the number once in the right place
> and be done with it.

Seems legit :) Applied, thanks.

> Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
> ---
>  criu/cr-restore.c       | 14 +++++++-------
>  criu/include/rst_info.h |  1 -
>  criu/pie/restorer.c     |  3 ---
>  3 files changed, 7 insertions(+), 11 deletions(-)
> 
> diff --git a/criu/cr-restore.c b/criu/cr-restore.c
> index f3e2cfb..3651f54 100644
> --- a/criu/cr-restore.c
> +++ b/criu/cr-restore.c
> @@ -1617,6 +1617,7 @@ static int restore_root_task(struct pstree_item *init)
>  	enum trace_flags flag = TRACE_ALL;
>  	int ret, fd, mnt_ns_fd = -1;
>  	int clean_remaps = 1, root_seized = 0;
> +	struct pstree_item *item;
>  
>  	ret = run_scripts(ACT_PRE_RESTORE);
>  	if (ret != 0) {
> @@ -1736,17 +1737,17 @@ static int restore_root_task(struct pstree_item *init)
>  	if (ret < 0)
>  		goto out_kill;
>  
> +	/* Zombies die after CR_STATE_RESTORE */
> +	for_each_pstree_item(item) {
> +		if (item->pid.state == TASK_DEAD)
> +			task_entries->nr_threads--;
> +	}
> +
>  	ret = restore_switch_stage(CR_STATE_RESTORE_SIGCHLD);
>  	if (ret < 0)
>  		goto out_kill;
>  
>  	/*
> -	 * The task_entries->nr_zombies is updated in the
> -	 * CR_STATE_RESTORE_SIGCHLD in pie code.
> -	 */
> -	task_entries->nr_threads -= atomic_read(&task_entries->nr_zombies);
> -
> -	/*
>  	 * There is no need to call try_clean_remaps() after this point,
>  	 * as restore went OK and all ghosts were removed by the openers.
>  	 */
> @@ -1877,7 +1878,6 @@ int prepare_task_entries(void)
>  	task_entries->nr_threads = 0;
>  	task_entries->nr_tasks = 0;
>  	task_entries->nr_helpers = 0;
> -	atomic_set(&task_entries->nr_zombies, 0);
>  	futex_set(&task_entries->start, CR_STATE_RESTORE_NS);
>  	mutex_init(&task_entries->userns_sync_lock);
>  
> diff --git a/criu/include/rst_info.h b/criu/include/rst_info.h
> index bf6a64f..2a35d88 100644
> --- a/criu/include/rst_info.h
> +++ b/criu/include/rst_info.h
> @@ -7,7 +7,6 @@
>  
>  struct task_entries {
>  	int nr_threads, nr_tasks, nr_helpers;
> -	atomic_t nr_zombies;
>  	futex_t nr_in_progress;
>  	futex_t start;
>  	atomic_t cr_err;
> diff --git a/criu/pie/restorer.c b/criu/pie/restorer.c
> index 5910fd0..2578f77 100644
> --- a/criu/pie/restorer.c
> +++ b/criu/pie/restorer.c
> @@ -1042,8 +1042,6 @@ static int wait_zombies(struct task_restore_args *task_args)
>  {
>  	int i;
>  
> -	atomic_add(task_args->zombies_n, &task_entries->nr_zombies);
> -
>  	for (i = 0; i < task_args->zombies_n; i++) {
>  		if (sys_waitid(P_PID, task_args->zombies[i], NULL, WNOWAIT | WEXITED, NULL) < 0) {
>  			pr_err("Wait on %d zombie failed\n", task_args->zombies[i]);
> @@ -1051,7 +1049,6 @@ static int wait_zombies(struct task_restore_args *task_args)
>  		}
>  		pr_debug("%ld: Collect a zombie with pid %d\n",
>  			sys_getpid(), task_args->zombies[i]);
> -		futex_dec_and_wake(&task_entries->nr_in_progress);
>  	}
>  
>  	return 0;
> 



More information about the CRIU mailing list