mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	get_task_mm: check PF_KTHREAD lockless
Nowadays PF_KTHREAD is sticky and it was never protected by ->alloc_lock. Move the PF_KTHREAD check outside of task_lock() section to make this code more understandable. Link: https://lkml.kernel.org/r/20240626191017.GA20031@redhat.com Signed-off-by: Oleg Nesterov <oleg@redhat.com> Acked-by: Michal Hocko <mhocko@suse.com> Cc: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									d73d003521
								
							
						
					
					
						commit
						8ac5dc6659
					
				
					 1 changed files with 5 additions and 6 deletions
				
			
		| 
						 | 
					@ -1536,14 +1536,13 @@ struct mm_struct *get_task_mm(struct task_struct *task)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct mm_struct *mm;
 | 
						struct mm_struct *mm;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (task->flags & PF_KTHREAD)
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	task_lock(task);
 | 
						task_lock(task);
 | 
				
			||||||
	mm = task->mm;
 | 
						mm = task->mm;
 | 
				
			||||||
	if (mm) {
 | 
						if (mm)
 | 
				
			||||||
		if (task->flags & PF_KTHREAD)
 | 
							mmget(mm);
 | 
				
			||||||
			mm = NULL;
 | 
					 | 
				
			||||||
		else
 | 
					 | 
				
			||||||
			mmget(mm);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	task_unlock(task);
 | 
						task_unlock(task);
 | 
				
			||||||
	return mm;
 | 
						return mm;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue