Re: [PATCH 0/2] NTB: Allow drivers to provide DMA mapping device
From: Dave Jiang
Date: Mon Mar 02 2026 - 12:09:03 EST
On 3/2/26 7:45 AM, Koichiro Den wrote:
> Some NTB implementations are backed by a "virtual" PCI device, while the
> actual DMA mapping context (IOMMU domain) belongs to a different device.
>
> One example is vNTB, where the NTB device is represented as a virtual
> PCI endpoint function, but DMA operations must be performed against the
> EPC parent device, which owns the IOMMU context.
>
> Today, ntb_transport implicitly relies on the NTB device's parent device
> as the DMA mapping device. This works for most PCIe NTB hardware, but
> breaks implementations where the NTB PCI function is not the correct
> device to use for DMA API operations.
Actually it doesn't quite work. This resulted in 061a785a114f ("ntb: Force
physically contiguous allocation of rx ring buffers"). As you can see it
tries to get around the issue as a temp measure. The main issue is the
memory window buffer is allocated before the dmaengine devices are allocated.
So the buffer is mapped against the NTB device rather than the DMA device.
So I think we may need to come up with a better scheme to clean up this
issue as some of the current NTBs can utilize this change as well.
The per queue DMA device presents an initialization hierarchy challenge with the
memory window context. I'm open to suggestions.
DJ
>
> This small series introduces an optional .get_dma_dev() callback in
> struct ntb_dev_ops, together with a helper ntb_get_dma_dev(). If the
> callback is not implemented, the helper falls back to the existing
> default behavior. Drivers that implement .get_dma_dev() must return a
> non-NULL struct device.
>
> - Patch 1/2: Add .get_dma_dev() to struct ntb_dev_ops and provide
> ntb_get_dma_dev().
>
> - Patch 2/2: Switch ntb_transport coherent allocations and frees to use
> ntb_get_dma_dev().
>
> No functional changes are intended by this series itself.
>
> A follow-up patch implementing .get_dma_dev() for the vNTB EPF driver
> (drivers/pci/endpoint/functions/pci-epf-vntb.c) will be submitted
> separately to the PCI Endpoint subsystem tree. That will enable
> ntb_transport to work correctly in IOMMU-backed EPC setups.
>
> Best regards,
> Koichiro
>
>
> Koichiro Den (2):
> NTB: core: Add .get_dma_dev() callback to ntb_dev_ops
> NTB: ntb_transport: Use ntb_get_dma_dev() for DMA buffers
>
> drivers/ntb/ntb_transport.c | 14 +++++++-------
> include/linux/ntb.h | 23 +++++++++++++++++++++++
> 2 files changed, 30 insertions(+), 7 deletions(-)
>