[Devel] Re: [PATCH RFC] checkpoint: handle saved_sigmask

Serge E. Hallyn serue at us.ibm.com
Thu Feb 18 08:08:46 PST 2010


I thought there had been followup discussion on this, but I don't
see it in my mbox.  (maybe it was on irc?)

Did we decide to punt on this until v20?

-serge

Quoting Serge E. Hallyn (serue at us.ibm.com):
> Each arch seems to have its own way of specifying that
> current->saved_sigmask should contains the valid blocked
> sigmask.  So provide an arch-specific hook for that test,
> and, if true, then store saved_sigmask in place of blocked
> in the checkpoint image.  None of the architectures currently
> save these flags, so we don't need to do anything special
> to unset them after restart.
> 
> If right after sys_restart the a signal needs to be handled
> (which was sent during restart) then it will just do the right
> thing (save blocked back to saved_sigmask and set
> TIF_RESTORE_SIGMASK or whatever).
> 
> Thoughts?
> 
> Signed-off-by: Serge E. Hallyn <serue at us.ibm.com>
> ---
>  arch/powerpc/kernel/signal.c  |    9 +++++++++
>  arch/s390/kernel/checkpoint.c |    2 --
>  arch/s390/kernel/signal.c     |    7 +++++++
>  arch/x86/kernel/signal.c      |    6 ++++++
>  checkpoint/signal.c           |    5 ++++-
>  include/linux/signal.h        |    6 ++++++
>  6 files changed, 32 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c
> index 00b5078..4aa0128 100644
> --- a/arch/powerpc/kernel/signal.c
> +++ b/arch/powerpc/kernel/signal.c
> @@ -188,6 +188,15 @@ static int do_signal_pending(sigset_t *oldset, struct pt_regs *regs)
>  	return ret;
>  }
> 
> +int task_restore_sigmask(struct task_struct *task)
> +{
> +	struct thread_info *ti = task_thread_info(task);
> +	if (ti->local_flags & _TLF_RESTORE_SIGMASK)
> +		return 1;
> +	return 0;
> +}
> +
> +
>  void do_signal(struct pt_regs *regs, unsigned long thread_info_flags)
>  {
>  	if (thread_info_flags & _TIF_SIGPENDING)
> diff --git a/arch/s390/kernel/checkpoint.c b/arch/s390/kernel/checkpoint.c
> index 092fd87..048e820 100644
> --- a/arch/s390/kernel/checkpoint.c
> +++ b/arch/s390/kernel/checkpoint.c
> @@ -200,8 +200,6 @@ int restore_thread(struct ckpt_ctx *ctx)
>  		set_thread_flag(TIF_RESTARTBLOCK);
>  	}
> 
> -	/* need to do something with TIF_RESTORE_SIGMASK ? */
> -
>  	ckpt_hdr_put(ctx, h);
>  	return 0;
>  }
> diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c
> index 503fd09..0654f12 100644
> --- a/arch/s390/kernel/signal.c
> +++ b/arch/s390/kernel/signal.c
> @@ -538,6 +538,13 @@ void do_signal(struct pt_regs *regs)
>  	}
>  }
> 
> +int task_restore_sigmask(struct task_struct *task)
> +{
> +	if (test_tsk_thread_flag(task, TIF_RESTORE_SIGMASK))
> +		return 1;
> +	return 0;
> +}
> +
>  void do_notify_resume(struct pt_regs *regs)
>  {
>  	clear_thread_flag(TIF_NOTIFY_RESUME);
> diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
> index 6a44a76..a6e8035 100644
> --- a/arch/x86/kernel/signal.c
> +++ b/arch/x86/kernel/signal.c
> @@ -849,6 +849,12 @@ static void do_signal(struct pt_regs *regs)
>  	}
>  }
> 
> +int task_restore_sigmask(struct task_struct *task) {
> +	if (task_thread_info(t)->status & TS_RESTORE_SIGMASK)
> +		return 1;
> +	return 0;
> +}
> +
>  /*
>   * notification of userspace execution resumption
>   * - triggered by the TIF_WORK_MASK flags
> diff --git a/checkpoint/signal.c b/checkpoint/signal.c
> index 609e924..ad95e0c 100644
> --- a/checkpoint/signal.c
> +++ b/checkpoint/signal.c
> @@ -682,7 +682,10 @@ int checkpoint_task_signal(struct ckpt_ctx *ctx, struct task_struct *t)
>  	if (!h)
>  		return -ENOMEM;
> 
> -	fill_sigset(&h->blocked, &t->blocked);
> +	if (task_restore_sigmask(t))
> +		fill_sigset(&h->blocked, &t->saved_sigmask);
> +	else
> +		fill_sigset(&h->blocked, &t->blocked);
> 
>  	ret = ckpt_write_obj(ctx, &h->h);
>  	ckpt_hdr_put(ctx, h);
> diff --git a/include/linux/signal.h b/include/linux/signal.h
> index ab9272c..aa18432 100644
> --- a/include/linux/signal.h
> +++ b/include/linux/signal.h
> @@ -376,6 +376,12 @@ int unhandled_signal(struct task_struct *tsk, int sig);
> 
>  void signals_init(void);
> 
> +/*
> + * arch-specific query, used at checkpoint: should saved_sigmask be used
> + * in place of blocked
> + */
> +int task_restore_sigmask(struct task_struct *task);
> +
>  #endif /* __KERNEL__ */
> 
>  #endif /* _LINUX_SIGNAL_H */
> -- 
> 1.6.1
> 
> _______________________________________________
> Containers mailing list
> Containers at lists.linux-foundation.org
> https://lists.linux-foundation.org/mailman/listinfo/containers
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers




More information about the Devel mailing list