From: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
To: "Vlastimil Babka (SUSE)" <vbabka@kernel.org>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
"Liam R . Howlett" <Liam.Howlett@oracle.com>
Subject: Re: [PATCH 04/10] mm: abstract parameters for vma_expand/shrink()
Date: Thu, 8 Aug 2024 16:45:53 +0100 [thread overview]
Message-ID: <2d85f8a8-6937-499c-91fd-7dc5deced71f@lucifer.local> (raw)
In-Reply-To: <f12608ec-9c40-4977-a5a6-479f86b44e80@kernel.org>
On Thu, Aug 08, 2024 at 04:20:26PM GMT, Vlastimil Babka (SUSE) wrote:
> On 8/5/24 14:13, Lorenzo Stoakes wrote:
> > Equally use struct vma_merge_struct to abstract parameters for VMA
> > expansion and shrinking.
> >
> > This leads the way to further refactoring and de-duplication by
> > standardising the interface.
> >
> > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
> > ---
> > mm/mmap.c | 30 +++++++++++--------
> > mm/vma.c | 66 ++++++++++++++++++-----------------------
> > mm/vma.h | 8 ++---
> > tools/testing/vma/vma.c | 18 +++++++++--
> > 4 files changed, 65 insertions(+), 57 deletions(-)
> >
> > diff --git a/mm/mmap.c b/mm/mmap.c
> > index 721ced6e37b0..04145347c245 100644
> > --- a/mm/mmap.c
> > +++ b/mm/mmap.c
> > @@ -1367,7 +1367,6 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
> > pgoff_t pglen = len >> PAGE_SHIFT;
> > unsigned long charged = 0;
> > unsigned long end = addr + len;
> > - unsigned long merge_start = addr, merge_end = end;
> > bool writable_file_mapping = false;
> > int error;
> > VMA_ITERATOR(vmi, mm, addr);
> > @@ -1423,28 +1422,26 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
> > /* Attempt to expand an old mapping */
> > /* Check next */
> > if (next && next->vm_start == end && can_vma_merge_before(&vmg)) {
> > - merge_end = next->vm_end;
> > - vma = next;
> > + /* We can adjust this as can_vma_merge_after() doesn't touch */
> > + vmg.end = next->vm_end;
>
> Ugh, ok but wonder how fragile that is.
Yeah you're right this is a bit horrid, I'll find a way to make this less
brittle.
>
> > + vma = vmg.vma = next;
> > vmg.pgoff = next->vm_pgoff - pglen;
> > - }
> >
> > - if (vma) {
> > + /* We may merge our NULL anon_vma with non-NULL in next. */
>
> Hm now I realize the if (vma) block probably didn't need to be added in
> patch 2 only to removed here, it could have been part of the if (next &&
> ...) block above already? Which is not that important, but...
You're right, will fix.
>
> > vmg.anon_vma = vma->anon_vma;
> > - vmg.uffd_ctx = vma->vm_userfaultfd_ctx;
>
> I don't see why it's now ok to remove this line? Was it intended? In patch 2
> it made sense to me to add it so the can_vma_merge_after() still has the
> right ctx for comparing, and this didn't change?
Yeah, yikes, I think I was lost in the maelstrom of considering edge cases,
and now this is broken for the whole prev vs. next uffd thing.
The fact the mmap stuff is not directly testable is a factor here.
TL;DR: I'll fix this, you're right.
>
> > }
> >
> > /* Check prev */
> > if (prev && prev->vm_end == addr && can_vma_merge_after(&vmg)) {
> > - merge_start = prev->vm_start;
> > - vma = prev;
> > + vmg.start = prev->vm_start;
> > + vma = vmg.vma = prev;
> > vmg.pgoff = prev->vm_pgoff;
> > } else if (prev) {
> > vma_iter_next_range(&vmi);
> > }
> >
> > /* Actually expand, if possible */
> > - if (vma &&
> > - !vma_expand(&vmi, vma, merge_start, merge_end, vmg.pgoff, next)) {
> > + if (vma && !vma_expand(&vmg)) {
> > khugepaged_enter_vma(vma, vm_flags);
> > goto expanded;
> > }
> > @@ -2359,6 +2356,13 @@ int relocate_vma_down(struct vm_area_struct *vma, unsigned long shift)
> > VMA_ITERATOR(vmi, mm, new_start);
> > struct vm_area_struct *next;
> > struct mmu_gather tlb;
> > + struct vma_merge_struct vmg = {
> > + .vmi = &vmi,
> > + .vma = vma,
> > + .start = new_start,
> > + .end = old_end,
> > + .pgoff = vma->vm_pgoff,
> > + };
> >
> > BUG_ON(new_start > new_end);
> >
> > @@ -2373,7 +2377,7 @@ int relocate_vma_down(struct vm_area_struct *vma, unsigned long shift)
> > /*
> > * cover the whole range: [new_start, old_end)
> > */
> > - if (vma_expand(&vmi, vma, new_start, old_end, vma->vm_pgoff, NULL))
> > + if (vma_expand(&vmg))
> > return -ENOMEM;
> >
> > /*
> > @@ -2406,6 +2410,8 @@ int relocate_vma_down(struct vm_area_struct *vma, unsigned long shift)
> > tlb_finish_mmu(&tlb);
> >
> > vma_prev(&vmi);
> > + vmg.end = new_end;
> > +
> > /* Shrink the vma to just the new range */
> > - return vma_shrink(&vmi, vma, new_start, new_end, vma->vm_pgoff);
> > + return vma_shrink(&vmg);
>
> The vma_shrink() doesn't seem to benefit that much from vmg conversion but I
> guess why not. Maybe this will further change anyway...
>
No it doesn't, but it's more about being consistent with vma_expand(). We
maybe want to find a way to unite them possibly.
next prev parent reply other threads:[~2024-08-08 15:46 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-05 12:13 [PATCH 00/10] mm: remove vma_merge() Lorenzo Stoakes
2024-08-05 12:13 ` [PATCH 01/10] tools: improve vma test Makefile Lorenzo Stoakes
2024-08-05 12:13 ` [PATCH 02/10] mm: introduce vma_merge_struct and abstract merge parameters Lorenzo Stoakes
2024-08-06 12:47 ` Petr Tesařík
2024-08-06 13:43 ` Lorenzo Stoakes
2024-08-06 14:06 ` Petr Tesařík
2024-08-06 14:20 ` Lorenzo Stoakes
2024-08-06 14:32 ` Petr Tesařík
2024-08-08 12:49 ` Vlastimil Babka
2024-08-08 17:18 ` Lorenzo Stoakes
2024-08-08 20:07 ` Liam R. Howlett
2024-08-09 10:11 ` Lorenzo Stoakes
2024-08-05 12:13 ` [PATCH 03/10] mm: abstract duplicated policy comparison Lorenzo Stoakes
2024-08-06 12:50 ` Petr Tesařík
2024-08-05 12:13 ` [PATCH 04/10] mm: abstract parameters for vma_expand/shrink() Lorenzo Stoakes
2024-08-06 12:54 ` Petr Tesařík
[not found] ` <f12608ec-9c40-4977-a5a6-479f86b44e80@kernel.org>
2024-08-08 15:45 ` Lorenzo Stoakes [this message]
2024-08-08 20:20 ` Liam R. Howlett
2024-08-09 10:18 ` Lorenzo Stoakes
2024-08-14 13:53 ` Lorenzo Stoakes
2024-08-05 12:13 ` [PATCH 05/10] mm: abstract vma_merge_new_vma() to use vma_merge_struct Lorenzo Stoakes
[not found] ` <82b802e0-94fd-4cca-ad8f-ea2d85bcae64@kernel.org>
2024-08-08 15:52 ` Lorenzo Stoakes
2024-08-05 12:13 ` [PATCH 06/10] tools: add VMA merge tests Lorenzo Stoakes
2024-08-05 12:13 ` [PATCH 07/10] mm: avoid using vma_merge() for new VMAs Lorenzo Stoakes
2024-08-06 13:04 ` Petr Tesařík
2024-08-06 13:44 ` Lorenzo Stoakes
2024-08-08 16:45 ` Vlastimil Babka
2024-08-08 18:02 ` Lorenzo Stoakes
2024-08-08 18:34 ` Liam R. Howlett
2024-08-08 19:06 ` Liam R. Howlett
2024-08-09 10:14 ` Lorenzo Stoakes
2024-08-09 15:23 ` Liam R. Howlett
2024-08-09 17:20 ` Lorenzo Stoakes
2024-08-05 12:13 ` [PATCH 08/10] mm: introduce commit_merge(), abstracting merge operation Lorenzo Stoakes
2024-08-06 13:41 ` Petr Tesařík
2024-08-06 13:48 ` Lorenzo Stoakes
2024-08-06 14:13 ` Petr Tesařík
2024-08-06 14:30 ` Lorenzo Stoakes
2024-08-06 14:39 ` Petr Tesařík
2024-08-09 10:15 ` Vlastimil Babka
2024-08-09 10:53 ` Lorenzo Stoakes
2024-08-05 12:13 ` [PATCH 09/10] mm: refactor vma_merge() into modify-only vma_merge_modified() Lorenzo Stoakes
2024-08-06 13:42 ` Petr Tesařík
2024-08-06 13:52 ` Lorenzo Stoakes
2024-08-09 13:44 ` Vlastimil Babka
2024-08-09 13:57 ` Lorenzo Stoakes
2024-08-05 12:13 ` [PATCH 10/10] mm: rework vm_ops->close() handling on VMA merge Lorenzo Stoakes
2024-08-06 13:55 ` Petr Tesařík
2024-08-06 14:08 ` Lorenzo Stoakes
2024-08-06 14:21 ` Petr Tesařík
2024-08-06 14:42 ` Lorenzo Stoakes
2024-08-09 14:25 ` Vlastimil Babka
2024-08-09 14:37 ` 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=2d85f8a8-6937-499c-91fd-7dc5deced71f@lucifer.local \
--to=lorenzo.stoakes@oracle.com \
--cc=Liam.Howlett@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=vbabka@kernel.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