On 12/09/2018 06:02, Lu Baolu wrote: > Hi, > > On 09/11/2018 12:23 AM, Jean-Philippe Brucker wrote: >> On 30/08/2018 05:09, Lu Baolu wrote: >>> +static int vfio_detach_aux_domain(struct device *dev, void *data) >>> +{ >>> + struct iommu_domain *domain = data; >>> + >>> + vfio_mdev_set_aux_domain(dev, NULL); >>> + iommu_detach_device(domain, dev->parent); >> >> I think that's only going to work for vt-d, which doesn't use a >> default_domain. For other drivers, iommu.c ends up calling >> domain->ops->attach_dev(default_domain, dev) here, which isn't what we want. > > This doesn't break any functionality. It takes effect only if iommu > hardware supports finer granular translation and advertises it through > the API.> >> That was my concern with reusing attach/detach_dev callbacks for PASID >> management. The attach_dev code of IOMMU drivers already has to deal >> with toggling between default and unmanaged domain. Dealing with more >> state transitions in the same path is going to be difficult. > > Let's consider it from the API point of view. > > We have iommu_a(de)ttach_device() APIs to attach or detach a domain > to/from a device. We should avoid applying a limitation of "these are > only for single domain case, for multiple domains, use another API". That's an idealized view of the API, the actual semantics aren't as simple. For IOMMU drivers that implement IOMMU_DOMAIN_DMA in their domain_alloc operation (Arm SMMU, AMD IOMMU, ...), attach_dev attaches an unmanaged domain, detach_dev reattaches the default DMA domain, and the detach_dev IOMMU op is not called. We can't change that now, so it's difficult to add more functionality to attach_dev and detach_dev. Thanks, Jean