| From: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> |
| Subject: mm: introduce commit_merge(), abstracting final commit of merge |
| Date: Fri, 30 Aug 2024 19:10:20 +0100 |
| |
| Pull the part of vma_expand() which actually commits the merge operation, |
| that is inserts it into the maple tree and sets the VMA's vma->vm_start |
| and vma->vm_end parameters, into its own function. |
| |
| We implement only the parts needed for vma_expand() which now as a result |
| of previous work is also the means by which new VMA ranges are merged. |
| |
| The next commit in the series will implement merging of existing ranges |
| which will extend commit_merge() to accommodate this case and result in |
| all merges using this common code. |
| |
| Link: https://lkml.kernel.org/r/7b985a20dfa549e3c370cd274d732b64c44f6dbd.1725040657.git.lorenzo.stoakes@oracle.com |
| Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> |
| Cc: Liam R. Howlett <Liam.Howlett@oracle.com> |
| Cc: Mark Brown <broonie@kernel.org> |
| Cc: Vlastimil Babka <vbabka@suse.cz> |
| Cc: Bert Karwatzki <spasswolf@web.de> |
| Cc: Jeff Xu <jeffxu@chromium.org> |
| Cc: Jiri Olsa <olsajiri@gmail.com> |
| Cc: Kees Cook <kees@kernel.org> |
| Cc: Lorenzo Stoakes <lstoakes@gmail.com> |
| Cc: Matthew Wilcox <willy@infradead.org> |
| Cc: "Paul E. McKenney" <paulmck@kernel.org> |
| Cc: Paul Moore <paul@paul-moore.com> |
| Cc: Sidhartha Kumar <sidhartha.kumar@oracle.com> |
| Cc: Suren Baghdasaryan <surenb@google.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| mm/vma.c | 39 +++++++++++++++++++++++++++------------ |
| 1 file changed, 27 insertions(+), 12 deletions(-) |
| |
| --- a/mm/vma.c~mm-introduce-commit_merge-abstracting-final-commit-of-merge |
| +++ a/mm/vma.c |
| @@ -585,6 +585,31 @@ void validate_mm(struct mm_struct *mm) |
| } |
| #endif /* CONFIG_DEBUG_VM_MAPLE_TREE */ |
| |
| +/* Actually perform the VMA merge operation. */ |
| +static int commit_merge(struct vma_merge_struct *vmg, |
| + struct vm_area_struct *remove) |
| +{ |
| + struct vma_prepare vp; |
| + |
| + init_multi_vma_prep(&vp, vmg->vma, NULL, remove, NULL); |
| + |
| + /* Note: vma iterator must be pointing to 'start'. */ |
| + vma_iter_config(vmg->vmi, vmg->start, vmg->end); |
| + |
| + if (vma_iter_prealloc(vmg->vmi, vmg->vma)) |
| + return -ENOMEM; |
| + |
| + vma_prepare(&vp); |
| + vma_adjust_trans_huge(vmg->vma, vmg->start, vmg->end, 0); |
| + vma_set_range(vmg->vma, vmg->start, vmg->end, vmg->pgoff); |
| + |
| + vma_iter_store(vmg->vmi, vmg->vma); |
| + |
| + vma_complete(&vp, vmg->vmi, vmg->vma->vm_mm); |
| + |
| + return 0; |
| +} |
| + |
| /* |
| * vma_merge_new_range - Attempt to merge a new VMA into address space |
| * |
| @@ -712,7 +737,6 @@ int vma_expand(struct vma_merge_struct * |
| bool remove_next = false; |
| struct vm_area_struct *vma = vmg->vma; |
| struct vm_area_struct *next = vmg->next; |
| - struct vma_prepare vp; |
| |
| mmap_assert_write_locked(vmg->mm); |
| |
| @@ -727,24 +751,15 @@ int vma_expand(struct vma_merge_struct * |
| return ret; |
| } |
| |
| - init_multi_vma_prep(&vp, vma, NULL, remove_next ? next : NULL, NULL); |
| /* Not merging but overwriting any part of next is not handled. */ |
| - VM_WARN_ON(next && !vp.remove && |
| + VM_WARN_ON(next && !remove_next && |
| next != vma && vmg->end > next->vm_start); |
| /* Only handles expanding */ |
| VM_WARN_ON(vma->vm_start < vmg->start || vma->vm_end > vmg->end); |
| |
| - /* Note: vma iterator must be pointing to 'start' */ |
| - vma_iter_config(vmg->vmi, vmg->start, vmg->end); |
| - if (vma_iter_prealloc(vmg->vmi, vma)) |
| + if (commit_merge(vmg, remove_next ? next : NULL)) |
| goto nomem; |
| |
| - vma_prepare(&vp); |
| - vma_adjust_trans_huge(vma, vmg->start, vmg->end, 0); |
| - vma_set_range(vma, vmg->start, vmg->end, vmg->pgoff); |
| - vma_iter_store(vmg->vmi, vma); |
| - |
| - vma_complete(&vp, vmg->vmi, vma->vm_mm); |
| return 0; |
| |
| nomem: |
| _ |