]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mmap: Change zeroing of maple tree in __vma_adjust
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Mon, 6 Sep 2021 03:31:15 +0000 (23:31 -0400)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Fri, 1 Oct 2021 16:41:53 +0000 (12:41 -0400)
Only write to the maple tree if we are not inserting or the insert isn't
going to overwrite the area to clear.  This avoids spanning writes and
node coealescing when unnecessary.

Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
mm/mmap.c

index 992ba12a72d4235ad3996dd5dd9c5b61d1a8cb46..f11492767b40943a992c513d70d4d1e3e685b613 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -627,6 +627,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
        bool vma_changed = false;
        long adjust_next = 0;
        int remove_next = 0;
+       unsigned long old_start;
 
        if (next && !insert) {
                struct vm_area_struct *exporter = NULL, *importer = NULL;
@@ -752,25 +753,29 @@ again:
                        vma_interval_tree_remove(next, root);
        }
 
+       old_start = vma->vm_start;
        if (start != vma->vm_start) {
-               if (vma->vm_start < start)
-                       vma_mt_szero(mm, vma->vm_start, start);
-               else
-                       vma_changed = true;
+               vma_changed = true;
                vma->vm_start = start;
        }
        if (end != vma->vm_end) {
-               if (vma->vm_end > end)
-                       vma_mt_szero(mm, end, vma->vm_end);
-               else
+               if (vma->vm_end > end) {
+                       if (!insert || (insert && (insert->vm_start != end)))
+                               vma_mt_szero(mm, end, vma->vm_end);
+               } else
                        vma_changed = true;
                vma->vm_end = end;
                if (!next)
                        mm->highest_vm_end = vm_end_gap(vma);
        }
 
-       if (vma_changed)
+       if (vma_changed) {
                vma_mt_store(mm, vma);
+               if (old_start < start) {
+                       if (insert && (insert->vm_start != old_start))
+                               vma_mt_szero(mm, old_start, start);
+               }
+       }
 
        vma->vm_pgoff = pgoff;
        if (adjust_next) {