mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	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: 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> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									edcad25095
								
							
						
					
					
						commit
						4449a51a7c
					
				
					 1 changed files with 3 additions and 6 deletions
				
			
		|  | @ -183,17 +183,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 a new issue
	
	 Oleg Nesterov
						Oleg Nesterov