public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Davide Libenzi <davidel@xmailserver.org>,
	Nicholas Miell <nmiell@comcast.net>,
	Linux Kernel list <linux-kernel@vger.kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Paul Mackerras <paulus@samba.org>
Subject: Re: signalfd API issues (was Re: [PATCH/RFC] signal races/bugs, losing TIF_SIGPENDING and other woes)
Date: Wed, 06 Jun 2007 16:47:31 +1000	[thread overview]
Message-ID: <1181112452.31677.220.camel@localhost.localdomain> (raw)
In-Reply-To: <alpine.LFD.0.98.0706052035410.4205@woody.linux-foundation.org>

On Tue, 2007-06-05 at 20:37 -0700, Linus Torvalds wrote:

> I agree that it would be a limitation, but it would be a sane one.
> 
> How about we try to live with that limitation, if only to avoid the issue 
> of having the private signals being stolen by anybody else. If we actually 
> find a real-live use-case where that is bad in the future, we can re-visit 
> the issue - it's always easier to _expand_ semantics later than it is to 
> restrict them, so I think this thread is a good argument for starting it 
> out in a more restricted form before people start depending on semantics 
> that can be nasty..

Here's a patch. Let me know if I missed something.

Fix races with signalfd and TIF_SIGPENDING

We must never clear TIF_SIGPENDING for another task. This patch
ensures that by preventing recalc_sigpending_tsk() from clearing
that bit if the target task is not current.

In addition we also prevent __dequeue_signal() from calling the
DRM notifier thingy when stealing signals from another task via
signalfd.

Finally, we only dequeue shared signals when called from another
task (via signalfd), we leave private signals alone.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---

Index: linux-work/kernel/signal.c
===================================================================
--- linux-work.orig/kernel/signal.c	2007-06-06 16:38:05.000000000 +1000
+++ linux-work/kernel/signal.c	2007-06-06 16:42:43.000000000 +1000
@@ -105,7 +105,12 @@ static int recalc_sigpending_tsk(struct 
 		set_tsk_thread_flag(t, TIF_SIGPENDING);
 		return 1;
 	}
-	clear_tsk_thread_flag(t, TIF_SIGPENDING);
+	/* Only clear the flag when this is issued by the target task to
+	 * clearing TIF_SIGPENDING after the target task decided to return
+	 * -ERESTARTSYS from a syscall
+	 */
+	if (t == current)
+		clear_tsk_thread_flag(t, TIF_SIGPENDING);
 	return 0;
 }
 
@@ -328,12 +333,12 @@ static int collect_signal(int sig, struc
 }
 
 static int __dequeue_signal(struct sigpending *pending, sigset_t *mask,
-			siginfo_t *info)
+			    siginfo_t *info, int stealing)
 {
 	int sig = next_signal(pending, mask);
 
 	if (sig) {
-		if (current->notifier) {
+		if (current->notifier && !stealing) {
 			if (sigismember(current->notifier_mask, sig)) {
 				if (!(current->notifier)(current->notifier_data)) {
 					clear_thread_flag(TIF_SIGPENDING);
@@ -357,10 +362,19 @@ static int __dequeue_signal(struct sigpe
  */
 int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
 {
-	int signr = __dequeue_signal(&tsk->pending, mask, info);
+	int stealing = tsk != current;
+	int signr = 0;
+
+	/* Only dequeue private signals if we are the owner, not when signals
+	 * are being stolen by another task via signalfd
+	 */
+	if (!stealing)
+		signr = __dequeue_signal(&tsk->pending, mask, info, 0);
+
+	/* No private signal, look for shared ones */
 	if (!signr) {
 		signr = __dequeue_signal(&tsk->signal->shared_pending,
-					 mask, info);
+					 mask, info, stealing);
 		/*
 		 * itimer signal ?
 		 *



  parent reply	other threads:[~2007-06-06  6:47 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-06-05  1:25 [PATCH/RFC] signal races/bugs, losing TIF_SIGPENDING and other woes Benjamin Herrenschmidt
2007-06-05  1:44 ` Linus Torvalds
2007-06-05  2:10   ` Benjamin Herrenschmidt
2007-06-05  2:38     ` Davide Libenzi
2007-06-05  3:22       ` Benjamin Herrenschmidt
2007-06-05  6:09         ` Nicholas Miell
2007-06-05  7:27           ` Benjamin Herrenschmidt
2007-06-05 23:51             ` Nicholas Miell
2007-06-06  0:03               ` Benjamin Herrenschmidt
2007-06-06  0:11               ` Davide Libenzi
2007-06-06  0:15                 ` Nicholas Miell
2007-06-06  0:37                   ` Davide Libenzi
2007-06-06  0:58                     ` signalfd API issues (was Re: [PATCH/RFC] signal races/bugs, losing TIF_SIGPENDING and other woes) Nicholas Miell
2007-06-06  2:50                       ` Benjamin Herrenschmidt
2007-06-06  3:29                         ` Davide Libenzi
2007-06-06  3:37                           ` Linus Torvalds
2007-06-06  4:08                             ` Nicholas Miell
2007-06-06  4:18                               ` Benjamin Herrenschmidt
2007-06-06  4:35                             ` Davide Libenzi
2007-06-06  6:47                             ` Benjamin Herrenschmidt [this message]
2007-06-06 22:36                               ` Davide Libenzi
2007-06-06  3:52                           ` Benjamin Herrenschmidt
2007-06-06 12:52                         ` Jeff Dike
2007-06-06 22:43                           ` Paul Mackerras
2007-06-07  2:20                             ` Jeff Dike
2007-06-07  3:29                               ` Benjamin Herrenschmidt
2007-06-07 13:59                                 ` Jeff Dike
2007-06-07  3:21                           ` Benjamin Herrenschmidt
2007-06-05 15:52     ` [PATCH/RFC] signal races/bugs, losing TIF_SIGPENDING and other woes Davide Libenzi
2007-06-05 22:15       ` Benjamin Herrenschmidt
2007-06-05 22:50         ` Davide Libenzi
2007-06-05 22:59           ` Benjamin Herrenschmidt
2007-06-06  0:11             ` Davide Libenzi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1181112452.31677.220.camel@localhost.localdomain \
    --to=benh@kernel.crashing.org \
    --cc=akpm@linux-foundation.org \
    --cc=davidel@xmailserver.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nmiell@comcast.net \
    --cc=paulus@samba.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox