On Thu, Sep 08, 2022 at 01:14:42PM -0300, Jason Gunthorpe wrote: > > I am wondering if this can be solved by better defining what the return > > codes mean and adjust the call-back functions to match the definition. > > Something like: > > > > -ENODEV : Device not mapped my an IOMMU > > -EBUSY : Device attached and domain can not be changed > > -EINVAL : Device and domain are incompatible > > ... > > Yes, this was gone over in a side thread the pros/cons, so lets do > it. Nicolin will come with something along these lines. I have started this effort by combining this list and the one from the side thread: @@ -266,6 +266,13 @@ struct iommu_ops { /** * struct iommu_domain_ops - domain specific operations * @attach_dev: attach an iommu domain to a device + * Rules of its return errno: + * ENOMEM - Out of memory + * EINVAL - Device and domain are incompatible + * EBUSY - Device is attached to a domain and cannot be changed + * ENODEV - Device or domain is messed up: device is not mapped + * to an IOMMU, no domain can attach, and etc. + * <others> - Same behavior as ENODEV, use is discouraged * @detach_dev: detach an iommu domain from a device * @map: map a physically contiguous memory region to an iommu domain * @map_pages: map a physically contiguous set of pages of the same size to I am now going through every single return value of ->attach_dev to make sure the list above applies. And I will also incorporate things like Robin's comments at the AMD IOMMU driver. And if the change occurs to be bigger, I guess that separating it to be an IOMMU series from this VFIO one might be better. Thanks Nic