* [PATCH v2 0/2] mm/mremap: Remove extra vma tree walk
@ 2024-10-18 17:41 Liam R. Howlett
2024-10-18 17:41 ` [PATCH v2 1/2] mm/mremap: Clean up vma_to_resize() Liam R. Howlett
2024-10-18 17:41 ` [PATCH v2 2/2] mm/mremap: Remove goto from mremap_to() Liam R. Howlett
0 siblings, 2 replies; 8+ messages in thread
From: Liam R. Howlett @ 2024-10-18 17:41 UTC (permalink / raw)
To: Andrew Morton
Cc: linux-mm, linux-kernel, Lorenzo Stoakes, Jann Horn,
David Hildenbrand, Qi Zheng, Kefeng Wang, Jeff Xu, Pedro Falcato,
Liam R. Howlett
An extra vma tree walk was discovered in some mremap call paths during
the discussion on mseal() changes. This patch set removes the extra vma
tree walk and further cleans up mremap_to().
v1: https://lore.kernel.org/all/20241016201719.2449143-1-Liam.Howlett@oracle.com/
Changes since v1:
Change mremap_vma_check() to resize_is_valid() - Thanks Jeff & Andrew
Fixed missing return check - Thanks Andrew
Added comments to both functions that are touched - Thanks Andrew
Liam R. Howlett (2):
mm/mremap: Clean up vma_to_resize()
mm/mremap: Remove goto from mremap_to()
mm/mremap.c | 93 +++++++++++++++++++++++++++++++----------------------
1 file changed, 55 insertions(+), 38 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 1/2] mm/mremap: Clean up vma_to_resize()
2024-10-18 17:41 [PATCH v2 0/2] mm/mremap: Remove extra vma tree walk Liam R. Howlett
@ 2024-10-18 17:41 ` Liam R. Howlett
2024-10-21 10:03 ` Lorenzo Stoakes
2024-10-22 22:08 ` Pedro Falcato
2024-10-18 17:41 ` [PATCH v2 2/2] mm/mremap: Remove goto from mremap_to() Liam R. Howlett
1 sibling, 2 replies; 8+ messages in thread
From: Liam R. Howlett @ 2024-10-18 17:41 UTC (permalink / raw)
To: Andrew Morton
Cc: linux-mm, linux-kernel, Lorenzo Stoakes, Jann Horn,
David Hildenbrand, Qi Zheng, Kefeng Wang, Jeff Xu, Pedro Falcato,
Liam R. Howlett
From: "Liam R. Howlett" <Liam.Howlett@Oracle.com>
vma_to_resize() is used in two locations to find and validate the vma
for the mremap location. One of the two locations already has the vma,
which is then re-found to validate the same vma.
This code can be simplified by moving the vma_lookup() from
vma_to_resize() to mremap_to() and changing the return type to an int
error.
Since the function now just validates the vma, the function is renamed
to resize_is_valid() to better reflect what it is doing.
This commit also adds documentation about the function.
Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
---
mm/mremap.c | 53 +++++++++++++++++++++++++++++++----------------------
1 file changed, 31 insertions(+), 22 deletions(-)
diff --git a/mm/mremap.c b/mm/mremap.c
index 5917feafe8cc..e781ec4573ca 100644
--- a/mm/mremap.c
+++ b/mm/mremap.c
@@ -826,17 +826,24 @@ static unsigned long move_vma(struct vm_area_struct *vma,
return new_addr;
}
-static struct vm_area_struct *vma_to_resize(unsigned long addr,
+/*
+ * resize_is_valid() - Ensure the vma can be resized to the new length at the give
+ * address.
+ *
+ * @vma: The vma to resize
+ * @addr: The old address
+ * @old_len: The current size
+ * @new_len: The desired size
+ * @flags: The vma flags
+ *
+ * Return 0 on success, error otherwise.
+ */
+static int resize_is_valid(struct vm_area_struct *vma, unsigned long addr,
unsigned long old_len, unsigned long new_len, unsigned long flags)
{
struct mm_struct *mm = current->mm;
- struct vm_area_struct *vma;
unsigned long pgoff;
- vma = vma_lookup(mm, addr);
- if (!vma)
- return ERR_PTR(-EFAULT);
-
/*
* !old_len is a special case where an attempt is made to 'duplicate'
* a mapping. This makes no sense for private mappings as it will
@@ -847,37 +854,37 @@ static struct vm_area_struct *vma_to_resize(unsigned long addr,
*/
if (!old_len && !(vma->vm_flags & (VM_SHARED | VM_MAYSHARE))) {
pr_warn_once("%s (%d): attempted to duplicate a private mapping with mremap. This is not supported.\n", current->comm, current->pid);
- return ERR_PTR(-EINVAL);
+ return -EINVAL;
}
if ((flags & MREMAP_DONTUNMAP) &&
(vma->vm_flags & (VM_DONTEXPAND | VM_PFNMAP)))
- return ERR_PTR(-EINVAL);
+ return -EINVAL;
/* We can't remap across vm area boundaries */
if (old_len > vma->vm_end - addr)
- return ERR_PTR(-EFAULT);
+ return -EFAULT;
if (new_len == old_len)
- return vma;
+ return 0;
/* Need to be careful about a growing mapping */
pgoff = (addr - vma->vm_start) >> PAGE_SHIFT;
pgoff += vma->vm_pgoff;
if (pgoff + (new_len >> PAGE_SHIFT) < pgoff)
- return ERR_PTR(-EINVAL);
+ return -EINVAL;
if (vma->vm_flags & (VM_DONTEXPAND | VM_PFNMAP))
- return ERR_PTR(-EFAULT);
+ return -EFAULT;
if (!mlock_future_ok(mm, vma->vm_flags, new_len - old_len))
- return ERR_PTR(-EAGAIN);
+ return -EAGAIN;
if (!may_expand_vm(mm, vma->vm_flags,
(new_len - old_len) >> PAGE_SHIFT))
- return ERR_PTR(-ENOMEM);
+ return -ENOMEM;
- return vma;
+ return 0;
}
static unsigned long mremap_to(unsigned long addr, unsigned long old_len,
@@ -936,12 +943,16 @@ static unsigned long mremap_to(unsigned long addr, unsigned long old_len,
old_len = new_len;
}
- vma = vma_to_resize(addr, old_len, new_len, flags);
- if (IS_ERR(vma)) {
- ret = PTR_ERR(vma);
+ vma = vma_lookup(mm, addr);
+ if (!vma) {
+ ret = -EFAULT;
goto out;
}
+ ret = resize_is_valid(vma, addr, old_len, new_len, flags);
+ if (ret)
+ goto out;
+
/* 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)) {
@@ -1114,11 +1125,9 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
/*
* Ok, we need to grow..
*/
- vma = vma_to_resize(addr, old_len, new_len, flags);
- if (IS_ERR(vma)) {
- ret = PTR_ERR(vma);
+ ret = resize_is_valid(vma, addr, old_len, new_len, flags);
+ if (ret)
goto out;
- }
/* old_len exactly to the end of the area..
*/
--
2.43.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 2/2] mm/mremap: Remove goto from mremap_to()
2024-10-18 17:41 [PATCH v2 0/2] mm/mremap: Remove extra vma tree walk Liam R. Howlett
2024-10-18 17:41 ` [PATCH v2 1/2] mm/mremap: Clean up vma_to_resize() Liam R. Howlett
@ 2024-10-18 17:41 ` Liam R. Howlett
2024-10-21 10:19 ` Lorenzo Stoakes
2024-10-22 22:10 ` Pedro Falcato
1 sibling, 2 replies; 8+ messages in thread
From: Liam R. Howlett @ 2024-10-18 17:41 UTC (permalink / raw)
To: Andrew Morton
Cc: linux-mm, linux-kernel, Lorenzo Stoakes, Jann Horn,
David Hildenbrand, Qi Zheng, Kefeng Wang, Jeff Xu, Pedro Falcato,
Liam R. Howlett
From: "Liam R. Howlett" <Liam.Howlett@Oracle.com>
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 on the function.
Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
---
mm/mremap.c | 46 +++++++++++++++++++++++++++-------------------
1 file changed, 27 insertions(+), 19 deletions(-)
diff --git a/mm/mremap.c b/mm/mremap.c
index e781ec4573ca..4c79ab92eb8f 100644
--- a/mm/mremap.c
+++ b/mm/mremap.c
@@ -887,6 +887,20 @@ static int resize_is_valid(struct vm_area_struct *vma, unsigned long addr,
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 long addr, unsigned long old_len,
{
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 long addr, unsigned long old_len,
*/
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 long addr, unsigned long old_len,
((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)
--
2.43.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] mm/mremap: Clean up vma_to_resize()
2024-10-18 17:41 ` [PATCH v2 1/2] mm/mremap: Clean up vma_to_resize() Liam R. Howlett
@ 2024-10-21 10:03 ` Lorenzo Stoakes
2024-10-22 22:08 ` Pedro Falcato
1 sibling, 0 replies; 8+ messages in thread
From: Lorenzo Stoakes @ 2024-10-21 10:03 UTC (permalink / raw)
To: Liam R. Howlett
Cc: Andrew Morton, linux-mm, linux-kernel, Jann Horn,
David Hildenbrand, Qi Zheng, Kefeng Wang, Jeff Xu, Pedro Falcato
On Fri, Oct 18, 2024 at 01:41:13PM -0400, Liam R. Howlett wrote:
> From: "Liam R. Howlett" <Liam.Howlett@Oracle.com>
>
> vma_to_resize() is used in two locations to find and validate the vma
> for the mremap location. One of the two locations already has the vma,
> which is then re-found to validate the same vma.
>
> This code can be simplified by moving the vma_lookup() from
> vma_to_resize() to mremap_to() and changing the return type to an int
> error.
>
> Since the function now just validates the vma, the function is renamed
> to resize_is_valid() to better reflect what it is doing.
>
> This commit also adds documentation about the function.
>
> Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
git-icdiff helped here a lot :)
This LGTM,
Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Generally a really nice clean up in any case, thanks for doing this!
> ---
> mm/mremap.c | 53 +++++++++++++++++++++++++++++++----------------------
> 1 file changed, 31 insertions(+), 22 deletions(-)
>
> diff --git a/mm/mremap.c b/mm/mremap.c
> index 5917feafe8cc..e781ec4573ca 100644
> --- a/mm/mremap.c
> +++ b/mm/mremap.c
> @@ -826,17 +826,24 @@ static unsigned long move_vma(struct vm_area_struct *vma,
> return new_addr;
> }
>
> -static struct vm_area_struct *vma_to_resize(unsigned long addr,
> +/*
> + * resize_is_valid() - Ensure the vma can be resized to the new length at the give
> + * address.
> + *
> + * @vma: The vma to resize
> + * @addr: The old address
> + * @old_len: The current size
> + * @new_len: The desired size
> + * @flags: The vma flags
> + *
> + * Return 0 on success, error otherwise.
> + */
> +static int resize_is_valid(struct vm_area_struct *vma, unsigned long addr,
> unsigned long old_len, unsigned long new_len, unsigned long flags)
> {
> struct mm_struct *mm = current->mm;
> - struct vm_area_struct *vma;
> unsigned long pgoff;
>
> - vma = vma_lookup(mm, addr);
> - if (!vma)
> - return ERR_PTR(-EFAULT);
> -
> /*
> * !old_len is a special case where an attempt is made to 'duplicate'
> * a mapping. This makes no sense for private mappings as it will
> @@ -847,37 +854,37 @@ static struct vm_area_struct *vma_to_resize(unsigned long addr,
> */
> if (!old_len && !(vma->vm_flags & (VM_SHARED | VM_MAYSHARE))) {
> pr_warn_once("%s (%d): attempted to duplicate a private mapping with mremap. This is not supported.\n", current->comm, current->pid);
> - return ERR_PTR(-EINVAL);
> + return -EINVAL;
> }
>
> if ((flags & MREMAP_DONTUNMAP) &&
> (vma->vm_flags & (VM_DONTEXPAND | VM_PFNMAP)))
> - return ERR_PTR(-EINVAL);
> + return -EINVAL;
>
> /* We can't remap across vm area boundaries */
> if (old_len > vma->vm_end - addr)
> - return ERR_PTR(-EFAULT);
> + return -EFAULT;
>
> if (new_len == old_len)
> - return vma;
> + return 0;
>
> /* Need to be careful about a growing mapping */
> pgoff = (addr - vma->vm_start) >> PAGE_SHIFT;
> pgoff += vma->vm_pgoff;
> if (pgoff + (new_len >> PAGE_SHIFT) < pgoff)
> - return ERR_PTR(-EINVAL);
> + return -EINVAL;
>
> if (vma->vm_flags & (VM_DONTEXPAND | VM_PFNMAP))
> - return ERR_PTR(-EFAULT);
> + return -EFAULT;
>
> if (!mlock_future_ok(mm, vma->vm_flags, new_len - old_len))
> - return ERR_PTR(-EAGAIN);
> + return -EAGAIN;
>
> if (!may_expand_vm(mm, vma->vm_flags,
> (new_len - old_len) >> PAGE_SHIFT))
> - return ERR_PTR(-ENOMEM);
> + return -ENOMEM;
>
> - return vma;
> + return 0;
> }
>
> static unsigned long mremap_to(unsigned long addr, unsigned long old_len,
> @@ -936,12 +943,16 @@ static unsigned long mremap_to(unsigned long addr, unsigned long old_len,
> old_len = new_len;
> }
>
> - vma = vma_to_resize(addr, old_len, new_len, flags);
> - if (IS_ERR(vma)) {
> - ret = PTR_ERR(vma);
> + vma = vma_lookup(mm, addr);
> + if (!vma) {
> + ret = -EFAULT;
> goto out;
> }
>
> + ret = resize_is_valid(vma, addr, old_len, new_len, flags);
> + if (ret)
> + goto out;
> +
> /* 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)) {
> @@ -1114,11 +1125,9 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
> /*
> * Ok, we need to grow..
> */
> - vma = vma_to_resize(addr, old_len, new_len, flags);
> - if (IS_ERR(vma)) {
> - ret = PTR_ERR(vma);
> + ret = resize_is_valid(vma, addr, old_len, new_len, flags);
> + if (ret)
> goto out;
> - }
>
> /* old_len exactly to the end of the area..
> */
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 2/2] mm/mremap: Remove goto from mremap_to()
2024-10-18 17:41 ` [PATCH v2 2/2] mm/mremap: Remove goto from mremap_to() Liam R. Howlett
@ 2024-10-21 10:19 ` Lorenzo Stoakes
2024-10-22 22:10 ` Pedro Falcato
1 sibling, 0 replies; 8+ messages in thread
From: Lorenzo Stoakes @ 2024-10-21 10:19 UTC (permalink / raw)
To: Liam R. Howlett
Cc: Andrew Morton, linux-mm, linux-kernel, Jann Horn,
David Hildenbrand, Qi Zheng, Kefeng Wang, Jeff Xu, Pedro Falcato
On Fri, Oct 18, 2024 at 01:41:14PM -0400, Liam R. Howlett wrote:
> From: "Liam R. Howlett" <Liam.Howlett@Oracle.com>
>
> 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 on the function.
>
> Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
This is a nice cleanup, thanks!
Other than nits below, LGTM, so:
Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
> ---
> mm/mremap.c | 46 +++++++++++++++++++++++++++-------------------
> 1 file changed, 27 insertions(+), 19 deletions(-)
>
> diff --git a/mm/mremap.c b/mm/mremap.c
> index e781ec4573ca..4c79ab92eb8f 100644
> --- a/mm/mremap.c
> +++ b/mm/mremap.c
> @@ -887,6 +887,20 @@ static int resize_is_valid(struct vm_area_struct *vma, unsigned long addr,
> 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
Nit - these are lists of userfaultfd_unmap_ctx rather than contexts. But I
mean, the naming around this is generally not great and not your fault so
not a big deal.
> + *
> + * 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 long addr, unsigned long old_len,
> {
> 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 long addr, unsigned long old_len,
> */
> 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 long addr, unsigned long old_len,
> ((addr - vma->vm_start) >> PAGE_SHIFT),
> map_flags);
Unrelated to your change, but I'm really confused as to why we're doing
this even if MREMAP_FIXED might be set, then ignore its return value if it
is set?
Would be way nicer to do something like:
if (!(flags & MREMAP_FIXED)) {
new_addr = get_unmapped_area(vma->vm_file, new_addr, new_len,
vma->vm_pgoff +
((addr - vma->vm_start) >> PAGE_SHIFT),
map_flags);
if (IS_ERR_VALUE(new_addr))
return new_addr;
}
Anyway one for another series.
I'd say the 'ret' variable is badly named now, but it was badly named
before so there's zero delta on that.
> 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)
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] mm/mremap: Clean up vma_to_resize()
2024-10-18 17:41 ` [PATCH v2 1/2] mm/mremap: Clean up vma_to_resize() Liam R. Howlett
2024-10-21 10:03 ` Lorenzo Stoakes
@ 2024-10-22 22:08 ` Pedro Falcato
2024-10-23 2:10 ` Liam R. Howlett
1 sibling, 1 reply; 8+ messages in thread
From: Pedro Falcato @ 2024-10-22 22:08 UTC (permalink / raw)
To: Liam R. Howlett
Cc: Andrew Morton, linux-mm, linux-kernel, Lorenzo Stoakes,
Jann Horn, David Hildenbrand, Qi Zheng, Kefeng Wang, Jeff Xu
On Fri, Oct 18, 2024 at 6:41 PM Liam R. Howlett <Liam.Howlett@oracle.com> wrote:
>
> From: "Liam R. Howlett" <Liam.Howlett@Oracle.com>
>
> vma_to_resize() is used in two locations to find and validate the vma
> for the mremap location. One of the two locations already has the vma,
> which is then re-found to validate the same vma.
>
> This code can be simplified by moving the vma_lookup() from
> vma_to_resize() to mremap_to() and changing the return type to an int
> error.
>
> Since the function now just validates the vma, the function is renamed
> to resize_is_valid() to better reflect what it is doing.
Small nit: Could we pick a stable naming scheme?
I understand the kernel has historically had plenty of ways to name
functions, including
do_stuff
is_stuff
stuff_do
stuff_is
I thought we were starting to converge into vma_/vmi_/vms_ :(
I would personally prefer vma_resize_is_valid/vma_resize_valid (even
if it's a static function, so it doesn't matter _too_ much).
Anyway, enough bikeshedding...
>
> This commit also adds documentation about the function.
>
> Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
Reviewed-by: Pedro Falcato <pedro.falcato@gmail.com>
This patch made me realize there's a couple of small improvements we
can still do (maybe with a vmi) to clean up and speed up mremap (at
least!). I'll look into those if I find some time.
--
Pedro
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 2/2] mm/mremap: Remove goto from mremap_to()
2024-10-18 17:41 ` [PATCH v2 2/2] mm/mremap: Remove goto from mremap_to() Liam R. Howlett
2024-10-21 10:19 ` Lorenzo Stoakes
@ 2024-10-22 22:10 ` Pedro Falcato
1 sibling, 0 replies; 8+ messages in thread
From: Pedro Falcato @ 2024-10-22 22:10 UTC (permalink / raw)
To: Liam R. Howlett
Cc: Andrew Morton, linux-mm, linux-kernel, Lorenzo Stoakes,
Jann Horn, David Hildenbrand, Qi Zheng, Kefeng Wang, Jeff Xu
On Fri, Oct 18, 2024 at 6:41 PM Liam R. Howlett <Liam.Howlett@oracle.com> wrote:
>
> From: "Liam R. Howlett" <Liam.Howlett@Oracle.com>
>
> 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 on the function.
Thanks for the nice cleanup across this series :)
>
> Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
Reviewed-by: Pedro Falcato <pedro.falcato@gmail.com>
--
Pedro
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] mm/mremap: Clean up vma_to_resize()
2024-10-22 22:08 ` Pedro Falcato
@ 2024-10-23 2:10 ` Liam R. Howlett
0 siblings, 0 replies; 8+ messages in thread
From: Liam R. Howlett @ 2024-10-23 2:10 UTC (permalink / raw)
To: Pedro Falcato
Cc: Andrew Morton, linux-mm, linux-kernel, Lorenzo Stoakes,
Jann Horn, David Hildenbrand, Qi Zheng, Kefeng Wang, Jeff Xu
* Pedro Falcato <pedro.falcato@gmail.com> [241022 18:08]:
> On Fri, Oct 18, 2024 at 6:41 PM Liam R. Howlett <Liam.Howlett@oracle.com> wrote:
> >
> > From: "Liam R. Howlett" <Liam.Howlett@Oracle.com>
> >
> > vma_to_resize() is used in two locations to find and validate the vma
> > for the mremap location. One of the two locations already has the vma,
> > which is then re-found to validate the same vma.
> >
> > This code can be simplified by moving the vma_lookup() from
> > vma_to_resize() to mremap_to() and changing the return type to an int
> > error.
> >
> > Since the function now just validates the vma, the function is renamed
> > to resize_is_valid() to better reflect what it is doing.
>
> Small nit: Could we pick a stable naming scheme?
> I understand the kernel has historically had plenty of ways to name
> functions, including
> do_stuff
> is_stuff
> stuff_do
> stuff_is
>
> I thought we were starting to converge into vma_/vmi_/vms_ :(
> I would personally prefer vma_resize_is_valid/vma_resize_valid (even
> if it's a static function, so it doesn't matter _too_ much).
> Anyway, enough bikeshedding...
Right. Usually the vma_/vmi_/vms_ stuff indicates the first argument to
the functions exposed to other files. Yes, vma_ would work here, and I
don't really mind that it's static and has the vma_ name.
I'd suggest relocating it to vma.c or vma.h, but then we'd have to put
mremap in the name and that would be rather long - I don't think we do
anything like this elsewhere.
>
> >
> > This commit also adds documentation about the function.
> >
> > Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
>
> Reviewed-by: Pedro Falcato <pedro.falcato@gmail.com>
Thanks!
>
> This patch made me realize there's a couple of small improvements we
> can still do (maybe with a vmi) to clean up and speed up mremap (at
> least!). I'll look into those if I find some time.
Agreed. If you do get to doing more clean up, I'd be fine with a rename
of this function.
Regards,
Liam
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-10-23 2:10 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-10-18 17:41 [PATCH v2 0/2] mm/mremap: Remove extra vma tree walk Liam R. Howlett
2024-10-18 17:41 ` [PATCH v2 1/2] mm/mremap: Clean up vma_to_resize() Liam R. Howlett
2024-10-21 10:03 ` Lorenzo Stoakes
2024-10-22 22:08 ` Pedro Falcato
2024-10-23 2:10 ` Liam R. Howlett
2024-10-18 17:41 ` [PATCH v2 2/2] mm/mremap: Remove goto from mremap_to() Liam R. Howlett
2024-10-21 10:19 ` Lorenzo Stoakes
2024-10-22 22:10 ` Pedro Falcato
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox