From: Liam R. Howlett Date: Fri, 16 Jun 2023 15:34:44 +0000 (-0400) Subject: update to use upgrade_mmap_lock_carefully() X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=6d6c725418b522d97cdd878dc358916a344a2c73;p=users%2Fjedix%2Flinux-maple.git update to use upgrade_mmap_lock_carefully() Signed-off-by: Liam R. Howlett --- diff --git a/mm/memory.c b/mm/memory.c index c291511c3155..cb35e52bbd1e 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -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 diff --git a/mm/mmap.c b/mm/mmap.c index 2f560181148d..11d6af071c4d 100644 --- 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;