linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Peter Xu <peterx@redhat.com>
To: Jason Gunthorpe <jgg@nvidia.com>
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	kvm@vger.kernel.org, Andrew Morton <akpm@linux-foundation.org>,
	Alex Williamson <alex.williamson@redhat.com>,
	Zi Yan <ziy@nvidia.com>, Alex Mastro <amastro@fb.com>,
	David Hildenbrand <david@redhat.com>,
	Nico Pache <npache@redhat.com>
Subject: Re: [PATCH 5/5] vfio-pci: Best-effort huge pfnmaps with !MAP_FIXED mappings
Date: Fri, 13 Jun 2025 15:15:19 -0400	[thread overview]
Message-ID: <aEx4x_tvXzgrIanl@x1.local> (raw)
In-Reply-To: <20250613160956.GN1174925@nvidia.com>

On Fri, Jun 13, 2025 at 01:09:56PM -0300, Jason Gunthorpe wrote:
> On Fri, Jun 13, 2025 at 11:26:40AM -0400, Peter Xu wrote:
> > On Fri, Jun 13, 2025 at 11:29:03AM -0300, Jason Gunthorpe wrote:
> > > On Fri, Jun 13, 2025 at 09:41:11AM -0400, Peter Xu wrote:
> > > 
> > > > +	/* Choose the alignment */
> > > > +	if (IS_ENABLED(CONFIG_ARCH_SUPPORTS_PUD_PFNMAP) && phys_len >= PUD_SIZE) {
> > > > +		ret = mm_get_unmapped_area_aligned(file, addr, len, phys_addr,
> > > > +						   flags, PUD_SIZE, 0);
> > > > +		if (ret)
> > > > +			return ret;
> > > > +	}
> > > > +
> > > > +	if (phys_len >= PMD_SIZE) {
> > > > +		ret = mm_get_unmapped_area_aligned(file, addr, len, phys_addr,
> > > > +						   flags, PMD_SIZE, 0);
> > > > +		if (ret)
> > > > +			return ret;
> > > > +	}
> > > 
> > > Hurm, we have contiguous pages now, so PMD_SIZE is not so great, eg on
> > > 4k ARM with we can have a 16*2M=32MB contiguity, and 16k ARM uses
> > > contiguity to get a 32*16k=1GB option.
> > > 
> > > Forcing to only align to the PMD or PUD seems suboptimal..
> > 
> > Right, however the cont-pte / cont-pmd are still not supported in huge
> > pfnmaps in general?  It'll definitely be nice if someone could look at that
> > from ARM perspective, then provide support of both in one shot.
> 
> Maybe leave behind a comment about this. I've been poking around if
> somone would do the ARM PFNMAP support but can't report any commitment.

I didn't know what's the best part to take a note for the whole pfnmap
effort, but I added a note into the commit message on this patch:

        Note 2: Currently continuous pgtable entries (for example, cont-pte) is not
        yet supported for huge pfnmaps in general.  It also is not considered in
        this patch so far.  Separate work will be needed to enable continuous
        pgtable entries on archs that support it.

