Re: [PATCH v12 21/24] vfio: Determine noiommu device in __vfio_register_dev()

Jason Gunthorpe
2023-06-14T17:31:02Z

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