All of lore.kernel.org
 help / color / mirror / Atom feed
From: Liam Howlett <liam.howlett@oracle.com>
To: "maple-tree@lists.infradead.org" <maple-tree@lists.infradead.org>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: Liam Howlett <liam.howlett@oracle.com>,
	Liam Howlett <liam.howlett@oracle.com>
Subject: [PATCH 37/43] mm/mmap: Introduce init_vma_prep() and init_multi_vma_prep()
Date: Tue, 29 Nov 2022 16:44:36 +0000	[thread overview]
Message-ID: <20221129164352.3374638-38-Liam.Howlett@oracle.com> (raw)
In-Reply-To: <20221129164352.3374638-1-Liam.Howlett@oracle.com>

From: "Liam R. Howlett" <Liam.Howlett@Oracle.com>

Add init_vma_prep() and init_multi_vma_prep() to set up the struct
vma_prepare.  This is to abstract the locking when adjusting the VMAs.

Also change __vma_adjust() variable remove_next int in favour of a
pointer to the VMA to remove.  Rename next_next to remove2 since this
better reflects its use.

Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
---
 mm/mmap.c | 108 ++++++++++++++++++++++++++++++------------------------
 1 file changed, 61 insertions(+), 47 deletions(-)

diff --git a/mm/mmap.c b/mm/mmap.c
index 39555335f145..258113e13a88 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -517,6 +517,45 @@ static int vma_link(struct mm_struct *mm, struct vm_area_struct *vma)
 	return 0;
 }
 
