diff options
author | Oleg Nesterov <oleg@redhat.com> | 2024-06-26 21:10:17 +0200 |
---|---|---|
committer | Andrew Morton <akpm@linux-foundation.org> | 2024-07-04 18:05:58 -0700 |
commit | 8ac5dc66599c5c545cefd314dd34a109edce2784 (patch) | |
tree | c2387c3919af3ce2dac11063efa74713b37cf3d1 /kernel | |
parent | d73d00352145fb51d31771047aa939850d87fa50 (diff) | |
download | linux-stable-8ac5dc66599c5c545cefd314dd34a109edce2784.tar.gz linux-stable-8ac5dc66599c5c545cefd314dd34a109edce2784.tar.bz2 linux-stable-8ac5dc66599c5c545cefd314dd34a109edce2784.zip |
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>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/fork.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 99076dbe27d8..279efadabbf2 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1536,14 +1536,13 @@ struct mm_struct *get_task_mm(struct task_struct *task) { struct mm_struct *mm; + if (task->flags & PF_KTHREAD) + return NULL; + task_lock(task); mm = task->mm; - if (mm) { - if (task->flags & PF_KTHREAD) - mm = NULL; - else - mmget(mm); - } + if (mm) + mmget(mm); task_unlock(task); return mm; } |