iommu: Clean up release_device checks
authorRobin Murphy <robin.murphy@arm.com>
Tue, 21 Jun 2022 15:14:27 +0000 (16:14 +0100)
committerJoerg Roedel <jroedel@suse.de>
Wed, 6 Jul 2022 10:55:53 +0000 (12:55 +0200)
Since .release_device is now called through per-device ops, any call
which gets as far as a driver definitely *is* for that driver, for a
device which has successfully passed .probe_device, so all the checks to
that effect are now redundant and can be removed. In the same vein we
can also skip freeing fwspecs which are now managed by core code.

Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Link: https://lore.kernel.org/r/02671dbfad7a3343fc25a44222350efcb455fe3c.1655822151.git.robin.murphy@arm.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/apple-dart.c
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
drivers/iommu/arm/arm-smmu/arm-smmu.c
drivers/iommu/arm/arm-smmu/qcom_iommu.c
drivers/iommu/exynos-iommu.c
drivers/iommu/mtk_iommu.c
drivers/iommu/mtk_iommu_v1.c
drivers/iommu/sprd-iommu.c
drivers/iommu/virtio-iommu.c

index 8af0242a90d91f40b62ed1ac3fd9a9ea1c8fe79b..e87d3cf54ed6892c2b08f6eec49e0517a4fd7c29 100644 (file)
@@ -564,9 +564,6 @@ static void apple_dart_release_device(struct device *dev)
 {
        struct apple_dart_master_cfg *cfg = dev_iommu_priv_get(dev);
 
-       if (!cfg)
-               return;
-
        dev_iommu_priv_set(dev, NULL);
        kfree(cfg);
 }
index 448e7b7ce0f2591c986385b1c60e6567fc2a6691..d9c1623ec1a9a5f4617d0a82bdf1a593dbfcb844 100644 (file)
@@ -2702,20 +2702,14 @@ err_free_master:
 
 static void arm_smmu_release_device(struct device *dev)
 {
-       struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
-       struct arm_smmu_master *master;
-
-       if (!fwspec || fwspec->ops != &arm_smmu_ops)
-               return;
+       struct arm_smmu_master *master = dev_iommu_priv_get(dev);
 
-       master = dev_iommu_priv_get(dev);
        if (WARN_ON(arm_smmu_master_sva_enabled(master)))
                iopf_queue_remove_device(master->smmu->evtq.iopf, dev);
        arm_smmu_detach_dev(master);
        arm_smmu_disable_pasid(master);
        arm_smmu_remove_master(master);
        kfree(master);
-       iommu_fwspec_free(dev);
 }
 
 static struct iommu_group *arm_smmu_device_group(struct device *dev)
index 7ac4907235c3f55599cb6881258cb7e6d3fc6482..588929bed1bc35d11a8e04305dca5c6fdb317401 100644 (file)
@@ -1432,27 +1432,19 @@ out_free:
 static void arm_smmu_release_device(struct device *dev)
 {
        struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
-       struct arm_smmu_master_cfg *cfg;
-       struct arm_smmu_device *smmu;
+       struct arm_smmu_master_cfg *cfg = dev_iommu_priv_get(dev);
        int ret;
 
-       if (!fwspec || fwspec->ops != &arm_smmu_ops)
-               return;
-
-       cfg  = dev_iommu_priv_get(dev);
-       smmu = cfg->smmu;
-
-       ret = arm_smmu_rpm_get(smmu);
+       ret = arm_smmu_rpm_get(cfg->smmu);
        if (ret < 0)
                return;
 
        arm_smmu_master_free_smes(cfg, fwspec);
 
-       arm_smmu_rpm_put(smmu);
+       arm_smmu_rpm_put(cfg->smmu);
 
        dev_iommu_priv_set(dev, NULL);
        kfree(cfg);
-       iommu_fwspec_free(dev);
 }
 
 static void arm_smmu_probe_finalize(struct device *dev)
index 4c077c38fbd64f924470cfd9e745c89eb25257d0..4a922c7b69ee06083af9df3a6e86023b59e91636 100644 (file)
@@ -532,16 +532,6 @@ static struct iommu_device *qcom_iommu_probe_device(struct device *dev)
        return &qcom_iommu->iommu;
 }
 
