diff mbox series

[SRU,J:linux-bluefield,v1,5/6] UBUNTU: SAUCE: vfio/pci: Fix p2p address

Message ID 20240826182938.1945684-6-witu@nvidia.com
State New
Headers show
Series Add VFIO P2P support | expand

Commit Message

William Tu Aug. 26, 2024, 6:29 p.m. UTC
From: Sergey Gorenko <sergeygo@nvidia.com>

BugLink: https://bugs.launchpad.net/bugs/2077887

Use pci_bus_address instead of pci_resource_start. Bus address must
be used for P2PDMA operations. It is simple for x86_64 because bus
address is equal to PA. However, bus address is not equal to PA for
ARM (at least for BF, I did not tested the other ARM platforms.).
That's why pci_resource_start() work fine on x86_64 and we had to
replace it to pci_bus_address() on ARM.

Co-authored-by: William Tu <witu@nvidia.com>
Signed-off-by: Sergey Gorenko <sergeygo@nvidia.com>
Signed-off-by: William Tu <witu@nvidia.com>
---
 drivers/vfio/pci/dma_buf.c       | 10 ++++------
 drivers/vfio/pci/vfio_pci_core.c |  4 +++-
 2 files changed, 7 insertions(+), 7 deletions(-)
diff mbox series

Patch

diff --git a/drivers/vfio/pci/dma_buf.c b/drivers/vfio/pci/dma_buf.c
index 11396aeabff4..367fe7077ebf 100644
--- a/drivers/vfio/pci/dma_buf.c
+++ b/drivers/vfio/pci/dma_buf.c
@@ -4,6 +4,9 @@ 
 #include <linux/dma-buf.h>
 #include <linux/pci-p2pdma.h>
 #include <linux/dma-resv.h>
+#include <linux/module.h>
+#include <uapi/linux/vfio.h>
+#include <linux/vfio_pci_core.h>
 
 #include "vfio_pci_priv.h"
 
@@ -81,7 +84,7 @@  vfio_pci_dma_buf_map(struct dma_buf_attachment *attachment,
 	 */
 	dma_addr = dma_map_resource(
 		attachment->dev,
-		pci_resource_start(priv->vdev->pdev, priv->index) +
+		pci_bus_address(priv->vdev->pdev, priv->index) +
 			priv->offset,
 		priv->dmabuf->size, dir, DMA_ATTR_SKIP_CPU_SYNC);
 	ret = dma_mapping_error(attachment->dev, dma_addr);
@@ -167,11 +170,6 @@  int vfio_pci_core_feature_dma_buf(struct vfio_pci_core_device *vdev, u32 flags,
 	struct vfio_pci_dma_buf *priv;
 	int ret;
 
-	ret = vfio_check_feature(flags, argsz, VFIO_DEVICE_FEATURE_GET,
-				 sizeof(get_dma_buf));
-	if (ret != 1)
-		return ret;
-
 	if (copy_from_user(&get_dma_buf, arg, sizeof(get_dma_buf)))
 		return -EFAULT;
 
diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c
index 4017512f6736..6c4c96fc5c54 100644
--- a/drivers/vfio/pci/vfio_pci_core.c
+++ b/drivers/vfio/pci/vfio_pci_core.c
@@ -1196,7 +1196,9 @@  long vfio_pci_core_ioctl(struct vfio_device *core_vdev, unsigned int cmd,
 
 			return 0;
 		case VFIO_DEVICE_FEATURE_DMA_BUF:
-			return vfio_pci_core_feature_dma_buf(vdev, flags, arg, argsz);
+			return vfio_pci_core_feature_dma_buf(vdev, feature.flags,
+							     (void __user *)(arg + minsz),
+							     feature.argsz);
 		default:
 			return -ENOTTY;
 		}