From 78532e9a153013f0baf25d4b2688b35a1ae7547a Mon Sep 17 00:00:00 2001 From: "Liam R. Howlett" Date: Tue, 2 Mar 2021 10:15:35 -0500 Subject: [PATCH] mm/mmap: Optimize mmap_region() use of maple states 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 --- mm/mmap.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/mm/mmap.c b/mm/mmap.c index 73fc95a10c8d..64a2addb47e2 100644 --- 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 */ -- 2.50.1