]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm/mmap: Optimize mmap_region() use of maple states
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Tue, 2 Mar 2021 15:15:35 +0000 (10:15 -0500)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Tue, 2 Mar 2021 15:15:35 +0000 (10:15 -0500)
Only walk down once after the tree was modified with the munmap call.  Copy mas
to find prev and next.  Only reset mas if the address changed.

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

index 73fc95a10c8d3cb91ab1490dd635a617f58ec631..64a2addb47e2e48b31b1524a13671410ac3fa2ea 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -2541,11 +2541,12 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
        }
 
        mas_set_range(&mas, addr, end - 1);
-       if (vm_flags & VM_SPECIAL) {
-               ma_prev = mas;
-               prev = mas_prev(&ma_prev, 0);
+       mas_walk(&mas);  // Walk to the empty area (munmapped above)
+       ma_prev = mas;
+       prev = mas_prev(&ma_prev, 0);
+
+       if (vm_flags & VM_SPECIAL)
                goto cannot_expand;
-       }
 
        /* Attempt to expand an old mapping */
 
@@ -2561,26 +2562,23 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
                        merge_end = next->vm_end;
                        vma = next;
                        vm_pgoff = next->vm_pgoff - pglen;
-                       tmp = mas;
                }
        }
 
        /* Check prev */
-       ma_prev = tmp;
-       prev = mas_prev(&ma_prev, 0);
        if (prev && prev->vm_end == addr && !vma_policy(prev) &&
            can_vma_merge_after(prev, vm_flags, NULL, file, pgoff,
                                NULL_VM_UFFD_CTX)) {
                /* Try to expand the prev over the requested area */
                merge_start = prev->vm_start;
                vma = prev;
-               tmp = ma_prev;
+               mas = ma_prev;
                vm_pgoff = prev->vm_pgoff;
        }
 
        /* Actually expand, if possible */
        if (vma &&
-           !vma_expand(&tmp, vma, merge_start, merge_end, vm_pgoff, next)) {
+           !vma_expand(&mas, vma, merge_start, merge_end, vm_pgoff, next)) {
                khugepaged_enter_vma_merge(vma, vm_flags);
                goto expanded;
        }
@@ -2631,8 +2629,11 @@ cannot_expand:
                 *         f_op->mmap method. -DaveM
                 */
                WARN_ON_ONCE(addr != vma->vm_start);
+               if (addr != vma->vm_start) {
+                       addr = vma->vm_start;
+                       mas_set_range(&mas, addr, end - 1);
+               }
 
-               addr = vma->vm_start;
 
                /* If vm_flags changed after call_mmap(), we should try merge vma again
                 * as we may succeed this time.
@@ -2680,8 +2681,6 @@ cannot_expand:
                        goto free_vma;
        }
 
-       // addr may have changed.
-       mas_set_range(&mas, addr, end - 1);
        vma_mas_link(mm, vma, &mas);
 
        /* Once vma denies write, undo our temporary denial count */