@@ -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;
@@ -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;
}