> From: Jason Gunthorpe <jgg@xxxxxxxxxx> > 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 <farman@xxxxxxxxxxxxx> > Tested-by: Eric Farman <farman@xxxxxxxxxxxxx> > Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxx> Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx> > --- > drivers/vfio/vfio.c | 15 ++++++++++----- > 1 file changed, 10 insertions(+), 5 deletions(-) > > Sort of a v2 from here: > > https://lore.kernel.org/all/20220518191446.GU1343366@xxxxxxxxxx/ > > 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