diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2009-12-09 19:53:21 -0500 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2009-12-10 17:04:11 -0500 |
| commit | 7cf7db8df0b78076eafa4ead47559344ca7b7a43 (patch) | |
| tree | 5e536389e23d6c00fc93e51a4e4b90cfeac3fbc6 /kernel | |
| parent | 14d8c9f3c09e7fd7b9af80904289fe204f5b93c6 (diff) | |
signals: Fix more rcu assumptions
1) Remove the misleading comment in __sigqueue_alloc() which claims
that holding a spinlock is equivalent to rcu_read_lock().
2) Add a rcu_read_lock/unlock around the __task_cred() access
in __sigqueue_alloc()
This needs to be revisited to remove the remaining users of
read_lock(&tasklist_lock) but that's outside the scope of this patch.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
LKML-Reference: <20091210004703.269843657@linutronix.de>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/signal.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index 73316568a69c..f67545f9394c 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
| @@ -218,13 +218,13 @@ __sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimi | |||
| 218 | struct user_struct *user; | 218 | struct user_struct *user; |
| 219 | 219 | ||
| 220 | /* | 220 | /* |
| 221 | * We won't get problems with the target's UID changing under us | 221 | * Protect access to @t credentials. This can go away when all |
| 222 | * because changing it requires RCU be used, and if t != current, the | 222 | * callers hold rcu read lock. |
| 223 | * caller must be holding the RCU readlock (by way of a spinlock) and | ||
| 224 | * we use RCU protection here | ||
| 225 | */ | 223 | */ |
| 224 | rcu_read_lock(); | ||
| 226 | user = get_uid(__task_cred(t)->user); | 225 | user = get_uid(__task_cred(t)->user); |
| 227 | atomic_inc(&user->sigpending); | 226 | atomic_inc(&user->sigpending); |
| 227 | rcu_read_unlock(); | ||
| 228 | 228 | ||
| 229 | if (override_rlimit || | 229 | if (override_rlimit || |
| 230 | atomic_read(&user->sigpending) <= | 230 | atomic_read(&user->sigpending) <= |
