]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm/mmap: Change __do_munmap() to avoid unnecessary lookups.
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Thu, 19 Nov 2020 17:57:23 +0000 (12:57 -0500)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Sat, 21 Nov 2020 00:57:22 +0000 (19:57 -0500)
As there is no longer a vmacache, find_vma() is more expensive and so avoid doing them

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

index f662afc944c7a7186ebc5e755d99ac854595825c..ca0f9ea5e73edf701439f8acc19a84a35319833d 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -2720,7 +2720,6 @@ int __do_munmap(struct mm_struct *mm, unsigned long start, size_t len,
        if (!vma)
                return 0;
 
-       prev = vma->vm_prev;
        /* we have start < vma->vm_end  */
 
        /*
@@ -2744,16 +2743,24 @@ int __do_munmap(struct mm_struct *mm, unsigned long start, size_t len,
                if (error)
                        return error;
                prev = vma;
+               vma = vma_next(mm, prev);
+       } else {
+               prev = vma->vm_prev;
        }
 
+       if (vma->vm_end >= end)
+               last = vma;
+       else
+               last = find_vma_intersection(mm, end - 1, end);
+
        /* Does it split the last one? */
-       last = find_vma(mm, end);
-       if (last && end > last->vm_start) {
+       if (last && end < last->vm_end) {
                int error = __split_vma(mm, last, end, 1);
                if (error)
                        return error;
+               vma = vma_next(mm, prev);
        }
-       vma = vma_next(mm, prev);
+
 
        if (unlikely(uf)) {
                /*