This series adds TLP Processing Hints (TPH) support to the VFIO dma-buf
export path, allowing importing drivers (e.g. mlx5) to use the exporter's
steering tag when performing peer-to-peer DMA into a VFIO-owned device.
Patch 1 adds the dma-buf get_tph callback and the new vfio uAPI.
Patch 2 wires up the mlx5 RDMA driver as a consumer.
Changes since v2:
- uAPI now carries both the 8-bit ST and 16-bit Extended ST values,
gated by a flags field, because the two are distinct namespaces in
the PCIe TPH ST table and a numeric range check on a single value
cannot pick the right one.
- Add pcie_tph_get_st_width() in <linux/pci-tph.h> so mlx5 doesn't
dereference pci_dev::tph_req_type directly.
- Validate that the TLP Processing Hint fits in the 2-bit spec field
in VFIO_DEVICE_FEATURE_DMA_BUF_TPH; previously an out-of-range
userspace value would be stored unchecked.
- Publish/consume ordering for the TPH metadata: writers store the
flags last with smp_store_release() under memory_lock; readers run
lockless with smp_load_acquire() on the flags. This avoids an
unprotected read in get_tph() and removes the AB-BA risk that
would appear if the reader took memory_lock while an importer held
dma_resv_lock.
- Convert vfio_pci_dma_buf::revoked from a bitfield to bool to
eliminate the cross-lock RMW on a shared bitfield byte (revoked is
written under dma_resv_lock; the new TPH fields are written under
memory_lock).
- mlx5 reuses the dma_buf pointer that the umem already resolved
instead of calling dma_buf_get(fd) a second time, closing a TOCTOU
where a concurrent dup2() could substitute a different dma_buf
between umem creation and the TPH lookup.
- mlx5 now tracks per-MR ownership of the allocated steering-tag
index (dmabuf_st_index / dmabuf_st_owned on mlx5_ib_mr) and frees
it both when the firmware mkey is destroyed and when the MR is
revoked-and-recycled into the FRMR pool.
Previous link:
v2: https://lore.kernel.org/linux-pci/[email protected]/
Zhiping Zhang (2):
vfio: add dma-buf get_tph callback and DMA_BUF_TPH feature
RDMA/mlx5: get tph for p2p access when registering dma-buf mr
drivers/infiniband/hw/mlx5/mlx5_ib.h | 6 +
drivers/infiniband/hw/mlx5/mr.c | 72 ++++++++++-
.../net/ethernet/mellanox/mlx5/core/lib/st.c | 27 +++--
drivers/pci/tph.c | 20 ++++
drivers/vfio/pci/vfio_pci_core.c | 3 +
drivers/vfio/pci/vfio_pci_dmabuf.c | 113 +++++++++++++++++-
drivers/vfio/pci/vfio_pci_priv.h | 11 ++
include/linux/dma-buf.h | 21 ++++
include/linux/mlx5/driver.h | 7 ++
include/linux/pci-tph.h | 2 +
include/uapi/linux/vfio.h | 35 ++++++
11 files changed, 306 insertions(+), 11 deletions(-)
--
2.52.0