> 
> > > > +fallback:
> > > > +	return mm_get_unmapped_area(current->mm, file, addr, len, pgoff, flags);
> > > 
> > > Why not put this into mm_get_unmapped_area_vmflags() and get rid of
> > > thp_get_unmapped_area_vmflags() too?
> > > 
> > > Is there any reason the caller should have to do a retry?
> > 
> > We would still need thp_get_unmapped_area_vmflags() because that encodes
> > PMD_SIZE for THPs; we need the flexibility of providing any size alignment
> > as a generic helper.
> 
> There is only one caller for thp_get_unmapped_area_vmflags(), just
> open code PMD_SIZE there and thin this whole thing out. It reads
> better like that anyhow:
> 
> 	} else if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && !file
> 		   && !addr /* no hint */
> 		   && IS_ALIGNED(len, PMD_SIZE)) {
> 		/* Ensures that larger anonymous mappings are THP aligned. */
> 		addr = mm_get_unmapped_area_aligned(file, 0, len, pgoff,
> 						    flags, vm_flags, PMD_SIZE);
> 
> > That was ok, however that loses some flexibility when the caller wants to
> > try with different alignments, exactly like above: currently, it was trying
> > to do a first attempt of PUD mapping then fallback to PMD if that fails.
> 
> Oh, that's a good point, I didn't notice that subtle bit.
> 
> But then maybe that is showing the API is just wrong and the core code
> should be trying to find the best alignment not the caller. Like we
> can have those PUD/PMD size ifdefs inside the mm instead of in VFIO?
> 
> VFIO would just pass the BAR size, implying the best alignment, and
> the core implementation will try to get the largest VMA alignment that
> snaps to an arch supported page contiguity, testing each of the arches
> page size possibilities in turn.
> 
> That sounds like a much better API than pushing this into drivers??

Yes it would be nice if the core mm can evolve to make supporting such
easier.  Though the question is how to pass information over to core mm.

For example, currently a vfio device file represents the whole device, and
it's also VFIO that defines what the MMIO region offsets means. So core mm
has no simple idea which BAR VFIO is mapping if it only receives a mmap()
request.  So even if we assume the core mm provides some vma flag showing
that, it won't be per-vma, but need to be case by case of the mmap()
request at least relevant to pgoff and len being mapped.

And it's definitely the case that for one device its BAR sizes are
different, hence it asks for different alignments when mmap() even if on
the same device fd.

It's similar to many other use cases of get_unmapped_area() users.  For
example, see v4l2_m2m_get_unmapped_area() which has similar treatment on at
least knowing which part of the file was being mapped:

	if (offset < DST_QUEUE_OFF_BASE) {
		vq = v4l2_m2m_get_src_vq(fh->m2m_ctx);
	} else {
		vq = v4l2_m2m_get_dst_vq(fh->m2m_ctx);
		pgoff -= (DST_QUEUE_OFF_BASE >> PAGE_SHIFT);
	}

Such flexibility might still be needed for now until we know how to provide
the abstraction.

Meanwhile, there can be other constraints to existing get_unmapped_area()
users that a decision might be done with any parameter passed into it
besides the pgoff.. so even if we provide the whole pgoff info, it might
not be enough.

-- 
Peter Xu


  reply	other threads:[~2025-06-13 19:15 UTC|newest]

Thread overview: 77+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-13 13:41 [PATCH 0/5] mm/vfio: huge pfnmaps with !MAP_FIXED mappings Peter Xu
2025-06-13 13:41 ` [PATCH 1/5] mm: Deduplicate mm_get_unmapped_area() Peter Xu
2025-06-13 14:12   ` Jason Gunthorpe
2025-06-13 14:55   ` Oscar Salvador
2025-06-13 14:58   ` Zi Yan
2025-06-13 15:57   ` Lorenzo Stoakes
2025-06-13 17:00     ` Pedro Falcato
2025-06-13 18:00   ` David Hildenbrand
2025-06-16  8:01   ` David Laight
2025-06-17 21:13     ` Peter Xu
2025-06-13 13:41 ` [PATCH 2/5] mm/hugetlb: Remove prepare_hugepage_range() Peter Xu
2025-06-13 14:12   ` Jason Gunthorpe
2025-06-13 14:59   ` Oscar Salvador
2025-06-13 15:13   ` Zi Yan
2025-06-13 16:24     ` Peter Xu
2025-06-13 18:01       ` David Hildenbrand
2025-06-14  4:11   ` Liam R. Howlett
2025-06-17 21:07     ` Peter Xu
2025-06-13 13:41 ` [PATCH 3/5] mm: Rename __thp_get_unmapped_area to mm_get_unmapped_area_aligned Peter Xu
2025-06-13 14:17   ` Jason Gunthorpe
2025-06-13 15:13     ` Peter Xu
2025-06-13 16:00       ` Jason Gunthorpe
2025-06-13 18:31         ` Peter Xu
2025-06-13 15:19   ` Zi Yan
2025-06-13 18:33     ` Peter Xu
2025-06-13 15:36   ` Lorenzo Stoakes
2025-06-13 18:45     ` Peter Xu
2025-06-13 19:18       ` Lorenzo Stoakes
2025-06-13 20:34         ` Peter Xu
2025-06-14  5:58           ` Lorenzo Stoakes
2025-06-14  5:23   ` Liam R. Howlett
2025-06-16 12:14     ` Jason Gunthorpe
2025-06-16 12:20       ` Lorenzo Stoakes
2025-06-16 12:26         ` Jason Gunthorpe
2025-06-13 13:41 ` [PATCH 4/5] vfio: Introduce vfio_device_ops.get_unmapped_area hook Peter Xu
2025-06-13 14:18   ` Jason Gunthorpe
2025-06-13 18:03   ` David Hildenbrand
2025-06-14 14:46   ` kernel test robot
2025-06-17 15:39     ` Peter Xu
2025-06-17 15:41       ` Jason Gunthorpe
2025-06-17 16:47         ` Peter Xu
2025-06-17 19:39           ` Peter Xu
2025-06-17 19:46             ` Jason Gunthorpe
2025-06-17 20:01               ` Peter Xu
2025-06-17 23:00                 ` Jason Gunthorpe
2025-06-17 23:26                   ` Peter Xu
2025-06-13 13:41 ` [PATCH 5/5] vfio-pci: Best-effort huge pfnmaps with !MAP_FIXED mappings Peter Xu
2025-06-13 14:29   ` Jason Gunthorpe
2025-06-13 15:26     ` Peter Xu
2025-06-13 16:09       ` Jason Gunthorpe
2025-06-13 19:15         ` Peter Xu [this message]
2025-06-13 23:16           ` Jason Gunthorpe
2025-06-16 22:06             ` Peter Xu
2025-06-16 23:00               ` Jason Gunthorpe
2025-06-17 20:56                 ` Peter Xu
2025-06-17 23:18                   ` Jason Gunthorpe
2025-06-17 23:36                     ` Peter Xu
2025-06-18 16:56                       ` Peter Xu
2025-06-18 17:46                         ` Jason Gunthorpe
2025-06-18 19:15                           ` Peter Xu
2025-06-19 13:58                             ` Jason Gunthorpe
2025-06-19 14:55                               ` Peter Xu
2025-06-19 18:40                                 ` Jason Gunthorpe
2025-06-24 20:37                                   ` Peter Xu
2025-06-24 20:51                                     ` Peter Xu
2025-06-24 23:40                                     ` Jason Gunthorpe
2025-06-25  0:48                                       ` Peter Xu
2025-06-25 13:07                                         ` Jason Gunthorpe
2025-06-25 17:12                                           ` Peter Xu
2025-06-25 18:41                                             ` Jason Gunthorpe
2025-06-25 19:26                                               ` Peter Xu
2025-06-30 14:05                                                 ` Jason Gunthorpe
2025-07-02 20:58                                                   ` Peter Xu
2025-07-02 23:32                                                     ` Jason Gunthorpe
2025-06-13 18:09   ` David Hildenbrand
2025-06-13 19:21     ` Peter Xu
     [not found]   ` <20250613174442.1589882-1-amastro@fb.com>
2025-06-13 18:53     ` Peter Xu

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=aEx4x_tvXzgrIanl@x1.local \
    --to=peterx@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=alex.williamson@redhat.com \
    --cc=amastro@fb.com \
    --cc=david@redhat.com \
    --cc=jgg@nvidia.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=npache@redhat.com \
    --cc=ziy@nvidia.com \
    /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;
as well as URLs for NNTP newsgroup(s).