All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleg Nesterov <oleg@redhat.com>
To: Tejun Heo <tj@kernel.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: "Nikita V. Youshchenko" <nyoushchenko@mvista.com>,
	Matt Fleming <matt@console-pimps.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	linux-kernel@vger.kernel.org
Subject: [PATCH 3/6] signal: sigprocmask: narrow the scope of ->sigloc
Date: Mon, 11 Apr 2011 19:21:09 +0200	[thread overview]
Message-ID: <20110411172109.GD32469@redhat.com> (raw)
In-Reply-To: <20110411171957.GA32469@redhat.com>

No functional changes, preparation to simplify the review of the next change.

1. We can read current->block lockless, nobody else can ever change this mask.

2. Calculate the resulting sigset_t outside of ->siglock into the temporary
   variable, then take ->siglock and change ->blocked.

Also, kill the stale comment about BKL.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---

 kernel/signal.c |   28 ++++++++++++----------------
 1 file changed, 12 insertions(+), 16 deletions(-)

--- sigprocmask/kernel/signal.c~3_cleanup_sigprocmask	2011-04-10 21:54:24.000000000 +0200
+++ sigprocmask/kernel/signal.c	2011-04-10 21:57:42.000000000 +0200
@@ -2101,12 +2101,6 @@ long do_no_restart_syscall(struct restar
 }
 
 /*
- * We don't need to get the kernel lock - this is all local to this
- * particular thread.. (and that's good, because this is _heavily_
- * used by various programs)
- */
-
-/*
  * This is also useful for kernel threads that want to temporarily
  * (or permanently) block certain signals.
  *
@@ -2116,30 +2110,32 @@ long do_no_restart_syscall(struct restar
  */
 int sigprocmask(int how, sigset_t *set, sigset_t *oldset)
 {
-	int error;
+	struct task_struct *tsk = current;
+	sigset_t newset;
 
-	spin_lock_irq(&current->sighand->siglock);
 	if (oldset)
-		*oldset = current->blocked;
+		*oldset = tsk->blocked;
 
-	error = 0;
 	switch (how) {
 	case SIG_BLOCK:
-		sigorsets(&current->blocked, &current->blocked, set);
+		sigorsets(&newset, &tsk->blocked, set);
 		break;
 	case SIG_UNBLOCK:
-		signandsets(&current->blocked, &current->blocked, set);
+		signandsets(&newset, &tsk->blocked, set);
 		break;
 	case SIG_SETMASK:
-		current->blocked = *set;
+		newset = *set;
 		break;
 	default:
-		error = -EINVAL;
+		return -EINVAL;
 	}
+
+	spin_lock_irq(&tsk->sighand->siglock);
+	tsk->blocked = newset;
 	recalc_sigpending();
-	spin_unlock_irq(&current->sighand->siglock);
+	spin_unlock_irq(&tsk->sighand->siglock);
 
-	return error;
+	return 0;
 }
 
 /**


  parent reply	other threads:[~2011-04-11 17:22 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-04-11 17:19 [RFC PATCH 0/6] signal: sigprocmask fixes Oleg Nesterov
2011-04-11 17:20 ` [PATCH 1/6] signal: introduce retarget_shared_pending() Oleg Nesterov
2011-04-12 11:39   ` Matt Fleming
2011-04-11 17:20 ` [PATCH 2/6] signal: retarget_shared_pending: consider shared/unblocked signals only Oleg Nesterov
2011-04-12 11:40   ` Matt Fleming
2011-04-12 19:53     ` Oleg Nesterov
2011-04-11 17:21 ` Oleg Nesterov [this message]
2011-04-12 11:38   ` [PATCH 3/6] signal: sigprocmask: narrow the scope of ->sigloc Matt Fleming
2011-04-11 17:21 ` [PATCH 4/6] signal: sigprocmask() should do retarget_shared_pending() Oleg Nesterov
2011-04-12 12:07   ` Matt Fleming
2011-04-12 14:32   ` Linus Torvalds
2011-04-14 19:36     ` Oleg Nesterov
2011-04-12 18:33   ` Tejun Heo
2011-04-14 20:10     ` Oleg Nesterov
2011-04-14 20:33       ` Linus Torvalds
2011-04-11 17:22 ` [PATCH 5/6] x86: signal: handle_signal() should use sigprocmask() Oleg Nesterov
2011-04-12 12:15   ` Matt Fleming
2011-04-11 17:22 ` [PATCH 6/6] x86: signal: sys_rt_sigreturn() " Oleg Nesterov
2011-04-12 12:17   ` Matt Fleming
2011-04-14 20:15     ` Oleg Nesterov

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=20110411172109.GD32469@redhat.com \
    --to=oleg@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=matt@console-pimps.org \
    --cc=nyoushchenko@mvista.com \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.