> From: Christoph Hellwig <hch@xxxxxx> > Sent: Thursday, August 26, 2021 12:19 AM > > Pass the group flags to ->attach_group and remove the messy check for > the bus type. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > Reviewed-by: Jason Gunthorpe <jgg@xxxxxxxxxx> This is a nice cleanup. Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx> > --- > drivers/vfio/vfio.c | 11 +++++------ > drivers/vfio/vfio.h | 7 ++++++- > drivers/vfio/vfio_iommu_spapr_tce.c | 2 +- > drivers/vfio/vfio_iommu_type1.c | 19 ++----------------- > 4 files changed, 14 insertions(+), 25 deletions(-) > > diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c > index f73158fce8c446..8b31eca02e0be7 100644 > --- a/drivers/vfio/vfio.c > +++ b/drivers/vfio/vfio.c > @@ -68,9 +68,6 @@ struct vfio_unbound_dev { > struct list_head unbound_next; > }; > > -#define VFIO_EMULATED_IOMMU (1 << 0) > -#define VFIO_NO_IOMMU (1 << 1) > - > struct vfio_group { > struct kref kref; > int minor; > @@ -198,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, unsigned int flags) > { > return 0; > } > @@ -1105,7 +1102,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->flags); > if (ret) > goto unwind; > } > @@ -1363,7 +1361,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->flags); > if (ret) > goto unlock_out; > } > diff --git a/drivers/vfio/vfio.h b/drivers/vfio/vfio.h > index a78de649eb2f16..1e02433d3992ef 100644 > --- a/drivers/vfio/vfio.h > +++ b/drivers/vfio/vfio.h > @@ -9,6 +9,10 @@ enum vfio_iommu_notify_type { > VFIO_IOMMU_CONTAINER_CLOSE = 0, > }; > > +/* flags for group->flags and ->attach_group */ > +#define VFIO_EMULATED_IOMMU (1 << 0) > +#define VFIO_NO_IOMMU (1 << 1) > + > /** > * struct vfio_iommu_driver_ops - VFIO IOMMU driver callbacks > */ > @@ -20,7 +24,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, > + unsigned int flags); > void (*detach_group)(void *iommu_data, > struct iommu_group *group); > int (*pin_pages)(void *iommu_data, > diff --git a/drivers/vfio/vfio_iommu_spapr_tce.c > b/drivers/vfio/vfio_iommu_spapr_tce.c > index 3efd09faeca4a8..7567328d347d25 100644 > --- a/drivers/vfio/vfio_iommu_spapr_tce.c > +++ b/drivers/vfio/vfio_iommu_spapr_tce.c > @@ -1239,7 +1239,7 @@ static long > tce_iommu_take_ownership_ddw(struct tce_container *container, > } > > static int tce_iommu_attach_group(void *iommu_data, > - struct iommu_group *iommu_group) > + struct iommu_group *iommu_group, unsigned int flags) > { > int ret = 0; > struct tce_container *container = iommu_data; > diff --git a/drivers/vfio/vfio_iommu_type1.c > b/drivers/vfio/vfio_iommu_type1.c > index 39e2706d0b3f34..ca3c995c84166f 100644 > --- a/drivers/vfio/vfio_iommu_type1.c > +++ b/drivers/vfio/vfio_iommu_type1.c > @@ -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, unsigned int flags) > { > 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 (flags & VFIO_EMULATED_IOMMU) { > if (!iommu->external_domain) { > INIT_LIST_HEAD(&domain->group_list); > iommu->external_domain = domain; > -- > 2.30.2