RE: [PATCH v6 1/5] iommu: Return -EMEDIUMTYPE for incompatible domain and device/group
From: "Tian, Kevin" <kevin.tian@intel.com>
Date: 2022-09-09 05:00:50
Also in:
asahi, kvm, linux-arm-msm, linux-iommu, linux-s390, linux-tegra, lkml, virtualization
quoted hunk ↗ jump to hunk
From: Nicolin Chen <redacted> Sent: Friday, September 9, 2022 11:17 AM On Thu, Sep 08, 2022 at 01:14:42PM -0300, Jason Gunthorpe wrote:quoted
quoted
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
_______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel