diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2006-06-26 09:26:01 +0200 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-26 18:58:26 +0200 |
commit | cc288738c9ae3c64d3c50b86604044d1f6d22941 (patch) | |
tree | 87058616bfa84572647fbe574fe733e81c1d17b6 /fs/proc/base.c | |
parent | [PATCH] proc: Cleanup proc_fd_access_allowed (diff) | |
download | linux-cc288738c9ae3c64d3c50b86604044d1f6d22941.tar.xz linux-cc288738c9ae3c64d3c50b86604044d1f6d22941.zip |
[PATCH] proc: Remove tasklist_lock from proc_task_readdir.
This is just like my previous removal of tasklist_lock from first_tgid, and
next_tgid. It simply had to wait until it was rcu safe to walk the thread
list.
This should be the last instance of the tasklist_lock in proc. So user
processes should not be able to influence the tasklist lock hold times.
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/proc/base.c')
-rw-r--r-- | fs/proc/base.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index 773469703c62..6092a6e2c5a9 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -2224,11 +2224,12 @@ int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir) * In the case of a seek we start with the leader and walk nr * threads past it. */ -static struct task_struct *first_tid(struct task_struct *leader, int tid, int nr) +static struct task_struct *first_tid(struct task_struct *leader, + int tid, int nr) { struct task_struct *pos = NULL; - read_lock(&tasklist_lock); + rcu_read_lock(); /* Attempt to start with the pid of a thread */ if (tid && (nr > 0)) { pos = find_task_by_pid(tid); @@ -2258,7 +2259,7 @@ static struct task_struct *first_tid(struct task_struct *leader, int tid, int nr } pos = NULL; done: - read_unlock(&tasklist_lock); + rcu_read_unlock(); return pos; } @@ -2271,7 +2272,7 @@ done: static struct task_struct *next_tid(struct task_struct *start) { struct task_struct *pos; - read_lock(&tasklist_lock); + rcu_read_lock(); pos = start; if (pid_alive(start)) pos = next_thread(start); @@ -2279,7 +2280,7 @@ static struct task_struct *next_tid(struct task_struct *start) get_task_struct(pos); else pos = NULL; - read_unlock(&tasklist_lock); + rcu_read_unlock(); put_task_struct(start); return pos; } |