vfio/mdev: Pass in a struct vfio_device * to vfio_dma_rw()
Every caller has a readily available vfio_device pointer, use that instead of passing in a generic struct device. Change vfio_dma_rw() to take in the struct vfio_device and move the container users that would have been held by vfio_group_get_external_user_from_dev() to vfio_dma_rw() directly, like vfio_pin/unpin_pages(). Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> Link: https://lore.kernel.org/r/4-v4-8045e76bf00b+13d-vfio_mdev_no_group_jgg@nvidia.com Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
Родитель
8e432bb015
Коммит
c6250ffbac
|
@ -732,7 +732,7 @@ static inline int intel_gvt_read_gpa(struct intel_vgpu *vgpu, unsigned long gpa,
|
|||
{
|
||||
if (!vgpu->attached)
|
||||
return -ESRCH;
|
||||
return vfio_dma_rw(vgpu->vfio_group, gpa, buf, len, false);
|
||||
return vfio_dma_rw(&vgpu->vfio_device, gpa, buf, len, false);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -750,7 +750,7 @@ static inline int intel_gvt_write_gpa(struct intel_vgpu *vgpu,
|
|||
{
|
||||
if (!vgpu->attached)
|
||||
return -ESRCH;
|
||||
return vfio_dma_rw(vgpu->vfio_group, gpa, buf, len, true);
|
||||
return vfio_dma_rw(&vgpu->vfio_device, gpa, buf, len, true);
|
||||
}
|
||||
|
||||
void intel_gvt_debugfs_remove_vgpu(struct intel_vgpu *vgpu);
|
||||
|
|
|
@ -2323,32 +2323,28 @@ EXPORT_SYMBOL(vfio_group_unpin_pages);
|
|||
* As the read/write of user space memory is conducted via the CPUs and is
|
||||
* not a real device DMA, it is not necessary to pin the user space memory.
|
||||
*
|
||||
* The caller needs to call vfio_group_get_external_user() or
|
||||
* vfio_group_get_external_user_from_dev() prior to calling this interface,
|
||||
* so as to prevent the VFIO group from disposal in the middle of the call.
|
||||
* But it can keep the reference to the VFIO group for several calls into
|
||||
* this interface.
|
||||
* After finishing using of the VFIO group, the caller needs to release the
|
||||
* VFIO group by calling vfio_group_put_external_user().
|
||||
*
|
||||
* @group [in] : VFIO group
|
||||
* @device [in] : VFIO device
|
||||
* @user_iova [in] : base IOVA of a user space buffer
|
||||
* @data [in] : pointer to kernel buffer
|
||||
* @len [in] : kernel buffer length
|
||||
* @write : indicate read or write
|
||||
* Return error code on failure or 0 on success.
|
||||
*/
|
||||
int vfio_dma_rw(struct vfio_group *group, dma_addr_t user_iova,
|
||||
void *data, size_t len, bool write)
|
||||
int vfio_dma_rw(struct vfio_device *device, dma_addr_t user_iova, void *data,
|
||||
size_t len, bool write)
|
||||
{
|
||||
struct vfio_container *container;
|
||||
struct vfio_iommu_driver *driver;
|
||||
int ret = 0;
|
||||
|
||||
if (!group || !data || len <= 0)
|
||||
if (!data || len <= 0)
|
||||
return -EINVAL;
|
||||
|
||||
container = group->container;
|
||||
ret = vfio_group_add_container_user(device->group);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
container = device->group->container;
|
||||
driver = container->iommu_driver;
|
||||
|
||||
if (likely(driver && driver->ops->dma_rw))
|
||||
|
@ -2357,6 +2353,8 @@ int vfio_dma_rw(struct vfio_group *group, dma_addr_t user_iova,
|
|||
else
|
||||
ret = -ENOTTY;
|
||||
|
||||
vfio_group_try_dissolve_container(device->group);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(vfio_dma_rw);
|
||||
|
|
|
@ -161,7 +161,7 @@ extern int vfio_group_pin_pages(struct vfio_group *group,
|
|||
extern int vfio_group_unpin_pages(struct vfio_group *group,
|
||||
unsigned long *user_iova_pfn, int npage);
|
||||
|
||||
extern int vfio_dma_rw(struct vfio_group *group, dma_addr_t user_iova,
|
||||
extern int vfio_dma_rw(struct vfio_device *device, dma_addr_t user_iova,
|
||||
void *data, size_t len, bool write);
|
||||
|
||||
extern struct iommu_domain *vfio_group_iommu_domain(struct vfio_group *group);
|
||||
|
|
Загрузка…
Ссылка в новой задаче