diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2009-12-10 00:53:21 +0000 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2009-12-10 23:04:11 +0100 |
commit | 7cf7db8df0b78076eafa4ead47559344ca7b7a43 (patch) | |
tree | 5e536389e23d6c00fc93e51a4e4b90cfeac3fbc6 /kernel/signal.c | |
parent | 14d8c9f3c09e7fd7b9af80904289fe204f5b93c6 (diff) | |
download | lwn-7cf7db8df0b78076eafa4ead47559344ca7b7a43.tar.gz lwn-7cf7db8df0b78076eafa4ead47559344ca7b7a43.zip |
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/signal.c')
-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 struct user_struct *user; /* - * We won't get problems with the target's UID changing under us - * because changing it requires RCU be used, and if t != current, the - * caller must be holding the RCU readlock (by way of a spinlock) and - * we use RCU protection here + * Protect access to @t credentials. This can go away when all + * callers hold rcu read lock. */ + rcu_read_lock(); user = get_uid(__task_cred(t)->user); atomic_inc(&user->sigpending); + rcu_read_unlock(); if (override_rlimit || atomic_read(&user->sigpending) <= |