Re: [PATCH 5/7] io_uring: rsrc: use FOLL_SAME_FILE on pin_user_pages()

From: Pavel Begunkov
Date: Tue Apr 18 2023 - 13:26:29 EST


On 4/18/23 17:36, Jason Gunthorpe wrote:
On Tue, Apr 18, 2023 at 05:25:08PM +0100, Pavel Begunkov wrote:
On 4/17/23 13:56, Jason Gunthorpe wrote:
On Sat, Apr 15, 2023 at 12:27:45AM +0100, Lorenzo Stoakes wrote:
Commit edd478269640 ("io_uring/rsrc: disallow multi-source reg buffers")
prevents io_pin_pages() from pinning pages spanning multiple VMAs with
permitted characteristics (anon/huge), requiring that all VMAs share the
same vm_file.

That commmit doesn't really explain why io_uring is doing such a weird
thing.

What exactly is the problem with mixing struct pages from different
files and why of all the GUP users does only io_uring need to care
about this?

Simply because it doesn't seem sane to mix and register buffers of
different "nature" as one.

That is not a good reason. Once things are converted to struct pages
they don't need to care about their "nature"

Arguing purely about uapi, I do think it is. Even though it can be
passed down and a page is a page, Frankenstein's Monster mixing anon
pages, pages for io_uring queues, device shared memory, and what not
else doesn't seem right for uapi. I see keeping buffers as a single
entity in opposite to a set of random pages beneficial for the future.

And again, as for how it's internally done, I don't have any preference
whatsoever.

problem. We've been asked just recently to allow registering bufs
provided mapped by some specific driver, or there might be DMA mapped
memory in the future.

We already have GUP flags to deal with it, eg FOLL_PCI_P2PDMA

Rejecting based on vmas might be too conservative, I agree and am all
for if someone can help to make it right.

It is GUP's problem to deal with this, not the callers.

Ok, that's even better for io_uring if the same can be achieved
just by passing flags.


GUP is defined to return a list of normal CPU DRAM in struct page
format. The caller doesn't care where or what this memory is, it is
all interchangable - by API contract of GUP itself.

If you use FOLL_PCI_P2PDMA then the definition expands to allow struct
pages that are MMIO.

In future, if someone invents new memory or new struct pages with
special needs it is their job to ensure it is blocked from GUP - for
*everyone*. eg how the PCI_P2PDMA was blocked from normal GUP.

io_uring is not special, there are many users of GUP, they all need to
work consistently.

--
Pavel Begunkov