OSDN Git Service

mm/mmap: move anon_vma setting in __vma_adjust()
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Fri, 20 Jan 2023 16:26:40 +0000 (11:26 -0500)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 10 Feb 2023 00:51:37 +0000 (16:51 -0800)
Move the anon_vma setting & warn_no up the function.  This is done to
clear up the locking later.

Link: https://lkml.kernel.org/r/20230120162650.984577-40-Liam.Howlett@oracle.com
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/mmap.c

index 29ffd58..12545ec 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -682,6 +682,14 @@ int __vma_adjust(struct vma_iterator *vmi, struct vm_area_struct *vma,
        if (vma_iter_prealloc(vmi))
                return -ENOMEM;
 
+       anon_vma = vma->anon_vma;
+       if (!anon_vma && adjust_next)
+               anon_vma = next->anon_vma;
+
+       if (anon_vma)
+               VM_WARN_ON(adjust_next && next->anon_vma &&
+                          anon_vma != next->anon_vma);
+
        vma_adjust_trans_huge(orig_vma, start, end, adjust_next);
        if (file) {
                mapping = file->f_mapping;
@@ -703,12 +711,7 @@ int __vma_adjust(struct vma_iterator *vmi, struct vm_area_struct *vma,
                }
        }
 
-       anon_vma = vma->anon_vma;
-       if (!anon_vma && adjust_next)
-               anon_vma = next->anon_vma;
        if (anon_vma) {
-               VM_WARN_ON(adjust_next && next->anon_vma &&
-                          anon_vma != next->anon_vma);
                anon_vma_lock_write(anon_vma);
                anon_vma_interval_tree_pre_update_vma(vma);
                if (adjust_next)