On Tue, May 02, 2023 at 04:52:32PM +0200, Niklas Schnelle wrote: > @@ -1947,7 +1948,7 @@ static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus, > if ((type == IOMMU_DOMAIN_UNMANAGED || type == IOMMU_DOMAIN_DMA) && > bus->iommu_ops->domain_alloc_paging) > domain = bus->iommu_ops->domain_alloc_paging(dev); > - else > + else if (bus->iommu_ops->domain_alloc) > domain = bus->iommu_ops->domain_alloc(type); > if (!domain) > return NULL; Agh, yes, it should fail, this is right, I'll fold it in, thanks > This then uses the fallback of an empty IOMMU_DOMAIN_UNMANAGED and I > get a working device in the guest. Also tried hot unplug where the > device is taken over by the host again. Great, thanks, I'll add your tested-by for the s390 drivers. > I think with my DMA API > conversion patches we can support blocking domains properly but for a > temporary solution the above may be acceptable. Yes, this is a good idea, I encourage all drivers to implement at least one of BLOCKING or IDENTITY as global static singletons that can't fail - this will allow us to have cleaner error recovery flows. Jason