Commit 4449a51a authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Linus Torvalds
Browse files

vm_is_stack: use for_each_thread() rather then buggy while_each_thread()



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: default avatarOleg Nesterov <oleg@redhat.com>
Reported-by: default avatarAleksei Besogonov <alex.besogonov@gmail.com>
Tested-by: default avatarAleksei Besogonov <alex.besogonov@gmail.com>
Suggested-by: default avatarDavid Rientjes <rientjes@google.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent edcad250
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -183,17 +183,14 @@ pid_t vm_is_stack(struct task_struct *task,

	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();
	}