From: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
To: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>
Cc: "Liam R . Howlett" <Liam.Howlett@oracle.com>,
Vlastimil Babka <vbabka@suse.cz>, Mark Brown <broonie@kernel.org>
Subject: [PATCH v3 08/10] mm: introduce commit_merge(), abstracting final commit of merge
Date: Fri, 30 Aug 2024 19:10:20 +0100 [thread overview]
Message-ID: <7b985a20dfa549e3c370cd274d732b64c44f6dbd.1725040657.git.lorenzo.stoakes@oracle.com> (raw)
In-Reply-To: <cover.1725040657.git.lorenzo.stoakes@oracle.com>
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.
Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
---
mm/vma.c | 39 +++++++++++++++++++++++++++------------
1 file changed, 27 insertions(+), 12 deletions(-)
diff --git a/mm/vma.c b/mm/vma.c
index eb4f32705a41..566cad2338dd 100644
--- a/mm/vma.c
+++ b/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 *vmg)
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 *vmg)
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:
--
2.46.0
next prev parent reply other threads:[~2024-08-30 18:11 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-30 18:10 [PATCH v3 00/10] mm: remove vma_merge() Lorenzo Stoakes
2024-08-30 18:10 ` [PATCH v3 01/10] tools: improve vma test Makefile Lorenzo Stoakes
2024-08-30 18:10 ` [PATCH v3 02/10] tools: add VMA merge tests Lorenzo Stoakes
2024-08-30 18:10 ` [PATCH v3 03/10] mm: introduce vma_merge_struct and abstract vma_merge(),vma_modify() Lorenzo Stoakes
2024-08-30 18:10 ` [PATCH v3 04/10] mm: remove duplicated open-coded VMA policy check Lorenzo Stoakes
2024-08-30 18:10 ` [PATCH v3 05/10] mm: abstract vma_expand() to use vma_merge_struct Lorenzo Stoakes
2024-08-30 18:10 ` [PATCH v3 06/10] mm: avoid using vma_merge() for new VMAs Lorenzo Stoakes
2024-08-30 18:10 ` [PATCH v3 07/10] mm: make vma_prepare() and friends static and internal to vma.c Lorenzo Stoakes
2024-08-30 18:10 ` Lorenzo Stoakes [this message]
2024-08-30 18:10 ` [PATCH v3 09/10] mm: refactor vma_merge() into modify-only vma_merge_existing_range() Lorenzo Stoakes
2024-08-30 18:10 ` [PATCH v3 10/10] mm: rework vm_ops->close() handling on VMA merge Lorenzo Stoakes
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7b985a20dfa549e3c370cd274d732b64c44f6dbd.1725040657.git.lorenzo.stoakes@oracle.com \
--to=lorenzo.stoakes@oracle.com \
--cc=Liam.Howlett@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=broonie@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=vbabka@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox