vm_is_stack: use for_each_thread() rather then buggy while_each_thread()
commit 4449a51a7c
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>
This commit is contained in:
parent
efe17240f3
commit
07675d98fa
|
@ -275,17 +275,14 @@ pid_t vm_is_stack(struct task_struct *task,
|
||||||
|
|
||||||
if (in_group) {
|
if (in_group) {
|
||||||
struct task_struct *t;
|
struct task_struct *t;
|
||||||
rcu_read_lock();
|
|
||||||
if (!pid_alive(task))
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
t = task;
|
rcu_read_lock();
|
||||||
do {
|
for_each_thread(task, t) {
|
||||||
if (vm_is_stack_for_task(t, vma)) {
|
if (vm_is_stack_for_task(t, vma)) {
|
||||||
ret = t->pid;
|
ret = t->pid;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
} while_each_thread(task, t);
|
}
|
||||||
done:
|
done:
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue