[CRIU] [PATCH 3/3] x86: use breakpoints instead of tracing syscalls

Pavel Emelyanov xemul at parallels.com
Wed Sep 17 06:07:14 PDT 2014


On 09/17/2014 12:10 PM, Andrey Vagin wrote:

> @@ -868,6 +869,12 @@ static int parasite_fini_seized(struct parasite_ctl *ctl)
>  	if (ret)
>  		return -1;
>  
> +	/* Go to sigreturn as closer as we can */
> +	ret = parasite_stop_before_sigreturn(pid, ctl);
> +	if (ret)
> +		return ret;

Can we reshuffle the code, so that the one below doesn't even
compile on x86?

> +
> +	/* Start tracing syscalls */
>  	ret = ptrace(PTRACE_SYSCALL, pid, NULL, NULL);
>  	if (ret) {
>  		pr_perror("ptrace");
> diff --git a/pie/parasite.c b/pie/parasite.c
> index c30a7fb..bab67f8 100644
> --- a/pie/parasite.c
> +++ b/pie/parasite.c
> @@ -438,6 +438,11 @@ static int __parasite_daemon_wait_msg(struct ctl_msg *m)
>  	return -1;
>  }
>  
> +static noinline void fini_sigreturn(unsigned long new_sp)
> +{
> +	ARCH_RT_SIGRETURN(new_sp);
> +}
> +
>  static int fini()
>  {
>  	unsigned long new_sp;
> @@ -454,7 +459,7 @@ static int fini()
>  	sys_close(tsock);
>  	log_set_fd(-1);
>  
> -	ARCH_RT_SIGRETURN(new_sp);
> +	fini_sigreturn(new_sp);
>  
>  	BUG();
>  
> @@ -561,6 +566,7 @@ static noinline __used int parasite_init_daemon(void *data)
>  	struct parasite_init_args *args = data;
>  	int ret;
>  
> +	args->sigreturn_addr = fini_sigreturn;
>  	sigframe = args->sigframe;
>  
>  	tsock = sys_socket(PF_UNIX, SOCK_SEQPACKET, 0);
> 



More information about the CRIU mailing list