On Tue, May 16, 2023 at 10:43:23AM +0800, Baolu Lu wrote:
On 5/15/23 10:00 PM, Jason Gunthorpe wrote:
void iommufd_device_destroy(struct iommufd_object *obj) { struct iommufd_device *idev = container_of(obj, struct iommufd_device, obj); iommu_device_release_dma_owner(idev->dev);
- iommu_group_put(idev->group);
- iommufd_put_group(idev->igroup); if (!iommufd_selftest_is_mock_dev(idev->dev)) iommufd_ctx_put(idev->ictx); }
@@ -46,7 +154,7 @@ struct iommufd_device *iommufd_device_bind(struct iommufd_ctx *ictx, struct device *dev, u32 *id) { struct iommufd_device *idev;
- struct iommu_group *group;
- struct iommufd_group *igroup; int rc; /*
@@ -56,9 +164,9 @@ struct iommufd_device *iommufd_device_bind(struct iommufd_ctx *ictx, if (!device_iommu_capable(dev, IOMMU_CAP_CACHE_COHERENCY)) return ERR_PTR(-EINVAL);
- group = iommu_group_get(dev);
- if (!group)
return ERR_PTR(-ENODEV);
- igroup = iommufd_get_group(ictx, dev);
- if (IS_ERR(igroup))
/*return ERR_CAST(igroup);
- For historical compat with VFIO the insecure interrupt path is
Hi Jason,
Perhaps I am asking a silly question. The iommufd_group is get in iommufd_device_bind(), but put in iommufd_device_destroy(). Why not put it in iommufd_device_unbind()?
It basically is like that, iommufd_device_destroy() is a helper that is only called by iommufd_device_unbind() through the usual destruction mechanism.
Jason