Messages in this thread Patch in this message | | | Date | Thu, 19 Jan 2023 15:26:38 -0400 | From | Jason Gunthorpe <> | Subject | Re: [PATCH 4/8] iommu: Switch __iommu_domain_alloc() to device ops |
| |
On Thu, Jan 19, 2023 at 07:18:22PM +0000, Robin Murphy wrote:
> -static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus, > +static struct iommu_domain *__iommu_domain_alloc(struct device *dev, > unsigned type) > { > - const struct iommu_ops *ops = bus ? bus->iommu_ops : NULL; > + const struct iommu_ops *ops = dev_iommu_ops(dev); > struct iommu_domain *domain; > > - if (!ops) > - return NULL; > - > domain = ops->domain_alloc(type); > if (!domain) > return NULL; > @@ -1970,9 +1968,28 @@ static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus, > return domain; > } > > +static int __iommu_domain_alloc_dev(struct device *dev, void *data) > +{ > + struct device **alloc_dev = data; > + > + if (!device_iommu_mapped(dev)) > + return 0;
Is 0 the right thing? see below
> + > + WARN_ONCE(*alloc_dev && dev_iommu_ops(dev) != dev_iommu_ops(*alloc_dev), > + "Multiple IOMMU drivers present, which the public IOMMU API can't fully support yet. This may not work as expected, sorry!\n");
if (WARN_ONCE(..)) return -EINVAL
So that iommu_domain_alloc fails?
> + *alloc_dev = dev; > + return 0; > +} > + > struct iommu_domain *iommu_domain_alloc(struct bus_type *bus) > { > - return __iommu_domain_alloc(bus, IOMMU_DOMAIN_UNMANAGED); > + struct device *dev = NULL; > + > + if (bus_for_each_dev(bus, NULL, &dev, __iommu_domain_alloc_dev)) > + return NULL;
eg shouldn't iommu_domain_alloc() return NULL if any devices are !device_iommu_mapped ?
Jason
| |