]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
get_task_mm: check PF_KTHREAD lockless
authorOleg Nesterov <oleg@redhat.com>
Wed, 26 Jun 2024 19:10:17 +0000 (21:10 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 5 Jul 2024 01:05:58 +0000 (18:05 -0700)
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>
kernel/fork.c

index 99076dbe27d83f93d704882d4f5c09ae103af303..279efadabbf22e62cded4e2ee2d2a78963f00a9a 100644 (file)
@@ -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;
 }