VFIO on POWER does not implement iommu_ops and therefore iommu_capable() always returns false and __iommu_group_alloc_blocking_domain() always fails. iommu_group_claim_dma_owner() in setting container fails for the same reason - it cannot allocate a domain. This skips the check for platforms supporting VFIO without implementing iommu_ops which to my best knowledge is POWER only. This also allows setting container in absence of iommu_ops. Fixes: 70693f470848 ("vfio: Set DMA ownership for VFIO devices") Fixes: e8ae0e140c05 ("vfio: Require that devices support DMA cache coherence") Signed-off-by: Alexey Kardashevskiy <aik@xxxxxxxxx> --- Not quite sure what the proper small fix is and implementing iommu_ops on POWER is not going to happen any time soon or ever :-/ --- drivers/vfio/vfio.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c index 61e71c1154be..71408ab26cd0 100644 --- a/drivers/vfio/vfio.c +++ b/drivers/vfio/vfio.c @@ -605,7 +605,8 @@ int vfio_register_group_dev(struct vfio_device *device) * VFIO always sets IOMMU_CACHE because we offer no way for userspace to * restore cache coherency. */ - if (!iommu_capable(device->dev->bus, IOMMU_CAP_CACHE_COHERENCY)) + if (device->dev->bus->iommu_ops && + !iommu_capable(device->dev->bus, IOMMU_CAP_CACHE_COHERENCY)) return -EINVAL; return __vfio_register_dev(device, @@ -934,7 +935,7 @@ static void __vfio_group_unset_container(struct vfio_group *group) driver->ops->detach_group(container->iommu_data, group->iommu_group); - if (group->type == VFIO_IOMMU) + if (group->type == VFIO_IOMMU && iommu_group_dma_owner_claimed(group->iommu_group)) iommu_group_release_dma_owner(group->iommu_group); group->container = NULL; @@ -1010,9 +1011,8 @@ static int vfio_group_set_container(struct vfio_group *group, int container_fd) } if (group->type == VFIO_IOMMU) { - ret = iommu_group_claim_dma_owner(group->iommu_group, f.file); - if (ret) - goto unlock_out; + if (iommu_group_claim_dma_owner(group->iommu_group, f.file)) + pr_warn("Failed to claim DMA owner"); } driver = container->iommu_driver; @@ -1021,7 +1021,8 @@ static int vfio_group_set_container(struct vfio_group *group, int container_fd) group->iommu_group, group->type); if (ret) { - if (group->type == VFIO_IOMMU) + if (group->type == VFIO_IOMMU && + iommu_group_dma_owner_claimed(group->iommu_group)) iommu_group_release_dma_owner( group->iommu_group); goto unlock_out; -- 2.30.2