> From: Jason Gunthorpe <j...@nvidia.com>
> Sent: Friday, May 20, 2022 1:04 AM
> 
> Since asserting dma ownership now causes the group to have its DMA
> blocked
> the iommu layer requires a working iommu. This means the dma_owner APIs
> cannot be used on the fake groups that VFIO creates. Test for this and
> avoid calling them.
> 
> Otherwise asserting dma ownership will fail for VFIO mdev devices as a
> BLOCKING iommu_domain cannot be allocated due to the NULL iommu ops.
> 
> Fixes: 0286300e6045 ("iommu: iommu_group_claim_dma_owner() must
> always assign a domain")
> Reported-by: Eric Farman <far...@linux.ibm.com>
> Tested-by: Eric Farman <far...@linux.ibm.com>
> Signed-off-by: Jason Gunthorpe <j...@nvidia.com>

Reviewed-by: Kevin Tian <kevin.t...@intel.com>

> ---
>  drivers/vfio/vfio.c | 15 ++++++++++-----
>  1 file changed, 10 insertions(+), 5 deletions(-)
> 
> Sort of a v2 from here:
> 
> https://lore.kernel.org/all/20220518191446.gu1343...@nvidia.com/
> 
> diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
> index cfcff7764403fc..f5ed03897210c3 100644
> --- a/drivers/vfio/vfio.c
> +++ b/drivers/vfio/vfio.c
> @@ -927,7 +927,8 @@ static void __vfio_group_unset_container(struct
> vfio_group *group)
>               driver->ops->detach_group(container->iommu_data,
>                                         group->iommu_group);
> 
> -     iommu_group_release_dma_owner(group->iommu_group);
> +     if (group->type == VFIO_IOMMU)
> +             iommu_group_release_dma_owner(group->iommu_group);
> 
>       group->container = NULL;
>       group->container_users = 0;
> @@ -1001,9 +1002,11 @@ static int vfio_group_set_container(struct
> vfio_group *group, int container_fd)
>               goto unlock_out;
>       }
> 
> -     ret = iommu_group_claim_dma_owner(group->iommu_group, f.file);
> -     if (ret)
> -             goto unlock_out;
> +     if (group->type == VFIO_IOMMU) {
> +             ret = iommu_group_claim_dma_owner(group-
> >iommu_group, f.file);
> +             if (ret)
> +                     goto unlock_out;
> +     }
> 
>       driver = container->iommu_driver;
>       if (driver) {
> @@ -1011,7 +1014,9 @@ static int vfio_group_set_container(struct
> vfio_group *group, int container_fd)
>                                               group->iommu_group,
>                                               group->type);
>               if (ret) {
> -                     iommu_group_release_dma_owner(group-
> >iommu_group);
> +                     if (group->type == VFIO_IOMMU)
> +                             iommu_group_release_dma_owner(
> +                                     group->iommu_group);
>                       goto unlock_out;
>               }
>       }
> 
> base-commit: 7ab5e10eda02da1d9562ffde562c51055d368e9c
> --
> 2.36.0

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to