Hi Joerg, On Tue, 2020-04-07 at 20:37 +0200, Joerg Roedel wrote: > From: Joerg Roedel <jroedel@xxxxxxx> > > When a bus is initialized with iommu-ops, all devices on the bus are > scanned and iommu-groups are allocated for them, and each groups will > also get a default domain allocated. > > Until now this happened as soon as the group was created and the first > device added to it. When other devices with different default domain > requirements were added to the group later on, the default domain was > re-allocated, if possible. > > This resulted in some back and forth and unnecessary allocations, so > change the flow to defer default domain allocation until all devices > have been added to their respective IOMMU groups. > > The default domains are allocated for newly allocated groups after > each device on the bus is handled and was probed by the IOMMU driver. > > Signed-off-by: Joerg Roedel <jroedel@xxxxxxx> > --- [snip] I had to add the following for initial VMD support. The new PCIe domain added on VMD endpoint probe didn't have the dev_iommu member set on the VMD subdevices, which I'm guessing is due to probe_iommu_group already having been run on the VMD endpoint's group prior to those subdevices being added. diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 8a5e1ac328dd..ac1e4fb9bf48 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -1577,6 +1577,9 @@ static int iommu_bus_notifier(struct notifier_block *nb, if (action == BUS_NOTIFY_ADD_DEVICE) { int ret; + if (!dev_iommu_get(dev)) + return -ENOMEM; + ret = iommu_probe_device(dev); return (ret) ? NOTIFY_DONE : NOTIFY_OK; } else if (action == BUS_NOTIFY_REMOVED_DEVICE) {