+/*
+ * init_multi_vma_prep() - Initializer for struct vma_prepare
+ * @vp: The vma_prepare struct
+ * @vma: The vma that will be altered once locked
+ * @next: The next vma if it is to be adjusted
+ * @remove: The first vma to be removed
+ * @remove2: The second vma to be removed
+ */
+static inline void init_multi_vma_prep(struct vma_prepare *vp,
+		struct vm_area_struct *vma, struct vm_area_struct *next,
+		struct vm_area_struct *remove, struct vm_area_struct *remove2)
+{
+	memset(vp, 0, sizeof(struct vma_prepare));
+	vp->vma = vma;
+	vp->anon_vma = vma->anon_vma;
+	vp->remove = remove;
+	vp->remove2 = remove2;
+	vp->adj_next = next;
+	if (!vp->anon_vma && next)
+		vp->anon_vma = next->anon_vma;
+
+	vp->file = vma->vm_file;
+	if (vp->file)
+		vp->mapping = vma->vm_file->f_mapping;
+
+}
+
+/*
+ * init_vma_prep() - Initializer wrapper for vma_prepare struct
+ * @vp: The vma_prepare struct
+ * @vma: The vma that will be altered once locked
+ */
+static inline void init_vma_prep(struct vma_prepare *vp,
+				 struct vm_area_struct *vma)
+{
+	init_multi_vma_prep(vp, vma, NULL, NULL, NULL);
+}
+
+
 /*
  * vma_prepare() - Helper function for handling locking VMAs prior to altering
  * @vp: The initialized vma_prepare struct
@@ -626,7 +665,7 @@ static inline void vma_complete(struct vma_prepare *vp,
 
 		/*
 		 * In mprotect's case 6 (see comments on vma_merge),
-		 * we must remove next_next too.
+		 * we must remove the one after next as well.
 		 */
 		if (vp->remove2) {
 			vp->remove = vp->remove2;
@@ -660,17 +699,14 @@ inline int vma_expand(struct vma_iterator *vmi, struct vm_area_struct *vma,
 		      struct vm_area_struct *next)
 
 {
+	bool remove_next = false;
 	struct vma_prepare vp;
 
-	memset(&vp, 0, sizeof(vp));
-	vp.vma = vma;
-	vp.anon_vma = vma->anon_vma;
 	if (next && (vma != next) && (end == next->vm_end)) {
-		vp.remove = next;
+		remove_next = true;
 		if (next->anon_vma && !vma->anon_vma) {
 			int error;
 
-			vp.anon_vma = next->anon_vma;
 			vma->anon_vma = next->anon_vma;
 			error = anon_vma_clone(vma, next);
 			if (error)
@@ -678,6 +714,7 @@ inline int vma_expand(struct vma_iterator *vmi, struct vm_area_struct *vma,
 		}
 	}
 
+	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 &&
 		  next != vma && end > next->vm_start);
@@ -688,11 +725,6 @@ inline int vma_expand(struct vma_iterator *vmi, struct vm_area_struct *vma,
 		goto nomem;
 
 	vma_adjust_trans_huge(vma, start, end, 0);
-
-	vp.file = vma->vm_file;
-	if (vp.file)
-		vp.mapping = vp.file->f_mapping;
-
 	/* VMA iterator points to previous, so set to start if necessary */
 	if (vma_iter_addr(vmi) != start)
 		vma_iter_set(vmi, start);
@@ -723,14 +755,13 @@ int __vma_adjust(struct vma_iterator *vmi, struct vm_area_struct *vma,
 	struct vm_area_struct *insert, struct vm_area_struct *expand)
 {
 	struct mm_struct *mm = vma->vm_mm;
-	struct vm_area_struct *next_next = NULL;	/* uninit var warning */
+	struct vm_area_struct *remove2 = NULL;
+	struct vm_area_struct *remove = NULL;
 	struct vm_area_struct *next = find_vma(mm, vma->vm_end);
 	struct vm_area_struct *orig_vma = vma;
-	struct anon_vma *anon_vma = NULL;
 	struct file *file = vma->vm_file;
 	bool vma_changed = false;
 	long adjust_next = 0;
-	int remove_next = 0;
 	struct vm_area_struct *exporter = NULL, *importer = NULL;
 	struct vma_prepare vma_prep;
 
@@ -749,25 +780,24 @@ int __vma_adjust(struct vma_iterator *vmi, struct vm_area_struct *vma,
 				 */
 				VM_WARN_ON(end != next->vm_end);
 				/*
-				 * remove_next == 3 means we're
-				 * removing "vma" and that to do so we
+				 * we're removing "vma" and that to do so we
 				 * swapped "vma" and "next".
 				 */
-				remove_next = 3;
 				VM_WARN_ON(file != next->vm_file);
 				swap(vma, next);
+				remove = next;
 			} else {
 				VM_WARN_ON(expand != vma);
 				/*
-				 * case 1, 6, 7, remove_next == 2 is case 6,
-				 * remove_next == 1 is case 1 or 7.
+				 * case 1, 6, 7, remove next.
+				 * case 6 also removes the one beyond next
 				 */
-				remove_next = 1 + (end > next->vm_end);
-				if (remove_next == 2)
-					next_next = find_vma(mm, next->vm_end);
+				remove = next;
+				if (end > next->vm_end)
+					remove2 = find_vma(mm, next->vm_end);
 
-				VM_WARN_ON(remove_next == 2 &&
-					   end != next_next->vm_end);
+				VM_WARN_ON(remove2 != NULL &&
+					   end != remove2->vm_end);
 			}
 
 			exporter = next;
@@ -777,8 +807,8 @@ int __vma_adjust(struct vma_iterator *vmi, struct vm_area_struct *vma,
 			 * If next doesn't have anon_vma, import from vma after
 			 * next, if the vma overlaps with it.
 			 */
-			if (remove_next == 2 && !next->anon_vma)
-				exporter = next_next;
+			if (remove2 != NULL && !next->anon_vma)
+				exporter = remove2;
 
 		} else if (end > next->vm_start) {
 			/*
@@ -819,30 +849,14 @@ int __vma_adjust(struct vma_iterator *vmi, struct vm_area_struct *vma,
 	if (vma_iter_prealloc(vmi, vma))
 		return -ENOMEM;
 
-	anon_vma = vma->anon_vma;
-	if (!anon_vma && adjust_next)
-		anon_vma = next->anon_vma;
-
-	if (anon_vma)
-		VM_WARN_ON(adjust_next && next->anon_vma &&
-			   anon_vma != next->anon_vma);
-
 	vma_adjust_trans_huge(orig_vma, start, end, adjust_next);
 
-	memset(&vma_prep, 0, sizeof(vma_prep));
-	vma_prep.vma = vma;
-	vma_prep.anon_vma = anon_vma;
-	vma_prep.file = file;
-	if (adjust_next)
-		vma_prep.adj_next = next;
-	if (file)
-		vma_prep.mapping = file->f_mapping;
-	vma_prep.insert = insert;
-	if (remove_next) {
-		vma_prep.remove = next;
-		vma_prep.remove2 = next_next;
-	}
+	init_multi_vma_prep(&vma_prep, vma, adjust_next ? next : NULL, remove,
+			    remove2);
+	VM_WARN_ON(vma_prep.anon_vma && adjust_next && next->anon_vma &&
+		   vma_prep.anon_vma != next->anon_vma);
 
+	vma_prep.insert = insert;
 	vma_prepare(&vma_prep);
 
 	if (start != vma->vm_start) {
-- 
2.35.1

  parent reply	other threads:[~2022-11-29 16:48 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-29 16:44 [PATCH 00/43] VMA type safety through VMA iterator Liam Howlett
2022-11-29 16:44 ` [PATCH 03/43] maple_tree: Reduce user error potential Liam Howlett
2022-11-29 16:44 ` [PATCH 02/43] maple_tree: Fix potential rcu issue Liam Howlett
2022-11-29 16:44 ` [PATCH 01/43] maple_tree: Add mas_init() function Liam Howlett
2022-11-29 16:44 ` [PATCH 05/43] mm: Expand vma iterator interface Liam Howlett
2022-11-30 16:35   ` kernel test robot
2022-12-13 21:04     ` Liam Howlett
2022-11-29 16:44 ` [PATCH 06/43] mm/mmap: convert brk to use vma iterator Liam Howlett
2022-11-29 16:44 ` [PATCH 04/43] test_maple_tree: Test modifications while iterating Liam Howlett
2022-11-29 16:44 ` [PATCH 08/43] mmap: Convert vma_link() vma iterator Liam Howlett
2022-11-29 16:44 ` [PATCH 07/43] kernel/fork: Convert forking to using the vmi iterator Liam Howlett
2022-11-29 16:44 ` [PATCH 09/43] mm/mmap: Remove preallocation from do_mas_align_munmap() Liam Howlett
2022-11-29 16:44 ` [PATCH 10/43] mmap: Change do_mas_munmap and do_mas_aligned_munmap() to use vma iterator Liam Howlett
2022-11-29 16:44 ` [PATCH 11/43] mmap: Convert vma_expand() " Liam Howlett
2022-11-29 16:44 ` [PATCH 12/43] mm: Add temporary vma iterator versions of vma_merge(), split_vma(), and __split_vma() Liam Howlett
2022-11-29 16:44 ` [PATCH 13/43] ipc/shm: Use the vma iterator for munmap calls Liam Howlett
2022-11-29 16:44 ` [PATCH 15/43] mm: Change mprotect_fixup to vma iterator Liam Howlett
2022-11-29 16:44 ` [PATCH 14/43] userfaultfd: Use " Liam Howlett
2022-11-29 16:44 ` [PATCH 16/43] mlock: Convert mlock to " Liam Howlett
2022-11-29 16:44 ` [PATCH 17/43] coredump: Convert " Liam Howlett
2022-11-29 16:44 ` [PATCH 19/43] task_mmu: " Liam Howlett
2022-11-29 16:44 ` [PATCH 18/43] mempolicy: " Liam Howlett
2022-11-29 16:44 ` [PATCH 20/43] sched: " Liam Howlett
2022-11-29 16:44 ` [PATCH 21/43] madvise: Use vmi iterator for __split_vma() and vma_merge() Liam Howlett
2022-11-29 16:44 ` [PATCH 23/43] mmap: Use vmi version of vma_merge() Liam Howlett
2022-11-29 16:44 ` [PATCH 22/43] mmap: Pass through vmi iterator to __split_vma() Liam Howlett
2022-11-29 16:44 ` [PATCH 25/43] mm: Switch vma_merge(), split_vma(), and __split_vma to vma iterator Liam Howlett
2022-11-29 16:44 ` [PATCH 24/43] mm/mremap: Use vmi version of vma_merge() Liam Howlett
2022-11-29 16:44 ` [PATCH 27/43] mm: Pass through vma iterator to __vma_adjust() Liam Howlett
2022-11-29 16:44 ` [PATCH 26/43] mmap: Convert __vma_adjust() to use vma iterator Liam Howlett
2022-12-01 19:53   ` kernel test robot
2022-12-13 21:05     ` Liam Howlett
2022-11-29 16:44 ` [PATCH 30/43] mm: Pass vma iterator through to __vma_adjust() Liam Howlett
2022-11-29 16:44 ` [PATCH 29/43] mm: Remove unnecessary write to vma iterator in __vma_adjust() Liam Howlett
2022-11-29 16:44 ` [PATCH 28/43] madvise: Use split_vma() instead of __split_vma() Liam Howlett
2022-11-29 16:44 ` [PATCH 33/43] mm: Change munmap splitting order and move_vma() Liam Howlett
2022-11-29 16:44 ` [PATCH 32/43] mmap: Clean up mmap_region() unrolling Liam Howlett
2022-11-29 16:44 ` [PATCH 31/43] mm: Add vma iterator to vma_adjust() arguments Liam Howlett
2022-11-29 16:44 ` [PATCH 35/43] mm/mmap: Refactor locking out of __vma_adjust() Liam Howlett
2022-11-29 16:44 ` [PATCH 36/43] mm/mmap: Use vma_prepare() and vma_complete() in vma_expand() Liam Howlett
2022-11-29 16:44 ` [PATCH 34/43] mm/mmap: move anon_vma setting in __vma_adjust() Liam Howlett
2022-11-29 16:44 ` [PATCH 39/43] mm/mmap: Don't use __vma_adjust() in shift_arg_pages() Liam Howlett
2022-11-29 16:44 ` [PATCH 38/43] mm: Don't use __vma_adjust() in __split_vma() Liam Howlett
2022-11-29 16:44 ` Liam Howlett [this message]
2022-11-29 16:44 ` [PATCH 40/43] mm/mmap: Introduce dup_vma_anon() helper Liam Howlett
2022-11-29 16:44 ` [PATCH 42/43] mm/mmap: Remove __vma_adjust() Liam Howlett
2022-11-29 16:44 ` [PATCH 41/43] mm/mmap: Convert do_brk_flags() to use vma_prepare() and vma_complete() Liam Howlett
2022-11-29 16:44 ` [PATCH 43/43] vma_merge: Set vma iterator to correct position Liam Howlett
2022-11-30  0:46 ` [PATCH 00/43] VMA type safety through VMA iterator Liam Howlett

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=20221129164352.3374638-38-Liam.Howlett@oracle.com \
    --to=liam.howlett@oracle.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=maple-tree@lists.infradead.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.