| From 4449a51a7c281602d3a385044ab928322a122a02 Mon Sep 17 00:00:00 2001 |
| From: Oleg Nesterov <oleg@redhat.com> |
| Date: Fri, 8 Aug 2014 14:19:17 -0700 |
| Subject: vm_is_stack: use for_each_thread() rather then buggy while_each_thread() |
| |
| From: Oleg Nesterov <oleg@redhat.com> |
| |
| commit 4449a51a7c281602d3a385044ab928322a122a02 upstream. |
| |
| Aleksei hit the soft lockup during reading /proc/PID/smaps. David |
| investigated the problem and suggested the right fix. |
| |
| while_each_thread() is racy and should die, this patch updates |
| vm_is_stack(). |
| |
| Signed-off-by: Oleg Nesterov <oleg@redhat.com> |
| Reported-by: Aleksei Besogonov <alex.besogonov@gmail.com> |
| Tested-by: Aleksei Besogonov <alex.besogonov@gmail.com> |
| Suggested-by: David Rientjes <rientjes@google.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| mm/util.c | 9 +++------ |
| 1 file changed, 3 insertions(+), 6 deletions(-) |
| |
| --- a/mm/util.c |
| +++ b/mm/util.c |
| @@ -275,17 +275,14 @@ pid_t vm_is_stack(struct task_struct *ta |
| |
| if (in_group) { |
| struct task_struct *t; |
| - rcu_read_lock(); |
| - if (!pid_alive(task)) |
| - goto done; |
| |
| - t = task; |
| - do { |
| + rcu_read_lock(); |
| + for_each_thread(task, t) { |
| if (vm_is_stack_for_task(t, vma)) { |
| ret = t->pid; |
| goto done; |
| } |
| - } while_each_thread(task, t); |
| + } |
| done: |
| rcu_read_unlock(); |
| } |