+{
- struct vfio_pci_dma_buf *priv = dmabuf->priv;
- int rc;
- rc = pci_p2pdma_distance_many(priv->vdev->pdev, &attachment->dev, 1,
true);
This should just use pci_p2pdma_distance.
- /*
* Since the memory being mapped is a device memory it could never be in
* CPU caches.
*/
DMA_ATTR_SKIP_CPU_SYNC doesn't even apply to dma_map_resource, not sure where this wisdom comes from.
- dma_addr = dma_map_resource(
attachment->dev,
pci_resource_start(priv->vdev->pdev, priv->index) +
priv->offset,
priv->dmabuf->size, dir, DMA_ATTR_SKIP_CPU_SYNC);
This is not how P2P addresses are mapped. You need to use dma_map_sgtable and have the proper pgmap for it.
The above is just a badly implemented version of the dma-direct PCI_P2PDMA_MAP_BUS_ADDR case, ignoring mappings through the host bridge or dma-map-ops interactions.