Skip to content

Commit 4d26ba6

Browse files
rmurphy-armjoergroedel
authored andcommitted
iommu: Clean up release_device checks
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>
1 parent b321a2f commit 4d26ba6

9 files changed

Lines changed: 5 additions & 63 deletions

File tree

drivers/iommu/apple-dart.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -564,9 +564,6 @@ static void apple_dart_release_device(struct device *dev)
564564
{
565565
struct apple_dart_master_cfg *cfg = dev_iommu_priv_get(dev);
566566

567-
if (!cfg)
568-
return;
569-
570567
dev_iommu_priv_set(dev, NULL);
571568
kfree(cfg);
572569
}

drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2702,20 +2702,14 @@ static struct iommu_device *arm_smmu_probe_device(struct device *dev)
27022702

27032703
static void arm_smmu_release_device(struct device *dev)
27042704
{
2705-
struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
2706-
struct arm_smmu_master *master;
2707-
2708-
if (!fwspec || fwspec->ops != &arm_smmu_ops)
2709-
return;
2705+
struct arm_smmu_master *master = dev_iommu_priv_get(dev);
27102706

2711-
master = dev_iommu_priv_get(dev);
27122707
if (WARN_ON(arm_smmu_master_sva_enabled(master)))
27132708
iopf_queue_remove_device(master->smmu->evtq.iopf, dev);
27142709
arm_smmu_detach_dev(master);
27152710
arm_smmu_disable_pasid(master);
27162711
arm_smmu_remove_master(master);
27172712
kfree(master);
2718-
iommu_fwspec_free(dev);
27192713
}
27202714

27212715
static struct iommu_group *arm_smmu_device_group(struct device *dev)

drivers/iommu/arm/arm-smmu/arm-smmu.c

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1432,27 +1432,19 @@ static struct iommu_device *arm_smmu_probe_device(struct device *dev)
14321432
static void arm_smmu_release_device(struct device *dev)
14331433
{
14341434
struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
1435-
struct arm_smmu_master_cfg *cfg;
1436-
struct arm_smmu_device *smmu;
1435+
struct arm_smmu_master_cfg *cfg = dev_iommu_priv_get(dev);
14371436
int ret;
14381437

1439-
if (!fwspec || fwspec->ops != &arm_smmu_ops)
1440-
return;
1441-
1442-
cfg = dev_iommu_priv_get(dev);
1443-
smmu = cfg->smmu;
1444-
1445-
ret = arm_smmu_rpm_get(smmu);
1438+
ret = arm_smmu_rpm_get(cfg->smmu);
14461439
if (ret < 0)
14471440
return;
14481441

14491442
arm_smmu_master_free_smes(cfg, fwspec);
14501443

1451-
arm_smmu_rpm_put(smmu);
1444+
arm_smmu_rpm_put(cfg->smmu);
14521445

14531446
dev_iommu_priv_set(dev, NULL);
14541447
kfree(cfg);
1455-
iommu_fwspec_free(dev);
14561448
}
14571449

14581450
static void arm_smmu_probe_finalize(struct device *dev)

drivers/iommu/arm/arm-smmu/qcom_iommu.c

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -532,16 +532,6 @@ static struct iommu_device *qcom_iommu_probe_device(struct device *dev)
532532
return &qcom_iommu->iommu;
533533
}
534534

