]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
update to use upgrade_mmap_lock_carefully()
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Fri, 16 Jun 2023 15:34:44 +0000 (11:34 -0400)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Fri, 16 Jun 2023 15:38:49 +0000 (11:38 -0400)
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
mm/memory.c
mm/mmap.c

index c291511c3155d0d37812937054d9d306e3c87bef..cb35e52bbd1e86846c03e50bf01ecb4605effe10 100644 (file)
@@ -5331,6 +5331,7 @@ struct vm_area_struct *lock_mm_and_find_vma(struct mm_struct *mm,
                        unsigned long addr, struct pt_regs *regs)
 {
        struct vm_area_struct *vma;
+       int err;
 
        if (!get_mmap_lock_carefully(mm, regs))
                return NULL;
@@ -5343,20 +5344,25 @@ struct vm_area_struct *lock_mm_and_find_vma(struct mm_struct *mm,
         * Well, dang. We might still be successful, but only
         * if we can extend a vma to do so.
         */
-       if (!vma || !(vma->vm_flags & VM_GROWSDOWN)) {
+       if (unlikely(!vma)) {
                mmap_read_unlock(mm);
                return NULL;
        }
-
-       if (!upgrade_mmap_lock_carefully(mm, regs))
-               return NULL;
-
-       vma = find_extend_vma(mm, addr);
-       if (!vma) {
-               mmap_write_unlock(mm);
-               return NULL;
+       err = expand_stack(vma, addr, false);
+       if (unlikely(err)){
+               if (err != -EAGAIN) {
+                       mmap_read_unlock(mm);
+                       return NULL;
+               }
+               if (!upgrade_mmap_lock_carefully(mm, regs))
+                       return NULL;
+               vma = find_vma(mm, addr);
+               if (!vma || expand_stack(vma, addr, true)) {
+                       mmap_write_unlock(mm);
+                       return NULL;
+               }
+               mmap_write_downgrade(mm);
        }
-       mmap_write_downgrade(mm);
        return vma;
 }
 #endif
index 2f560181148d043403d0212800adf1a1d2a95cc2..11d6af071c4d04b002b662b07520b13c8292c12f 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -2193,16 +2193,18 @@ struct vm_area_struct *find_extend_vma_locked(struct mm_struct *mm,
                return vma;
        start = vma->vm_start;
        err = expand_stack(vma, addr, write_locked);
-       if (unlikely(err == -EAGAIN)) {
-               mmap_read_unlock(mm);
-               mmap_write_lock(mm);
+       if (unlikely(err)) {
+               if (err != -EAGAIN)
+                       return NULL;
+               if (!upgrade_mmap_lock_carefully(mm, NULL))
+                       return NULL;
                vma = find_vma(mm, addr);
-               if (vma)
-                       err = expand_stack(vma, addr, true);
+               if (!vma || expand_stack(vma, addr, true)) {
+                       mmap_write_downgrade(mm);
+                       return NULL;
+               }
                mmap_write_downgrade(mm);
        }
-       if (err)
-               return NULL;
        if (vma->vm_flags & VM_LOCKED)
                populate_vma_page_range(vma, addr, start, NULL);
        return vma;