fput(group->opened_file);
}
-int vfio_container_pin_pages(struct vfio_container *container,
- struct iommu_group *iommu_group, dma_addr_t iova,
- int npage, int prot, struct page **pages)
+int vfio_device_container_pin_pages(struct vfio_device *device,
+ dma_addr_t iova, int npage,
+ int prot, struct page **pages)
{
+ struct vfio_container *container = device->group->container;
+ struct iommu_group *iommu_group = device->group->iommu_group;
struct vfio_iommu_driver *driver = container->iommu_driver;
if (npage > VFIO_PIN_PAGES_MAX_ENTRIES)
npage, prot, pages);
}
-void vfio_container_unpin_pages(struct vfio_container *container,
- dma_addr_t iova, int npage)
+void vfio_device_container_unpin_pages(struct vfio_device *device,
+ dma_addr_t iova, int npage)
{
+ struct vfio_container *container = device->group->container;
+
if (WARN_ON(npage <= 0 || npage > VFIO_PIN_PAGES_MAX_ENTRIES))
return;
npage);
}
-int vfio_container_dma_rw(struct vfio_container *container, dma_addr_t iova,
- void *data, size_t len, bool write)
+int vfio_device_container_dma_rw(struct vfio_device *device,
+ dma_addr_t iova, void *data,
+ size_t len, bool write)
{
+ struct vfio_container *container = device->group->container;
struct vfio_iommu_driver *driver = container->iommu_driver;
if (unlikely(!driver || !driver->ops->dma_rw))
void vfio_group_detach_container(struct vfio_group *group);
void vfio_device_container_register(struct vfio_device *device);
void vfio_device_container_unregister(struct vfio_device *device);
-int vfio_container_pin_pages(struct vfio_container *container,
- struct iommu_group *iommu_group, dma_addr_t iova,
- int npage, int prot, struct page **pages);
-void vfio_container_unpin_pages(struct vfio_container *container,
- dma_addr_t iova, int npage);
-int vfio_container_dma_rw(struct vfio_container *container, dma_addr_t iova,
- void *data, size_t len, bool write);
+int vfio_device_container_pin_pages(struct vfio_device *device,
+ dma_addr_t iova, int npage,
+ int prot, struct page **pages);
+void vfio_device_container_unpin_pages(struct vfio_device *device,
+ dma_addr_t iova, int npage);
+int vfio_device_container_dma_rw(struct vfio_device *device,
+ dma_addr_t iova, void *data,
+ size_t len, bool write);
int __init vfio_container_init(void);
void vfio_container_cleanup(void);
{
}
-static inline int vfio_container_pin_pages(struct vfio_container *container,
- struct iommu_group *iommu_group,
- dma_addr_t iova, int npage, int prot,
- struct page **pages)
+static inline int vfio_device_container_pin_pages(struct vfio_device *device,
+ dma_addr_t iova, int npage,
+ int prot, struct page **pages)
{
return -EOPNOTSUPP;
}
-static inline void vfio_container_unpin_pages(struct vfio_container *container,
- dma_addr_t iova, int npage)
+static inline void vfio_device_container_unpin_pages(struct vfio_device *device,
+ dma_addr_t iova, int npage)
{
}
-static inline int vfio_container_dma_rw(struct vfio_container *container,
- dma_addr_t iova, void *data, size_t len,
- bool write)
+static inline int vfio_device_container_dma_rw(struct vfio_device *device,
+ dma_addr_t iova, void *data,
+ size_t len, bool write)
{
return -EOPNOTSUPP;
}
}
EXPORT_SYMBOL(vfio_set_irqs_validate_and_prepare);
+static bool vfio_device_has_container(struct vfio_device *device)
+{
+ return device->group->container;
+}
+
/*
* Pin contiguous user pages and return their associated host pages for local
* domain only.
* Return error or number of pages pinned.
*
* A driver may only call this function if the vfio_device was created
- * by vfio_register_emulated_iommu_dev() due to vfio_container_pin_pages().
+ * by vfio_register_emulated_iommu_dev() due to vfio_device_container_pin_pages().
*/
int vfio_pin_pages(struct vfio_device *device, dma_addr_t iova,
int npage, int prot, struct page **pages)
/* group->container cannot change while a vfio device is open */
if (!pages || !npage || WARN_ON(!vfio_assert_device_open(device)))
return -EINVAL;
- if (device->group->container)
- return vfio_container_pin_pages(device->group->container,
- device->group->iommu_group,
- iova, npage, prot, pages);
+ if (vfio_device_has_container(device))
+ return vfio_device_container_pin_pages(device, iova,
+ npage, prot, pages);
if (device->iommufd_access) {
int ret;
if (WARN_ON(!vfio_assert_device_open(device)))
return;
- if (device->group->container) {
- vfio_container_unpin_pages(device->group->container, iova,
- npage);
+ if (vfio_device_has_container(device)) {
+ vfio_device_container_unpin_pages(device, iova, npage);
return;
}
if (device->iommufd_access) {
if (!data || len <= 0 || !vfio_assert_device_open(device))
return -EINVAL;
- if (device->group->container)
- return vfio_container_dma_rw(device->group->container, iova,
- data, len, write);
+ if (vfio_device_has_container(device))
+ return vfio_device_container_dma_rw(device, iova,
+ data, len, write);
if (device->iommufd_access) {
unsigned int flags = 0;