linux-mm.kvack.org archive mirror
 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 v2 34/44] mm: Change munmap splitting order and move_vma()
Date: Thu, 5 Jan 2023 19:16:02 +0000	[thread overview]
Message-ID: <20230105191517.3099082-35-Liam.Howlett@oracle.com> (raw)
In-Reply-To: <20230105191517.3099082-1-Liam.Howlett@oracle.com>

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

Splitting can be more efficient when the order is not of concern.
Change do_vmi_align_munmap() to reduce walking of the tree during split
operations.

move_vma() must also be altered to remove the dependency of keeping the
original VMA as the active part of the split.  Transition to using vma
iterator to look up the prev and/or next vma after munmap.

Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
---
 mm/mmap.c   | 18 ++----------------
 mm/mremap.c | 27 ++++++++++++++++-----------
 2 files changed, 18 insertions(+), 27 deletions(-)

diff --git a/mm/mmap.c b/mm/mmap.c
index 99c94d49640b..c1796f9261e4 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -2387,21 +2387,9 @@ do_vmi_align_munmap(struct vma_iterator *vmi, struct vm_area_struct *vma,
 	for_each_vma_range(*vmi, next, end) {
 		/* Does it split the end? */
 		if (next->vm_end > end) {
-			struct vm_area_struct *split;
-
-			error = __split_vma(vmi, next, end, 1);
+			error = __split_vma(vmi, next, end, 0);
 			if (error)
 				goto end_split_failed;
-
-			split = vma_prev(vmi);
-			error = munmap_sidetree(split, &mas_detach);
-			if (error)
-				goto munmap_sidetree_failed;
-
-			count++;
-			if (vma == next)
-				vma = split;
-			break;
 		}
 		error = munmap_sidetree(next, &mas_detach);
 		if (error)
@@ -2414,9 +2402,7 @@ do_vmi_align_munmap(struct vma_iterator *vmi, struct vm_area_struct *vma,
 #endif
 	}
 
-	if (!next)
-		next = vma_next(vmi);
-
+	next = vma_next(vmi);
 	if (unlikely(uf)) {
 		/*
 		 * If userfaultfd_unmap_prep returns an error the vmas
diff --git a/mm/mremap.c b/mm/mremap.c
index 00845aec5441..98f27d466265 100644
--- a/mm/mremap.c
+++ b/mm/mremap.c
@@ -580,11 +580,12 @@ static unsigned long move_vma(struct vm_area_struct *vma,
 	unsigned long vm_flags = vma->vm_flags;
 	unsigned long new_pgoff;
 	unsigned long moved_len;
-	unsigned long excess = 0;
+	unsigned long account_start = 0;
+	unsigned long account_end = 0;
 	unsigned long hiwater_vm;
-	int split = 0;
 	int err = 0;
 	bool need_rmap_locks;
+	VMA_ITERATOR(vmi, mm, old_addr);
 
 	/*
 	 * We'd prefer to avoid failure later on in do_munmap:
@@ -662,10 +663,10 @@ static unsigned long move_vma(struct vm_area_struct *vma,
 	/* Conceal VM_ACCOUNT so old reservation is not undone */
 	if (vm_flags & VM_ACCOUNT && !(flags & MREMAP_DONTUNMAP)) {
 		vma->vm_flags &= ~VM_ACCOUNT;
-		excess = vma->vm_end - vma->vm_start - old_len;
-		if (old_addr > vma->vm_start &&
-		    old_addr + old_len < vma->vm_end)
-			split = 1;
+		if (vma->vm_start < old_addr)
+			account_start = vma->vm_start;
+		if (vma->vm_end > old_addr + old_len)
+			account_end = vma->vm_end;
 	}
 
 	/*
@@ -700,11 +701,11 @@ static unsigned long move_vma(struct vm_area_struct *vma,
 		return new_addr;
 	}
 
-	if (do_munmap(mm, old_addr, old_len, uf_unmap) < 0) {
+	if (do_vmi_munmap(&vmi, mm, old_addr, old_len, uf_unmap, false) < 0) {
 		/* OOM: unable to split vma, just get accounts right */
 		if (vm_flags & VM_ACCOUNT && !(flags & MREMAP_DONTUNMAP))
 			vm_acct_memory(old_len >> PAGE_SHIFT);
-		excess = 0;
+		account_start = account_end = 0;
 	}
 
 	if (vm_flags & VM_LOCKED) {
@@ -715,10 +716,14 @@ static unsigned long move_vma(struct vm_area_struct *vma,
 	mm->hiwater_vm = hiwater_vm;
 
 	/* Restore VM_ACCOUNT if one or two pieces of vma left */
-	if (excess) {
+	if (account_start) {
+		vma = vma_prev(&vmi);
+		vma->vm_flags |= VM_ACCOUNT;
+	}
+
+	if (account_end) {
+		vma = vma_next(&vmi);
 		vma->vm_flags |= VM_ACCOUNT;
-		if (split)
-			find_vma(mm, vma->vm_end)->vm_flags |= VM_ACCOUNT;
 	}
 
 	return new_addr;
-- 
2.35.1


  parent reply	other threads:[~2023-01-05 19:16 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-05 19:15 [PATCH v2 00/44] VMA tree type safety and remove __vma_adjust() Liam Howlett
2023-01-05 19:15 ` [PATCH v2 02/44] maple_tree: Fix potential rcu issue Liam Howlett
2023-01-05 19:15 ` [PATCH v2 01/44] maple_tree: Add mas_init() function Liam Howlett
2023-01-05 19:15 ` [PATCH v2 05/44] mm: Expand vma iterator interface Liam Howlett
2023-01-05 19:15 ` [PATCH v2 03/44] maple_tree: Reduce user error potential Liam Howlett
2023-01-05 19:15 ` [PATCH v2 04/44] test_maple_tree: Test modifications while iterating Liam Howlett
2023-01-05 19:15 ` [PATCH v2 07/44] kernel/fork: Convert forking to using the vmi iterator Liam Howlett
2023-01-05 19:15 ` [PATCH v2 06/44] mm/mmap: convert brk to use vma iterator Liam Howlett
2023-01-09 15:10   ` Vernon Yang
2023-01-09 16:38     ` Liam Howlett
2023-01-05 19:15 ` [PATCH v2 08/44] mmap: Convert vma_link() " Liam Howlett
2023-01-05 19:15 ` [PATCH v2 11/44] mmap: Convert vma_expand() to use " Liam Howlett
2023-01-05 19:15 ` [PATCH v2 09/44] mm/mmap: Remove preallocation from do_mas_align_munmap() Liam Howlett
2023-01-05 19:15 ` [PATCH v2 10/44] mmap: Change do_mas_munmap and do_mas_aligned_munmap() to use vma iterator Liam Howlett
2023-01-10 14:53   ` Sven Schnelle
2023-01-10 17:26     ` Liam Howlett
2023-01-11  6:55       ` Sven Schnelle
2023-01-05 19:15 ` [PATCH v2 12/44] mm: Add temporary vma iterator versions of vma_merge(), split_vma(), and __split_vma() Liam Howlett
2023-01-05 19:15 ` [PATCH v2 14/44] userfaultfd: Use vma iterator Liam Howlett
2023-01-05 19:15 ` [PATCH v2 13/44] ipc/shm: Use the vma iterator for munmap calls Liam Howlett
2023-01-05 19:15 ` [PATCH v2 15/44] mm: Change mprotect_fixup to vma iterator Liam Howlett
2023-01-05 19:15 ` [PATCH v2 16/44] mlock: Convert mlock " Liam Howlett
2023-01-05 19:15 ` [PATCH v2 18/44] mempolicy: Convert " Liam Howlett
2023-01-05 19:15 ` [PATCH v2 17/44] coredump: " Liam Howlett
2023-01-05 19:15 ` [PATCH v2 19/44] task_mmu: " Liam Howlett
2023-01-05 19:15 ` [PATCH v2 22/44] mmap: Pass through vmi iterator to __split_vma() Liam Howlett
2023-01-07  2:01   ` SeongJae Park
2023-01-07  2:39     ` SeongJae Park
2023-01-09 16:45       ` Liam Howlett
2023-01-09 19:28         ` SeongJae Park
2023-01-09 20:30           ` Liam Howlett
2023-01-09 23:07             ` SeongJae Park
2023-01-05 19:15 ` [PATCH v2 20/44] sched: Convert to vma iterator Liam Howlett
2023-01-05 19:15 ` [PATCH v2 21/44] madvise: Use vmi iterator for __split_vma() and vma_merge() Liam Howlett
2023-01-05 19:15 ` [PATCH v2 23/44] mmap: Use vmi version of vma_merge() Liam Howlett
2023-01-05 19:15 ` [PATCH v2 24/44] mm/mremap: " Liam Howlett
2023-01-05 19:15 ` [PATCH v2 25/44] mm: Switch vma_merge(), split_vma(), and __split_vma to vma iterator Liam Howlett
2023-01-06 17:23   ` SeongJae Park
2023-01-06 19:20     ` Liam Howlett
2023-01-05 19:16 ` [PATCH v2 27/44] mmap: Convert __vma_adjust() to use " Liam Howlett
2023-01-05 19:16 ` [PATCH v2 26/44] mm/damon: Stop using vma_mas_store() for maple tree store Liam Howlett
2023-01-05 19:32   ` SeongJae Park
2023-01-05 19:52     ` Liam Howlett
2023-01-05 20:16       ` SeongJae Park
2023-01-05 19:16 ` [PATCH v2 30/44] mm: Remove unnecessary write to vma iterator in __vma_adjust() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 29/44] madvise: Use split_vma() instead of __split_vma() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 28/44] mm: Pass through vma iterator to __vma_adjust() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 31/44] mm: Pass vma iterator through " Liam Howlett
2023-01-05 19:16 ` Liam Howlett [this message]
2023-01-05 19:16 ` [PATCH v2 33/44] mmap: Clean up mmap_region() unrolling Liam Howlett
2023-01-05 19:16 ` [PATCH v2 32/44] mm: Add vma iterator to vma_adjust() arguments Liam Howlett
2023-01-05 19:16 ` [PATCH v2 35/44] mm/mmap: move anon_vma setting in __vma_adjust() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 36/44] mm/mmap: Refactor locking out of __vma_adjust() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 37/44] mm/mmap: Use vma_prepare() and vma_complete() in vma_expand() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 38/44] mm/mmap: Introduce init_vma_prep() and init_multi_vma_prep() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 39/44] mm: Don't use __vma_adjust() in __split_vma() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 40/44] mm/mmap: Don't use __vma_adjust() in shift_arg_pages() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 41/44] mm/mmap: Introduce dup_vma_anon() helper Liam Howlett
2023-01-05 19:16 ` [PATCH v2 43/44] mm/mmap: Remove __vma_adjust() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 42/44] mm/mmap: Convert do_brk_flags() to use vma_prepare() and vma_complete() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 44/44] vma_merge: Set vma iterator to correct position Liam Howlett
2023-01-10 22:51 ` [PATCH v2 00/44] VMA tree type safety and remove __vma_adjust() Mark Brown
2023-01-11  2:22   ` 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=20230105191517.3099082-35-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox