| From: "Liam R. Howlett" <Liam.Howlett@Oracle.com> |
| Subject: mm/mremap: remove goto from mremap_to() |
| Date: Fri, 18 Oct 2024 13:41:14 -0400 |
| |
| mremap_to() has a goto label at the end that doesn't unwind anything. |
| Removing the label makes the code cleaner. |
| |
| This commit also adds documentation to the function. |
| |
| Link: https://lkml.kernel.org/r/20241018174114.2871880-3-Liam.Howlett@oracle.com |
| Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com> |
| Reviewed-by: Pedro Falcato <pedro.falcato@gmail.com> |
| Cc: David Hildenbrand <david@redhat.com> |
| Cc: Jann Horn <jannh@google.com> |
| Cc: Jeff Xu <jeffxu@chromium.org> |
| Cc: Kefeng Wang <wangkefeng.wang@huawei.com> |
| Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> |
| Cc: Qi Zheng <zhengqi.arch@bytedance.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| mm/mremap.c | 46 +++++++++++++++++++++++++++------------------- |
| 1 file changed, 27 insertions(+), 19 deletions(-) |
| |
| --- a/mm/mremap.c~mm-mremap-remove-goto-from-mremap_to |
| +++ a/mm/mremap.c |
| @@ -887,6 +887,20 @@ static int resize_is_valid(struct vm_are |
| return 0; |
| } |
| |
| +/* |
| + * mremap_to() - remap a vma to a new location |
| + * @addr: The old address |
| + * @old_len: The old size |
| + * @new_addr: The target address |
| + * @new_len: The new size |
| + * @locked: If the returned vma is locked (VM_LOCKED) |
| + * @flags: the mremap flags |
| + * @uf: The mremap userfaultfd context |
| + * @uf_unmap_early: The userfaultfd unmap early context |
| + * @uf_unmap: The userfaultfd unmap context |
| + * |
| + * Returns: The new address of the vma or an error. |
| + */ |
| static unsigned long mremap_to(unsigned long addr, unsigned long old_len, |
| unsigned long new_addr, unsigned long new_len, bool *locked, |
| unsigned long flags, struct vm_userfaultfd_ctx *uf, |
| @@ -895,18 +909,18 @@ static unsigned long mremap_to(unsigned |
| { |
| struct mm_struct *mm = current->mm; |
| struct vm_area_struct *vma; |
| - unsigned long ret = -EINVAL; |
| + unsigned long ret; |
| unsigned long map_flags = 0; |
| |
| if (offset_in_page(new_addr)) |
| - goto out; |
| + return -EINVAL; |
| |
| if (new_len > TASK_SIZE || new_addr > TASK_SIZE - new_len) |
| - goto out; |
| + return -EINVAL; |
| |
| /* Ensure the old/new locations do not overlap */ |
| if (addr + old_len > new_addr && new_addr + new_len > addr) |
| - goto out; |
| + return -EINVAL; |
| |
| /* |
| * move_vma() need us to stay 4 maps below the threshold, otherwise |
| @@ -933,31 +947,28 @@ static unsigned long mremap_to(unsigned |
| */ |
| ret = do_munmap(mm, new_addr, new_len, uf_unmap_early); |
| if (ret) |
| - goto out; |
| + return ret; |
| } |
| |
| if (old_len > new_len) { |
| ret = do_munmap(mm, addr+new_len, old_len - new_len, uf_unmap); |
| if (ret) |
| - goto out; |
| + return ret; |
| old_len = new_len; |
| } |
| |
| vma = vma_lookup(mm, addr); |
| - if (!vma) { |
| - ret = -EFAULT; |
| - goto out; |
| - } |
| + if (!vma) |
| + return -EFAULT; |
| |
| ret = resize_is_valid(vma, addr, old_len, new_len, flags); |
| if (ret) |
| - goto out; |
| + return ret; |
| |
| /* MREMAP_DONTUNMAP expands by old_len since old_len == new_len */ |
| if (flags & MREMAP_DONTUNMAP && |
| !may_expand_vm(mm, vma->vm_flags, old_len >> PAGE_SHIFT)) { |
| - ret = -ENOMEM; |
| - goto out; |
| + return -ENOMEM; |
| } |
| |
| if (flags & MREMAP_FIXED) |
| @@ -970,17 +981,14 @@ static unsigned long mremap_to(unsigned |
| ((addr - vma->vm_start) >> PAGE_SHIFT), |
| map_flags); |
| if (IS_ERR_VALUE(ret)) |
| - goto out; |
| + return ret; |
| |
| /* We got a new mapping */ |
| if (!(flags & MREMAP_FIXED)) |
| new_addr = ret; |
| |
| - ret = move_vma(vma, addr, old_len, new_len, new_addr, locked, flags, uf, |
| - uf_unmap); |
| - |
| -out: |
| - return ret; |
| + return move_vma(vma, addr, old_len, new_len, new_addr, locked, flags, |
| + uf, uf_unmap); |
| } |
| |
| static int vma_expandable(struct vm_area_struct *vma, unsigned long delta) |
| _ |