mm/mprotect: use maple tree navigation instead of VMA linked list
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Wed, 20 Jul 2022 02:18:01 +0000 (02:18 +0000)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 6 Sep 2022 19:44:25 +0000 (15:44 -0400)
Switch to navigating the VMA list with the maple tree operators in
preparation for removing the linked list.

Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
mm/mprotect.c

index 3a4de77161e9fcb3f291be0681ef526a7467b9b9..85649490651b987539a8b6ede41b08f7dc74bdcc 100644 (file)
@@ -674,6 +674,7 @@ static int do_mprotect_pkey(unsigned long start, size_t len,
        const bool rier = (current->personality & READ_IMPLIES_EXEC) &&
                                (prot & PROT_READ);
        struct mmu_gather tlb;
+       MA_STATE(mas, &current->mm->mm_mt, 0, 0);
 
        start = untagged_addr(start);
 
@@ -705,7 +706,8 @@ static int do_mprotect_pkey(unsigned long start, size_t len,
        if ((pkey != -1) && !mm_pkey_is_allocated(current->mm, pkey))
                goto out;
 
-       vma = find_vma(current->mm, start);
+       mas_set(&mas, start);
+       vma = mas_find(&mas, ULONG_MAX);
        error = -ENOMEM;
        if (!vma)
                goto out;
@@ -731,7 +733,7 @@ static int do_mprotect_pkey(unsigned long start, size_t len,
        if (start > vma->vm_start)
                prev = vma;
        else
-               prev = vma->vm_prev;
+               prev = mas_prev(&mas, 0);
 
        tlb_gather_mmu(&tlb, current->mm);
        for (nstart = start ; ; ) {
@@ -794,7 +796,7 @@ static int do_mprotect_pkey(unsigned long start, size_t len,
                if (nstart >= end)
                        break;
 
-               vma = prev->vm_next;
+               vma = find_vma(current->mm, prev->vm_end);
                if (!vma || vma->vm_start != nstart) {
                        error = -ENOMEM;
                        break;