[CRIU] [PATCH 4/8] parasite: add simplified version of parasite_prep_ctl

Pavel Emelyanov xemul at parallels.com
Fri Sep 13 06:10:08 EDT 2013


On 09/13/2013 01:53 PM, Andrey Vagin wrote:
> The simplified version of parasite_prep_ctl doesn't search a place for
> system call code, which is injected for mapping a parasite blob.
> 
> It will be used for unmaping a restorer blob and this blob will contain
> all required code for unmapping itself.

Better add bool setup_syscall argument, please.

> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
>  include/parasite-syscall.h |  1 +
>  parasite-syscall.c         | 22 ++++++++++++++++++----
>  2 files changed, 19 insertions(+), 4 deletions(-)
> 
> diff --git a/include/parasite-syscall.h b/include/parasite-syscall.h
> index 3515a30..cb07cb0 100644
> --- a/include/parasite-syscall.h
> +++ b/include/parasite-syscall.h
> @@ -115,4 +115,5 @@ extern int parasite_fixup_vdso(struct parasite_ctl *ctl, pid_t pid,
>  			       struct vm_area_list *vma_area_list);
>  
>  extern int parasite_stop_on_syscall(int tasks, int sys_nr);
> +extern struct parasite_ctl *__parasite_prep_ctl(pid_t pid);
>  #endif /* __CR_PARASITE_SYSCALL_H__ */
> diff --git a/parasite-syscall.c b/parasite-syscall.c
> index a8ef03d..65b380b 100644
> --- a/parasite-syscall.c
> +++ b/parasite-syscall.c
> @@ -881,10 +881,10 @@ int parasite_cure_seized(struct parasite_ctl *ctl)
>  	return ret;
>  }
>  
> -struct parasite_ctl *parasite_prep_ctl(pid_t pid, struct vm_area_list *vma_area_list)
> +/* __parasite_prep_ctl() doesn't search a place for injecting code */
> +struct parasite_ctl *__parasite_prep_ctl(pid_t pid)
>  {
>  	struct parasite_ctl *ctl = NULL;
> -	struct vma_area *vma_area;
>  
>  	if (!arch_can_dump_task(pid))
>  		goto err;
> @@ -899,6 +899,7 @@ struct parasite_ctl *parasite_prep_ctl(pid_t pid, struct vm_area_list *vma_area_
>  	}
>  
>  	ctl->tsock = -1;
> +	ctl->pid.real	= pid;
>  
>  	if (ptrace(PTRACE_GETSIGMASK, pid, sizeof(k_rtsigset_t), &ctl->sig_blocked)) {
>  		pr_perror("ptrace doesn't support PTRACE_GETSIGMASK\n");
> @@ -910,6 +911,21 @@ struct parasite_ctl *parasite_prep_ctl(pid_t pid, struct vm_area_list *vma_area_
>  		goto err;
>  	}
>  
> +	return ctl;
> +err:
> +	xfree(ctl);
> +	return NULL;
> +}
> +
> +struct parasite_ctl *parasite_prep_ctl(pid_t pid, struct vm_area_list *vma_area_list)
> +{
> +	struct vma_area *vma_area;
> +	struct parasite_ctl *ctl;
> +
> +	ctl = __parasite_prep_ctl(pid);
> +	if (ctl == NULL)
> +		return NULL;
> +
>  	vma_area = get_vma_by_ip(&vma_area_list->h, REG_IP(ctl->regs_orig));
>  	if (!vma_area) {
>  		pr_err("No suitable VMA found to run parasite "
> @@ -917,8 +933,6 @@ struct parasite_ctl *parasite_prep_ctl(pid_t pid, struct vm_area_list *vma_area_
>  		goto err;
>  	}
>  
> -	ctl->pid.real	= pid;
> -	ctl->pid.virt	= 0;
>  	ctl->syscall_ip	= vma_area->vma.start;
>  
>  	return ctl;
> 




More information about the CRIU mailing list