[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