Re: [RFC PATCH v1 5/8] nfs: tag READ/WRITE RPCs carrying P2PDMA pages
From: Pranjal Shrivastava
Date: Tue Oct 27 2026 - 08:05:35 EST
On Mon, Oct 12, 2026 at 10:10:20AM +0300, Leon Romanovsky wrote:
> On Tue, Oct 06, 2026 at 11:32:45PM +0000, Pranjal Shrivastava wrote:
> > A transport must know when an RPC's payload pages are P2PDMA memory,
> > so it can move them by DMA or refuse the RPC.
> >
> > Check each page as nfs_generic_pgio() builds the page array, and
> > record the result in nfs_pgio_args. The READ and WRITE encoders of
> > every NFS version then set XDRBUF_P2PDMA on the buffer holding the
> > payload.
> >
> > Additionally, avoid using READ_PLUS when the pages are P2PDMA memory.
> >
> > Signed-off-by: Pranjal Shrivastava <praan@xxxxxxxxxx>
> > ---
> > fs/nfs/nfs2xdr.c | 4 ++++
> > fs/nfs/nfs3xdr.c | 4 ++++
> > fs/nfs/nfs4proc.c | 3 +++
> > fs/nfs/nfs4xdr.c | 4 ++++
> > fs/nfs/pagelist.c | 2 ++
> > include/linux/nfs_xdr.h | 1 +
> > 6 files changed, 18 insertions(+)
>
> <...>
>
> > +++ b/fs/nfs/pagelist.c
> > @@ -970,6 +970,8 @@ int nfs_generic_pgio(struct nfs_pageio_descriptor *desc,
> > if (pageused > pagecount)
> > goto full;
> > *pages++ = last_page = page;
> > + if (is_pci_p2pdma_page(page))
> > + hdr->args.p2pdma = true;
>
> Should we allow wider use of is_pci_p2pdma_page()? Does NFS require
> `struct page`?
>
Hi Leon,
Yes. NFS O_DIRECT is page based today, and the Direct I/O series [1]
just moved it from get_page() references to FOLL_PIN pins through
iov_iter_extract_pages(), which is what DMA into user pages requires.
This series lets P2PDMA pages through the existing path, and
is_pci_p2pdma_page() is how NFS tells which RPCs carry them, the same
way the block layer does for bios.
I'm aware of Pavel's dma-buf I/O work [2], which Jens has queued for
7.4. The hook is a file operation, but the only implementation so far
is the raw block device on NVMe, where the block driver owns the
dma-buf mapping. It's also exposed through io_uring registered
buffers, while this series serves plain O_DIRECT on user buffers.
Since NFS isn't block based & its I/O goes via SUNRPC to the transport,
taking a dma-buf map instead of pages would mean reworking the NFS I/O
path end to end, which is a large + separate effort that I'm happy
to look into after this series.
Thanks,
Praan
[1] https://lore.kernel.org/all/20260814143255.861084-1-praan@xxxxxxxxxx/
[2] https://lore.kernel.org/all/cover.1791975048.git.asml.silence@xxxxxxxxx/