Message ID | 8-v2-3c3bb7aa6e48+1916b-iommu_probe_jgg@nvidia.com |
---|---|
State | Superseded |
Headers | show |
Series | Consolidate the probe_device path | expand |
On 5/20/23 2:42 AM, Jason Gunthorpe wrote: > Have release fully clean up the iommu related parts of the struct device, > no matter what state they are in. > > Split the logic so that the three things owned by the iommu core are > always cleaned up: > - Any attached iommu_group > - Any allocated dev->iommu and its contents including a fwsepc > - Any attached driver via a struct group_device > > This fixes a minor bug where a fwspec created without an iommu_group being > probed would not be freed. > > Reviewed-by: Kevin Tian<kevin.tian@intel.com> > Signed-off-by: Jason Gunthorpe<jgg@nvidia.com> Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com> Best regards, baolu
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 69e4227bb7404f..6a8cbfd2274770 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -575,10 +575,8 @@ static void __iommu_group_remove_device(struct device *dev) iommu_deinit_device(dev); else dev->iommu_group = NULL; - goto out; + break; } - WARN(true, "Corrupted iommu_group device_list"); -out: mutex_unlock(&group->mutex); /* Pairs with the get in iommu_group_add_device() */ @@ -589,10 +587,12 @@ static void iommu_release_device(struct device *dev) { struct iommu_group *group = dev->iommu_group; - if (!dev->iommu || !group) - return; + if (group) + __iommu_group_remove_device(dev); - __iommu_group_remove_device(dev); + /* Free any fwspec if no iommu_driver was ever attached */ + if (dev->iommu) + dev_iommu_free(dev); } static int __init iommu_set_def_domain_type(char *str)