-static void qcom_iommu_release_device(struct device *dev)
-{
-       struct qcom_iommu_dev *qcom_iommu = to_iommu(dev);
-
-       if (!qcom_iommu)
-               return;
-
-       iommu_fwspec_free(dev);
-}
-
 static int qcom_iommu_of_xlate(struct device *dev, struct of_phandle_args *args)
 {
        struct qcom_iommu_dev *qcom_iommu;
@@ -591,7 +581,6 @@ static const struct iommu_ops qcom_iommu_ops = {
        .capable        = qcom_iommu_capable,
        .domain_alloc   = qcom_iommu_domain_alloc,
        .probe_device   = qcom_iommu_probe_device,
-       .release_device = qcom_iommu_release_device,
        .device_group   = generic_device_group,
        .of_xlate       = qcom_iommu_of_xlate,
        .pgsize_bitmap  = SZ_4K | SZ_64K | SZ_1M | SZ_16M,
index 71f2018e23fe92a465770563021aeeee57c289f0..1d6808d6e190d60c7216c6b7cff1d1e77f488446 100644 (file)
@@ -1251,9 +1251,6 @@ static void exynos_iommu_release_device(struct device *dev)
        struct exynos_iommu_owner *owner = dev_iommu_priv_get(dev);
        struct sysmmu_drvdata *data;
 
-       if (!has_sysmmu(dev))
-               return;
-
        if (owner->domain) {
                struct iommu_group *group = iommu_group_get(dev);
 
index bb9dd92c9898d3ea34ecec811937c8311b663762..5c3d9366c25c79ada75e80e3f418ca50fda8db2c 100644 (file)
@@ -819,17 +819,12 @@ static void mtk_iommu_release_device(struct device *dev)
        struct device *larbdev;
        unsigned int larbid;
 
-       if (!fwspec || fwspec->ops != &mtk_iommu_ops)
-               return;
-
        data = dev_iommu_priv_get(dev);
        if (MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_MM)) {
                larbid = MTK_M4U_TO_LARB(fwspec->ids[0]);
                larbdev = data->larb_imu[larbid].dev;
                device_link_remove(dev, larbdev);
        }
-
-       iommu_fwspec_free(dev);
 }
 
 static int mtk_iommu_get_group_id(struct device *dev, const struct mtk_iommu_plat_data *plat_data)
index e1cb51b9866c38bd1a2176b6b7b35f46c9b4f963..128c7a3f17783227c151e90fe407b062614ac65a 100644 (file)
@@ -532,15 +532,10 @@ static void mtk_iommu_v1_release_device(struct device *dev)
        struct device *larbdev;
        unsigned int larbid;
 
-       if (!fwspec || fwspec->ops != &mtk_iommu_v1_ops)
-               return;
-
        data = dev_iommu_priv_get(dev);
        larbid = mt2701_m4u_to_larb(fwspec->ids[0]);
        larbdev = data->larb_imu[larbid].dev;
        device_link_remove(dev, larbdev);
-
-       iommu_fwspec_free(dev);
 }
 
 static int mtk_iommu_v1_hw_init(const struct mtk_iommu_v1_data *data)
index bd409bab6286b1979b0b4a28fdad35a0da817317..511959c8a14d94fd88a3e6a66a9eafbc8c4a5519 100644 (file)
@@ -383,16 +383,6 @@ static struct iommu_device *sprd_iommu_probe_device(struct device *dev)
        return &sdev->iommu;
 }
 
-static void sprd_iommu_release_device(struct device *dev)
-{
-       struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
-
-       if (!fwspec || fwspec->ops != &sprd_iommu_ops)
-               return;
-
-       iommu_fwspec_free(dev);
-}
-
 static struct iommu_group *sprd_iommu_device_group(struct device *dev)
 {
        struct sprd_iommu_device *sdev = dev_iommu_priv_get(dev);
@@ -417,7 +407,6 @@ static int sprd_iommu_of_xlate(struct device *dev, struct of_phandle_args *args)
 static const struct iommu_ops sprd_iommu_ops = {
        .domain_alloc   = sprd_iommu_domain_alloc,
        .probe_device   = sprd_iommu_probe_device,
-       .release_device = sprd_iommu_release_device,
        .device_group   = sprd_iommu_device_group,
        .of_xlate       = sprd_iommu_of_xlate,
        .pgsize_bitmap  = ~0UL << SPRD_IOMMU_PAGE_SHIFT,
index 25be4b822aa07fc73437c54b8ea77f2478bf3a43..55337796a5f820a9dc36412d2061c34fd59ef531 100644 (file)
@@ -981,13 +981,7 @@ static void viommu_probe_finalize(struct device *dev)
 
 static void viommu_release_device(struct device *dev)
 {
-       struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
-       struct viommu_endpoint *vdev;
-
-       if (!fwspec || fwspec->ops != &viommu_ops)
-               return;
-
-       vdev = dev_iommu_priv_get(dev);
+       struct viommu_endpoint *vdev = dev_iommu_priv_get(dev);
 
        generic_iommu_put_resv_regions(dev, &vdev->resv_regions);
        kfree(vdev);