Skip to content

vfio/pci: Allow MMIO regions to be exported through dma-buf

Leon Romanovsky dri-devel kvm linux-block linux-iommu linux-media linux-mm linux-pci lkml 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 Latest10 patches 43 repliesIn review

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/10PCI/P2PDMA: Remove redundant bus_offset from map statedrivers/pci/p2pdma.c include/linux/pci-p2pdma.h+1 -31 reply
2/10PCI/P2PDMA: Introduce p2pdma_provider structure for cleaner abstractiondrivers/pci/p2pdma.c include/linux/pci-p2pdma.h+37 -2311 replies
3/10PCI/P2PDMA: Simplify bus address mapping APIblock/blk-mq-dma.c drivers/iommu/dma-iommu.c include/linux/pci-p2pdma.h +2 more+9 -101 reply
4/10PCI/P2PDMA: Refactor to separate core P2P functionality from memory allocationdrivers/pci/p2pdma.c include/linux/pci-p2pdma.h+80 -330 replies
5/10PCI/P2PDMA: Export pci_p2pdma_map_type() functiondrivers/pci/p2pdma.c include/linux/pci-p2pdma.h+59 -4117 replies
6/10types: move phys_vec definition to common headerblock/blk-mq-dma.c include/linux/types.h+5 -50 replies
7/10vfio: Export vfio device get and put registration helpersdrivers/vfio/vfio_main.c include/linux/vfio.h+4 -00 replies
8/10vfio/pci: Enable peer-to-peer DMA transactions by defaultdrivers/vfio/pci/vfio_pci_core.c include/linux/vfio_pci_core.h+5 -00 replies
9/10vfio/pci: Share the core device pointer while invoking feature functionsdrivers/vfio/pci/vfio_pci_core.c+13 -172 replies
10/10vfio/pci: Add dma-buf export support for MMIO regionsdrivers/vfio/pci/Kconfig drivers/vfio/pci/Makefile drivers/vfio/pci/vfio_pci_config.c +6 more+431 -59 replies

Reviews trailers per patch

1 of 10 patches has a Reviewed-by or Acked-by.

PatchChristoph Hellwig
1/10R-b
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.

Read the v1 thread

Cover letter [PATCH 00/10] vfio/pci: Allow MMIO regions to be exported through dma-buf

From: Leon Romanovsky <[email protected]>

---------------------------------------------------------------------------
Based on blk and DMA patches which will be sent during coming merge window.
---------------------------------------------------------------------------

This series extends the VFIO PCI subsystem to support exporting MMIO regions from PCI device BARs as dma-buf objects, enabling safe sharing of non-struct page memory with controlled lifetime management. This allows RDMA and other subsystems to import dma-buf FDs and build them into memory regions for PCI P2P operations.

The series supports a use case for SPDK where a NVMe device will be owned by SPDK through VFIO but interacting with a RDMA device. The RDMA device may directly access the NVMe CMB or directly manipulate the NVMe device's doorbell using PCI P2P.

However, as a general mechanism, it can support many other scenarios with VFIO. This dmabuf approach can be usable by iommufd as well for generic and safe P2P mappings.

In addition to the SPDK use-case mentioned above, the capability added in this patch series can also be useful when a buffer (located in device memory such as VRAM) needs to be shared between any two dGPU devices or instances (assuming one of them is bound to VFIO PCI) as long as they are P2P DMA compatible.

The implementation provides a revocable attachment mechanism using dma-buf move operations. MMIO regions are normally pinned as BARs don't change physical addresses, but access is revoked when the VFIO device is closed or a PCI reset is issued. This ensures kernel self-defense against potentially hostile userspace.

The series includes significant refactoring of the PCI P2PDMA subsystem to separate core P2P functionality from memory allocation features, making it more modular and suitable for VFIO use cases that don't need struct page support.

-----------------------------------------------------------------------
This is based on
https://lore.kernel.org/all/[email protected]/
but heavily rewritten to be based on DMA physical API.
-----------------------------------------------------------------------
The WIP branch can be found here:
https://git.kernel.org/pub/scm/linux/kernel/git/leon/linux-rdma.git/log/?h=dmabuf-vfio

Thanks

Leon Romanovsky (8):
PCI/P2PDMA: Remove redundant bus_offset from map state PCI/P2PDMA: Introduce p2pdma_provider structure for cleaner
abstraction
PCI/P2PDMA: Simplify bus address mapping API
PCI/P2PDMA: Refactor to separate core P2P functionality from memory
allocation
PCI/P2PDMA: Export pci_p2pdma_map_type() function
types: move phys_vec definition to common header vfio/pci: Enable peer-to-peer DMA transactions by default vfio/pci: Add dma-buf export support for MMIO regions

Vivek Kasireddy (2):
vfio: Export vfio device get and put registration helpers vfio/pci: Share the core device pointer while invoking feature
functions

 block/blk-mq-dma.c                 |   7 +-
 drivers/iommu/dma-iommu.c          |   4 +-
 drivers/pci/p2pdma.c               | 144 +++++++++----
 drivers/vfio/pci/Kconfig           |  20 ++
 drivers/vfio/pci/Makefile          |   2 +
 drivers/vfio/pci/vfio_pci_config.c |  22 +-
 drivers/vfio/pci/vfio_pci_core.c   |  59 ++++--
 drivers/vfio/pci/vfio_pci_dmabuf.c | 321 +++++++++++++++++++++++++++++
 drivers/vfio/pci/vfio_pci_priv.h   |  23 +++
 drivers/vfio/vfio_main.c           |   2 +
 include/linux/dma-buf.h            |   1 +
 include/linux/pci-p2pdma.h         | 114 +++++-----
 include/linux/types.h              |   5 +
 include/linux/vfio.h               |   2 +
 include/linux/vfio_pci_core.h      |   4 +
 include/uapi/linux/vfio.h          |  19 ++
 kernel/dma/direct.c                |   4 +-
 mm/hmm.c                           |   2 +-
 18 files changed, 631 insertions(+), 124 deletions(-)
 create mode 100644 drivers/vfio/pci/vfio_pci_dmabuf.c
Signature · 1 line
2.50.1