On Wed, Jun 14, 2023 at 01:12:50PM +0000, Liu, Yi L wrote: > diff --git a/drivers/vfio/group.c b/drivers/vfio/group.c > index 41a09a2df690..c2e0128323a7 100644 > --- a/drivers/vfio/group.c > +++ b/drivers/vfio/group.c > @@ -687,16 +687,6 @@ static struct vfio_group *vfio_group_find_or_alloc(struct device *dev) > if (!iommu_group) > return ERR_PTR(-EINVAL); > > - /* > - * VFIO always sets IOMMU_CACHE because we offer no way for userspace to > - * restore cache coherency. It has to be checked here because it is only > - * valid for cases where we are using iommu groups. > - */ > - if (!device_iommu_capable(dev, IOMMU_CAP_CACHE_COHERENCY)) { > - iommu_group_put(iommu_group); > - return ERR_PTR(-EINVAL); > - } > - > mutex_lock(&vfio.group_lock); > group = vfio_group_find_from_iommu(iommu_group); > if (group) { > diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c > index 51c80eb32af6..ffb4585b7f0e 100644 > --- a/drivers/vfio/vfio_main.c > +++ b/drivers/vfio/vfio_main.c > @@ -292,6 +292,17 @@ static int __vfio_register_dev(struct vfio_device *device, > if (ret) > return ret; > > + /* > + * VFIO always sets IOMMU_CACHE because we offer no way for userspace to > + * restore cache coherency. It has to be checked here because it is only > + * valid for cases where we are using iommu groups. > + */ > + if (type == VFIO_IOMMU && !vfio_device_is_noiommu(device) && > + !device_iommu_capable(device->dev, IOMMU_CAP_CACHE_COHERENCY)) { > + ret = -EINVAL; > + goto err_out; > + } > + > ret = vfio_device_add(device); > if (ret) > goto err_out; Yes that looks right > > > I prefer the idea that vfio_device_is_noiommu() works in all the > > kconfig scenarios rather than adding #ifdefs. > > But the vfio_group would be empty when CONFIG_VFIO_GROUP is unset. > From what I got now, when CONFIG_VFIO_GROUP is unset, the stub > function always returns false. It seems fine, you could also put the ifdef inside the stub Jason