[CRIU] [PATCH 3/8] sig: Instantly drop SA_NOCLDSTOP for swrk_restore
Andrew Vagin
avagin at parallels.com
Wed Aug 6 05:57:30 PDT 2014
Acked-by: Andrew Vagin <avagin at parallels.com>
On Wed, Aug 06, 2014 at 04:24:36PM +0400, Pavel Emelyanov wrote:
> We tune the CHLD handler if we're restoring root task
> as sibling. This tuning is better to be done with one
> sigaction() call, rather than two. First, it's shorter
> and the second -- it will allow us to move the whole
> criu signalling setup into one helper.
>
> Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
> ---
> cr-restore.c | 29 ++++++++++++-----------------
> 1 file changed, 12 insertions(+), 17 deletions(-)
>
> diff --git a/cr-restore.c b/cr-restore.c
> index e34e8a6..5aa5472 100644
> --- a/cr-restore.c
> +++ b/cr-restore.c
> @@ -1498,6 +1498,18 @@ static int restore_root_task(struct pstree_item *init)
> }
>
> act.sa_flags |= SA_NOCLDSTOP | SA_SIGINFO | SA_RESTART;
> + if (opts.swrk_restore)
> + /*
> + * Root task will be our sibling. This means, that
> + * we will not notice when (if) it dies in SIGCHLD
> + * handler, but we should. To do this -- attach to
> + * the guy with ptrace (below) and (!) make the kernel
> + * deliver us the signal when it will get stopped.
> + * It will in case of e.g. segfault before handling
> + * the signal.
> + */
> + act.sa_flags &= ~SA_NOCLDSTOP;
> +
> act.sa_sigaction = sigchld_handler;
> sigemptyset(&act.sa_mask);
> sigaddset(&act.sa_mask, SIGCHLD);
> @@ -1545,23 +1557,6 @@ static int restore_root_task(struct pstree_item *init)
> return -1;
>
> if (opts.swrk_restore) {
> - /*
> - * Root task is not our sibling. This means, that
> - * we will not notice when (if) it dies in SIGCHLD
> - * handler, but we should. To do this -- attach to
> - * the guy with ptrace and (!) make the kernel
> - * deliver us the signal when it will get stopped.
> - * It will in case of e.g. segfault before handling
> - * the signal.
> - */
> -
> - act.sa_flags &= ~SA_NOCLDSTOP;
> - ret = sigaction(SIGCHLD, &act, NULL);
> - if (ret < 0) {
> - pr_perror("sigaction() failed");
> - goto out;
> - }
> -
> if (ptrace(PTRACE_SEIZE, init->pid.real, 0, 0)) {
> pr_perror("Can't attach to init");
> goto out;
> --
> 1.8.4.2
>
>
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
More information about the CRIU
mailing list