]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mmap: Avoid modifying maple tree in __vma_adjust more than necessary
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Wed, 25 Nov 2020 01:23:48 +0000 (20:23 -0500)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Tue, 5 Jan 2021 17:33:27 +0000 (12:33 -0500)
Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
mm/mmap.c

index e20403ad4aed8e58565def2fdd7dabade9fa7349..5d7d798fb82fcc8f11064c10b7c766ebb3414d0e 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -743,7 +743,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
        struct rb_root_cached *root = NULL;
        struct anon_vma *anon_vma = NULL;
        struct file *file = vma->vm_file;
-       bool start_changed = false, end_changed = false;
+       bool vma_changed = false;
        long adjust_next = 0;
        int remove_next = 0;
 
@@ -872,21 +872,21 @@ again:
        }
 
        if (start != vma->vm_start) {
-               unsigned long old_start = vma->vm_start;
+               if (vma->vm_start < start)
+                       vma_mt_szero(mm, vma->vm_start, start);
+               else
+                       vma_changed = true;
                vma->vm_start = start;
-               if (old_start < start)
-                       vma_mt_szero(mm, old_start, start);
-               start_changed = true;
        }
        if (end != vma->vm_end) {
-               unsigned long old_end = vma->vm_end;
+               if (vma->vm_end > end)
+                       vma_mt_szero(mm, end, vma->vm_end);
+               else
+                       vma_changed = true;
                vma->vm_end = end;
-               if (old_end > end)
-                       vma_mt_szero(mm, end, old_end);
-               end_changed = true;
        }
 
-       if (end_changed || start_changed)
+       if (vma_changed)
                vma_mt_store(mm, vma);
 
        vma->vm_pgoff = pgoff;
@@ -914,7 +914,7 @@ again:
                 * (it may either follow vma or precede it).
                 */
                __insert_vm_struct(mm, insert);
-       } else if (end_changed && !next) {
+       } else if (vma_changed && !next) {
                mm->highest_vm_end = vm_end_gap(vma);
        }