Re: Fix signalfd interaction with thread-private signals

Oleg Nesterov
2007-06-19T09:14:40Z

On 06/18, Linus Torvalds wrote:
>
> On Mon, 18 Jun 2007, Benjamin Herrenschmidt wrote:
> > On Sun, 2007-06-17 at 17:20 -0700, Davide Libenzi wrote:
> > >
> > > Andrew or Linus, did you get Ben's patch?
> >
> > It might have been missed... I can resend later today.
>
> I did indeed just miss it. I intended to apply it (and actually thought I
> had), but I see it's still just an email in that long thread.
>
> (It's often a good idea to re-write the subject line and make it be that
> standard "[PATCH] ..description..", because that just makes it show up
> much better when I go through my unread emails.. Not that that is any
> kind of *guarantee* that I won't miss it).
>
> Anyway, no need to re-send, it's now *really* in my queue of things to
> apply.

>From another message on this thread,

Davide Libenzi wrote:
>
> On Sun, 17 Jun 2007, Nicholas Miell wrote:
>
> > But there's still no way for multiple threads to read from a single
> > signalfd and get their own thread-specific signals in addition to
> > process-wide signals, right? I think this was agreed to be the least
> > surprising behavior.
>
> Multiple threads can wait on the signalfd. Each one will dequeue either
> its own private signals (tsk->pending) or the process shared ones
> (tsk->signal->shared_pending). This will be the behaviour once Ben's patch
> is applied.

The commited "Fix signalfd interaction with thread-private signals"
(commit caec4e8dc85e0644ec24aeb36285e1ba02da58cc) doesn't implement
this.

We can do something like

int signalfd_dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
{
if (tsk->tgid == current->tgid)
tsk = current;

return dequeue_signal(tsk, mask, info);
}

(still I can't understand why should we change signalfd).

Oleg.