vfio: clean up the check for mediated device in vfio_iommu_type1
Pass the group flags to ->attach_group and remove the messy check for the bus type. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Link: https://lore.kernel.org/r/20210924155705.4258-12-hch@lst.de Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
parent
fda49d97f2
commit
c3c0fa9d94
@ -68,30 +68,6 @@ struct vfio_unbound_dev {
|
||||
struct list_head unbound_next;
|
||||
};
|
||||
|
||||
enum vfio_group_type {
|
||||
/*
|
||||
* Physical device with IOMMU backing.
|
||||
*/
|
||||
VFIO_IOMMU,
|
||||
|
||||
/*
|
||||
* Virtual device without IOMMU backing. The VFIO core fakes up an
|
||||
* iommu_group as the iommu_group sysfs interface is part of the
|
||||
* userspace ABI. The user of these devices must not be able to
|
||||
* directly trigger unmediated DMA.
|
||||
*/
|
||||
VFIO_EMULATED_IOMMU,
|
||||
|
||||
/*
|
||||
* Physical device without IOMMU backing. The VFIO core fakes up an
|
||||
* iommu_group as the iommu_group sysfs interface is part of the
|
||||
* userspace ABI. Users can trigger unmediated DMA by the device,
|
||||
* usage is highly dangerous, requires an explicit opt-in and will
|
||||
* taint the kernel.
|
||||
*/
|
||||
VFIO_NO_IOMMU,
|
||||
};
|
||||
|
||||
struct vfio_group {
|
||||
struct kref kref;
|
||||
int minor;
|
||||
@ -219,7 +195,7 @@ static long vfio_noiommu_ioctl(void *iommu_data,
|
||||
}
|
||||
|
||||
static int vfio_noiommu_attach_group(void *iommu_data,
|
||||
struct iommu_group *iommu_group)
|
||||
struct iommu_group *iommu_group, enum vfio_group_type type)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@ -1129,7 +1105,8 @@ static int __vfio_container_attach_groups(struct vfio_container *container,
|
||||
int ret = -ENODEV;
|
||||
|
||||
list_for_each_entry(group, &container->group_list, container_next) {
|
||||
ret = driver->ops->attach_group(data, group->iommu_group);
|
||||
ret = driver->ops->attach_group(data, group->iommu_group,
|
||||
group->type);
|
||||
if (ret)
|
||||
goto unwind;
|
||||
}
|
||||
@ -1387,7 +1364,8 @@ static int vfio_group_set_container(struct vfio_group *group, int container_fd)
|
||||
driver = container->iommu_driver;
|
||||
if (driver) {
|
||||
ret = driver->ops->attach_group(container->iommu_data,
|
||||
group->iommu_group);
|
||||
group->iommu_group,
|
||||
group->type);
|
||||
if (ret)
|
||||
goto unlock_out;
|
||||
}
|
||||
|
@ -4,6 +4,30 @@
|
||||
* Author: Alex Williamson <alex.williamson@redhat.com>
|
||||
*/
|
||||
|
||||
enum vfio_group_type {
|
||||
/*
|
||||
* Physical device with IOMMU backing.
|
||||
*/
|
||||
VFIO_IOMMU,
|
||||
|
||||
/*
|
||||
* Virtual device without IOMMU backing. The VFIO core fakes up an
|
||||
* iommu_group as the iommu_group sysfs interface is part of the
|
||||
* userspace ABI. The user of these devices must not be able to
|
||||
* directly trigger unmediated DMA.
|
||||
*/
|
||||
VFIO_EMULATED_IOMMU,
|
||||
|
||||
/*
|
||||
* Physical device without IOMMU backing. The VFIO core fakes up an
|
||||
* iommu_group as the iommu_group sysfs interface is part of the
|
||||
* userspace ABI. Users can trigger unmediated DMA by the device,
|
||||
* usage is highly dangerous, requires an explicit opt-in and will
|
||||
* taint the kernel.
|
||||
*/
|
||||
VFIO_NO_IOMMU,
|
||||
};
|
||||
|
||||
/* events for the backend driver notify callback */
|
||||
enum vfio_iommu_notify_type {
|
||||
VFIO_IOMMU_CONTAINER_CLOSE = 0,
|
||||
@ -20,7 +44,8 @@ struct vfio_iommu_driver_ops {
|
||||
long (*ioctl)(void *iommu_data, unsigned int cmd,
|
||||
unsigned long arg);
|
||||
int (*attach_group)(void *iommu_data,
|
||||
struct iommu_group *group);
|
||||
struct iommu_group *group,
|
||||
enum vfio_group_type);
|
||||
void (*detach_group)(void *iommu_data,
|
||||
struct iommu_group *group);
|
||||
int (*pin_pages)(void *iommu_data,
|
||||
|
@ -1239,7 +1239,7 @@ release_exit:
|
||||
}
|
||||
|
||||
static int tce_iommu_attach_group(void *iommu_data,
|
||||
struct iommu_group *iommu_group)
|
||||
struct iommu_group *iommu_group, enum vfio_group_type type)
|
||||
{
|
||||
int ret = 0;
|
||||
struct tce_container *container = iommu_data;
|
||||
|
@ -36,7 +36,6 @@
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/vfio.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/mdev.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/dma-iommu.h>
|
||||
#include <linux/irqdomain.h>
|
||||
@ -1934,20 +1933,6 @@ static bool vfio_iommu_has_sw_msi(struct list_head *group_resv_regions,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool vfio_bus_is_mdev(struct bus_type *bus)
|
||||
{
|
||||
struct bus_type *mdev_bus;
|
||||
bool ret = false;
|
||||
|
||||
mdev_bus = symbol_get(mdev_bus_type);
|
||||
if (mdev_bus) {
|
||||
ret = (bus == mdev_bus);
|
||||
symbol_put(mdev_bus_type);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a helper function to insert an address range to iova list.
|
||||
* The list is initially created with a single entry corresponding to
|
||||
@ -2172,7 +2157,7 @@ static void vfio_iommu_iova_insert_copy(struct vfio_iommu *iommu,
|
||||
}
|
||||
|
||||
static int vfio_iommu_type1_attach_group(void *iommu_data,
|
||||
struct iommu_group *iommu_group)
|
||||
struct iommu_group *iommu_group, enum vfio_group_type type)
|
||||
{
|
||||
struct vfio_iommu *iommu = iommu_data;
|
||||
struct vfio_iommu_group *group;
|
||||
@ -2207,7 +2192,7 @@ static int vfio_iommu_type1_attach_group(void *iommu_data,
|
||||
if (ret)
|
||||
goto out_free;
|
||||
|
||||
if (vfio_bus_is_mdev(bus)) {
|
||||
if (type == VFIO_EMULATED_IOMMU) {
|
||||
if (!iommu->external_domain) {
|
||||
INIT_LIST_HEAD(&domain->group_list);
|
||||
iommu->external_domain = domain;
|
||||
|
Loading…
Reference in New Issue
Block a user