[CRIU] [PATCH 2/4] restore: fill up thread_args a bit earlier

Pavel Emelyanov xemul at parallels.com
Fri Dec 21 08:38:43 EST 2012


On 12/21/2012 05:19 PM, Andrey Vagin wrote:

Earlier? You move the code _down_ the sigreturn_restore function...

> It's preparation for the next patch.
> 
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
>  cr-restore.c | 103 ++++++++++++++++++++++++++++++-----------------------------
>  1 file changed, 52 insertions(+), 51 deletions(-)
> 
> diff --git a/cr-restore.c b/cr-restore.c
> index ce79f02..6c0f31b 100644
> --- a/cr-restore.c
> +++ b/cr-restore.c
> @@ -1894,51 +1894,12 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
>  
>  	strncpy(task_args->comm, core->tc->comm, sizeof(task_args->comm));
>  
> -	task_args->t.clear_tid_addr	= core->thread_info->clear_tid_addr;
> -	task_args->ids			= *core->ids;
> -	task_args->t.gpregs		= *core->thread_info->gpregs;
> -	task_args->t.blk_sigset		= core->tc->blk_sigset;
> -	task_args->t.has_blk_sigset	= true;
> -
> -	if (core->thread_core) {
> -		task_args->t.has_futex		= true;
> -		task_args->t.futex_rla		= core->thread_core->futex_rla;
> -		task_args->t.futex_rla_len	= core->thread_core->futex_rla_len;
> -
> -		ret = prep_sched_info(&task_args->t.sp, core->thread_core);
> -		if (ret)
> -			goto err;
> -	}
> -
> -	/* No longer need it */
> -	core_entry__free_unpacked(core, NULL);
> -
> -	ret = prepare_itimers(pid, task_args);
> -	if (ret < 0)
> -		goto err;
> -
> -	ret = prepare_creds(pid, task_args);
> -	if (ret < 0)
> -		goto err;
> -
> -	ret = prepare_mm(pid, task_args);
> -	if (ret < 0)
> -		goto err;
> -
> -	mutex_init(&task_args->rst_lock);
> -
> -	/*
> -	 * Now prepare run-time data for threads restore.
> -	 */
> -	task_args->nr_threads		= current->nr_threads;
> -	task_args->clone_restore_fn	= (void *)restore_thread_exec_start;
> -	task_args->thread_args		= thread_args;
> -
>  	/*
>  	 * Fill up per-thread data.
>  	 */
>  	for (i = 0; i < current->nr_threads; i++) {
>  		int fd_core;
> +		CoreEntry *tcore;
>  		thread_args[i].pid = current->threads[i].virt;
>  
>  		/* skip self */
> @@ -1960,10 +1921,10 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
>  			goto err;
>  		}
>  
> -		ret = pb_read_one(fd_core, &core, PB_CORE);
> +		ret = pb_read_one(fd_core, &tcore, PB_CORE);
>  		close(fd_core);
>  
> -		if (core->tc || core->ids) {
> +		if (tcore->tc || tcore->ids) {
>  			pr_err("Thread has optional fields present %d\n",
>  			       thread_args[i].pid);
>  			ret = -1;
> @@ -1976,22 +1937,22 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
>  		}
>  
>  		thread_args[i].ta		= task_args;
> -		thread_args[i].gpregs		= *core->thread_info->gpregs;
> -		thread_args[i].clear_tid_addr	= core->thread_info->clear_tid_addr;
> +		thread_args[i].gpregs		= *tcore->thread_info->gpregs;
> +		thread_args[i].clear_tid_addr	= tcore->thread_info->clear_tid_addr;
>  
> -		if (core->thread_core) {
> +		if (tcore->thread_core) {
>  			thread_args[i].has_futex	= true;
> -			thread_args[i].futex_rla	= core->thread_core->futex_rla;
> -			thread_args[i].futex_rla_len	= core->thread_core->futex_rla_len;
> -			thread_args[i].has_blk_sigset	= core->thread_core->has_blk_sigset;
> -			thread_args[i].blk_sigset	= core->thread_core->blk_sigset;
> +			thread_args[i].futex_rla	= tcore->thread_core->futex_rla;
> +			thread_args[i].futex_rla_len	= tcore->thread_core->futex_rla_len;
> +			thread_args[i].has_blk_sigset	= tcore->thread_core->has_blk_sigset;
> +			thread_args[i].blk_sigset	= tcore->thread_core->blk_sigset;
>  
> -			ret = prep_sched_info(&thread_args[i].sp, core->thread_core);
> +			ret = prep_sched_info(&thread_args[i].sp, tcore->thread_core);
>  			if (ret)
>  				goto err;
>  		}
>  
> -		core_entry__free_unpacked(core, NULL);
> +		core_entry__free_unpacked(tcore, NULL);
>  
>  		pr_info("Thread %4d stack %8p heap %8p rt_sigframe %8p\n",
>  				i, thread_args[i].mem_zone.stack,
> @@ -2000,6 +1961,46 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
>  
>  	}
>  
> +	task_args->t.clear_tid_addr	= core->thread_info->clear_tid_addr;
> +	task_args->ids			= *core->ids;
> +	task_args->t.gpregs		= *core->thread_info->gpregs;
> +	task_args->t.blk_sigset		= core->tc->blk_sigset;
> +	task_args->t.has_blk_sigset	= true;
> +
> +	if (core->thread_core) {
> +		task_args->t.has_futex		= true;
> +		task_args->t.futex_rla		= core->thread_core->futex_rla;
> +		task_args->t.futex_rla_len	= core->thread_core->futex_rla_len;
> +
> +		ret = prep_sched_info(&task_args->t.sp, core->thread_core);
> +		if (ret)
> +			goto err;
> +	}
> +
> +	/* No longer need it */
> +	core_entry__free_unpacked(core, NULL);
> +
> +	ret = prepare_itimers(pid, task_args);
> +	if (ret < 0)
> +		goto err;
> +
> +	ret = prepare_creds(pid, task_args);
> +	if (ret < 0)
> +		goto err;
> +
> +	ret = prepare_mm(pid, task_args);
> +	if (ret < 0)
> +		goto err;
> +
> +	mutex_init(&task_args->rst_lock);
> +
> +	/*
> +	 * Now prepare run-time data for threads restore.
> +	 */
> +	task_args->nr_threads		= current->nr_threads;
> +	task_args->clone_restore_fn	= (void *)restore_thread_exec_start;
> +	task_args->thread_args		= thread_args;
> +
>  	close_image_dir();
>  
>  	pr_info("task_args: %p\n"
> 




More information about the CRIU mailing list