> From: Nicolin Chen <nicolinc@xxxxxxxxxx> > Sent: Friday, September 9, 2022 11:17 AM > > 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 With this definition then probably @attach_dev should not return -EBUSY at all given it's already checked in the start of __iommu_attach_group(): if (group->domain && group->domain != group->default_domain && group->domain != group->blocking_domain) return -EBUSY; > + * ENODEV - Device or domain is messed up: device is not mapped > + * to an IOMMU, no domain can attach, and etc. if domain is messed up then should return -EINVAL given using another domain might just work. IMHO here -ENODEV should only cover device specific problems preventing this device from being attached to by any domain. > + * <others> - Same behavior as ENODEV, use is discouraged didn't get the "Same behavior" part. Does it suggest all other errnos should be converted to ENODEV? btw what about -ENOSPC? It's sane to allocate some resource in the attach path while the resource might be not available, e.g.: intel_iommu_attach_device() domain_add_dev_info() domain_attach_iommu(): int num, ret = -ENOSPC; ... ndomains = cap_ndoms(iommu->cap); num = find_first_zero_bit(iommu->domain_ids, ndomains); if (num >= ndomains) { pr_err("%s: No free domain ids\n", iommu->name); goto err_unlock; } As discussed in a side thread a note might be added to exempt calling kAPI outside of the iommu driver. > * @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