On 2/25/23 8:27 AM, Jason Gunthorpe wrote:
+/**
- iommufd_device_attach - Connect a device to an iommu_domain
- @idev: device to attach
- @pt_id: Input a IOMMUFD_OBJ_IOAS, or IOMMUFD_OBJ_HW_PAGETABLE
Output the IOMMUFD_OBJ_HW_PAGETABLE ID
"Output the hwpt ID" only happens when the caller input an IOAS object and an auto domain was selected or created for the device.
Do I understand it right?
- This connects the device to an iommu_domain, either automatically or manually
- selected. Once this completes the device could do DMA.
- The caller should return the resulting pt_id back to userspace.
- This function is undone by calling iommufd_device_detach().
- */
+int iommufd_device_attach(struct iommufd_device *idev, u32 *pt_id) +{
- int rc;
- rc = iommufd_device_change_pt(idev, pt_id, &iommufd_device_do_attach);
- if (rc)
return rc;
- /*
* Pairs with iommufd_device_detach() - catches caller bugs attempting
* to destroy a device with an attachment.
*/
- refcount_inc(&idev->obj.users);
- return 0; } EXPORT_SYMBOL_NS_GPL(iommufd_device_attach, IOMMUFD);
+/**
- iommufd_device_replace - Change the device's iommu_domain
- @idev: device to change
- @pt_id: Input a IOMMUFD_OBJ_IOAS, or IOMMUFD_OBJ_HW_PAGETABLE
Output the IOMMUFD_OBJ_HW_PAGETABLE ID
If my above understanding is correct, then replace will never output a hwpt id as it only happens after a successful attach.
- This is the same as:
- iommufd_device_detach();
- iommufd_device_attach()
- If it fails then no change is made to the attachment. The iommu driver may
- implement this so there is no disruption in translation. This can only be
- called if iommufd_device_attach() has already succeeded.
- */
+int iommufd_device_replace(struct iommufd_device *idev, u32 *pt_id) +{
- return iommufd_device_change_pt(idev, pt_id,
&iommufd_device_do_replace);
+} +EXPORT_SYMBOL_NS_GPL(iommufd_device_replace, IOMMUFD);
Best regards, baolu