535-
static void qcom_iommu_release_device(struct device *dev)
536-
{
537-
struct qcom_iommu_dev *qcom_iommu = to_iommu(dev);
538-
539-
if (!qcom_iommu)
540-
return;
541-
542-
iommu_fwspec_free(dev);
543-
}
544-
545535
static int qcom_iommu_of_xlate(struct device *dev, struct of_phandle_args *args)
546536
{
547537
struct qcom_iommu_dev *qcom_iommu;
@@ -591,7 +581,6 @@ static const struct iommu_ops qcom_iommu_ops = {
591581
.capable = qcom_iommu_capable,
592582
.domain_alloc = qcom_iommu_domain_alloc,
593583
.probe_device = qcom_iommu_probe_device,
594-
.release_device = qcom_iommu_release_device,
595584
.device_group = generic_device_group,
596585
.of_xlate = qcom_iommu_of_xlate,
597586
.pgsize_bitmap = SZ_4K | SZ_64K | SZ_1M | SZ_16M,

drivers/iommu/exynos-iommu.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,9 +1251,6 @@ static void exynos_iommu_release_device(struct device *dev)
12511251
struct exynos_iommu_owner *owner = dev_iommu_priv_get(dev);
12521252
struct sysmmu_drvdata *data;
12531253

1254-
if (!has_sysmmu(dev))
1255-
return;
1256-
12571254
if (owner->domain) {
12581255
struct iommu_group *group = iommu_group_get(dev);
12591256

drivers/iommu/mtk_iommu.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -819,17 +819,12 @@ static void mtk_iommu_release_device(struct device *dev)
819819
struct device *larbdev;
820820
unsigned int larbid;
821821

822-
if (!fwspec || fwspec->ops != &mtk_iommu_ops)
823-
return;
824-
825822
data = dev_iommu_priv_get(dev);
826823
if (MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_MM)) {
827824
larbid = MTK_M4U_TO_LARB(fwspec->ids[0]);
828825
larbdev = data->larb_imu[larbid].dev;
829826
device_link_remove(dev, larbdev);
830827
}
831-
832-
iommu_fwspec_free(dev);
833828
}
834829

835830
static int mtk_iommu_get_group_id(struct device *dev, const struct mtk_iommu_plat_data *plat_data)

drivers/iommu/mtk_iommu_v1.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -532,15 +532,10 @@ static void mtk_iommu_v1_release_device(struct device *dev)
532532
struct device *larbdev;
533533
unsigned int larbid;
534534

535-
if (!fwspec || fwspec->ops != &mtk_iommu_v1_ops)
536-
return;
537-
538535
data = dev_iommu_priv_get(dev);
539536
larbid = mt2701_m4u_to_larb(fwspec->ids[0]);
540537
larbdev = data->larb_imu[larbid].dev;
541538
device_link_remove(dev, larbdev);
542-
543-
iommu_fwspec_free(dev);
544539
}
545540

546541
static int mtk_iommu_v1_hw_init(const struct mtk_iommu_v1_data *data)

drivers/iommu/sprd-iommu.c

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -383,16 +383,6 @@ static struct iommu_device *sprd_iommu_probe_device(struct device *dev)
383383
return &sdev->iommu;
384384
}
385385

386-
static void sprd_iommu_release_device(struct device *dev)
387-
{
388-
struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
389-
390-
if (!fwspec || fwspec->ops != &sprd_iommu_ops)
391-
return;
392-
393-
iommu_fwspec_free(dev);
394-
}
395-
396386
static struct iommu_group *sprd_iommu_device_group(struct device *dev)
397387
{
398388
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)
417407
static const struct iommu_ops sprd_iommu_ops = {
418408
.domain_alloc = sprd_iommu_domain_alloc,
419409
.probe_device = sprd_iommu_probe_device,
420-
.release_device = sprd_iommu_release_device,
421410
.device_group = sprd_iommu_device_group,
422411
.of_xlate = sprd_iommu_of_xlate,
423412
.pgsize_bitmap = ~0UL << SPRD_IOMMU_PAGE_SHIFT,

drivers/iommu/virtio-iommu.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -981,13 +981,7 @@ static void viommu_probe_finalize(struct device *dev)
981981

982982
static void viommu_release_device(struct device *dev)
983983
{
984-
struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
985-
struct viommu_endpoint *vdev;
986-
987-
if (!fwspec || fwspec->ops != &viommu_ops)
988-
return;
989-
990-
vdev = dev_iommu_priv_get(dev);
984+
struct viommu_endpoint *vdev = dev_iommu_priv_get(dev);
991985

992986
generic_iommu_put_resv_regions(dev, &vdev->resv_regions);
993987
kfree(vdev);

0 commit comments

Comments
 (0)