iommu: More internal ops cleanup
Subsystems (14)
Robin Murphy
reviewercover iommu: More internal ops cleanup
Hi all,
Here are a few more thematically-related patches from my develompent stack that don't depend on the rest, so may as well get some exposure sooner rather than later.
Thanks,
Robin.
Robin Murphy (3):
iommu: Use dev_iommu_ops() for probe_finalize
iommu: Make .release_device optional
iommu: Clean up release_device checks
drivers/iommu/apple-dart.c | 3 --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 8 +------- drivers/iommu/arm/arm-smmu/arm-smmu.c | 14 +++----------- drivers/iommu/arm/arm-smmu/qcom_iommu.c | 11 ----------- drivers/iommu/exynos-iommu.c | 3 --- drivers/iommu/fsl_pamu_domain.c | 5 ----- drivers/iommu/iommu.c | 9 ++++++--- drivers/iommu/msm_iommu.c | 5 ----- drivers/iommu/mtk_iommu.c | 5 ----- drivers/iommu/mtk_iommu_v1.c | 5 ----- drivers/iommu/sprd-iommu.c | 11 ----------- drivers/iommu/sun50i-iommu.c | 3 --- drivers/iommu/tegra-gart.c | 5 ----- drivers/iommu/tegra-smmu.c | 3 --- drivers/iommu/virtio-iommu.c | 8 +------- 15 files changed, 11 insertions(+), 87 deletions(-)
Signature · 1 line
2.36.1.dirty
Robin Murphy
reviewerPATCH 1/3 iommu: Use dev_iommu_ops() for probe_finalize
The ->probe_finalize hook only runs after ->probe_device succeeds, so we can move that over to the new dev_iommu_ops() as well.
--- drivers/iommu/iommu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/iommu/iommu.c +2 -1
@@ -272,7 +272,7 @@ static int __iommu_probe_device(struct device *dev, struct list_head *group_listint iommu_probe_device (struct device *dev) { -const struct iommu_ops *ops = dev->bus->iommu_ops; +const struct iommu_ops *ops;struct iommu_group *group;int ret;
@@ -313,6 +313,7 @@ int iommu_probe_device(struct device *dev)mutex_unlock (&group->mutex);iommu_group_put (group); + ops =dev_iommu_ops (dev);if (ops->probe_finalize) ops->probe_finalize (dev);
Signature · 1 line
2.36.1.dirty
Robin Murphy
reviewerPATCH 2/3 iommu: Make .release_device optional
In reply to Robin MurphyMany drivers do nothing meaningful for .release_device, and it's neatly abstracted to just two callsites in the core code, so let's make it optional to implement.
--- drivers/iommu/fsl_pamu_domain.c | 5 ----- drivers/iommu/iommu.c | 6 ++++-- drivers/iommu/msm_iommu.c | 5 ----- drivers/iommu/sun50i-iommu.c | 3 --- drivers/iommu/tegra-gart.c | 5 ----- drivers/iommu/tegra-smmu.c | 3 --- 6 files changed, 4 insertions(+), 23 deletions(-)
drivers/iommu/fsl_pamu_domain.c +0 -5
@@ -447,15 +447,10 @@ static struct iommu_device *fsl_pamu_probe_device(struct device *dev)return &pamu_iommu; } -static void fsl_pamu_release_device (struct device *dev) -{ -} -static const struct iommu_ops fsl_pamu_ops = { .capable = fsl_pamu_capable, .domain_alloc = fsl_pamu_domain_alloc, .probe_device = fsl_pamu_probe_device, - .release_device = fsl_pamu_release_device, .device_group = fsl_pamu_device_group, .default_domain_ops = &(const struct iommu_domain_ops ) { .attach_dev = fsl_pamu_attach_device,
drivers/iommu/iommu.c +4 -2
@@ -259,7 +259,8 @@ static int __iommu_probe_device(struct device *dev, struct list_head *group_listreturn 0 ; out_release: - ops->release_device (dev); +if (ops->release_device) + ops->release_device (dev); out_module_put:module_put (ops->owner);
@@ -337,7 +338,8 @@ void iommu_release_device(struct device *dev)iommu_device_unlink (dev->iommu->iommu_dev, dev); ops =dev_iommu_ops (dev); - ops->release_device (dev); +if (ops->release_device) + ops->release_device (dev);iommu_group_remove_device (dev);module_put (ops->owner);
drivers/iommu/msm_iommu.c +0 -5
@@ -394,10 +394,6 @@ static struct iommu_device *msm_iommu_probe_device(struct device *dev)return &iommu->iommu; } -static void msm_iommu_release_device (struct device *dev) -{ -} -static int msm_iommu_attach_dev (struct iommu_domain *domain,struct device *dev) {int ret =0 ;
@@ -677,7 +673,6 @@ irqreturn_t msm_iommu_fault_handler(int irq, void *dev_id)static struct iommu_ops msm_iommu_ops = { .domain_alloc = msm_iommu_domain_alloc, .probe_device = msm_iommu_probe_device, - .release_device = msm_iommu_release_device, .device_group = generic_device_group, .pgsize_bitmap =MSM_IOMMU_PGSIZES , .of_xlate = qcom_iommu_of_xlate,
drivers/iommu/sun50i-iommu.c +0 -3
@@ -738,8 +738,6 @@ static struct iommu_device *sun50i_iommu_probe_device(struct device *dev)return &iommu->iommu; } -static void sun50i_iommu_release_device (struct device *dev) {} -static struct iommu_group *sun50i_iommu_device_group (struct device *dev) {struct sun50i_iommu *iommu =sun50i_iommu_from_dev (dev);
@@ -764,7 +762,6 @@ static const struct iommu_ops sun50i_iommu_ops = { .domain_alloc = sun50i_iommu_domain_alloc, .of_xlate = sun50i_iommu_of_xlate, .probe_device = sun50i_iommu_probe_device, - .release_device = sun50i_iommu_release_device, .default_domain_ops = &(const struct iommu_domain_ops ) { .attach_dev = sun50i_iommu_attach_device, .detach_dev = sun50i_iommu_detach_device,
drivers/iommu/tegra-gart.c +0 -5
@@ -246,10 +246,6 @@ static struct iommu_device *gart_iommu_probe_device(struct device *dev)return &gart_handle->iommu; } -static void gart_iommu_release_device (struct device *dev) -{ -} -static int gart_iommu_of_xlate (struct device *dev,struct of_phandle_args *args) {
@@ -273,7 +269,6 @@ static void gart_iommu_sync(struct iommu_domain *domain,static const struct iommu_ops gart_iommu_ops = { .domain_alloc = gart_iommu_domain_alloc, .probe_device = gart_iommu_probe_device, - .release_device = gart_iommu_release_device, .device_group = generic_device_group, .pgsize_bitmap =GART_IOMMU_PGSIZES , .of_xlate = gart_iommu_of_xlate,
drivers/iommu/tegra-smmu.c +0 -3
@@ -864,8 +864,6 @@ static struct iommu_device *tegra_smmu_probe_device(struct device *dev)return &smmu->iommu; } -static void tegra_smmu_release_device (struct device *dev) {} -static const struct tegra_smmu_group_soc *tegra_smmu_find_group (struct tegra_smmu *smmu,unsigned int swgroup) {
@@ -966,7 +964,6 @@ static int tegra_smmu_of_xlate(struct device *dev,static const struct iommu_ops tegra_smmu_ops = { .domain_alloc = tegra_smmu_domain_alloc, .probe_device = tegra_smmu_probe_device, - .release_device = tegra_smmu_release_device, .device_group = tegra_smmu_device_group, .of_xlate = tegra_smmu_of_xlate, .pgsize_bitmap =SZ_4K ,
Signature · 1 line
2.36.1.dirty
Re: [PATCH 2/3] iommu: Make .release_device optional
Quoted 139 lines · Robin Murphy
Many drivers do nothing meaningful for .release_device, and it's neatly abstracted to just two callsites in the core code, so let's make it optional to implement.
Signed-off-by Robin Murphy <[email protected]>--- drivers/iommu/fsl_pamu_domain.c | 5 ----- drivers/iommu/iommu.c | 6 ++++-- drivers/iommu/msm_iommu.c | 5 ----- drivers/iommu/sun50i-iommu.c | 3 --- drivers/iommu/tegra-gart.c | 5 ----- drivers/iommu/tegra-smmu.c | 3 --- 6 files changed, 4 insertions(+), 23 deletions(-)drivers/iommu/fsl_pamu_domain.c +0
-5@@ -447,15 +447,10 @@ static struct iommu_device *fsl_pamu_probe_device(struct device *dev)return &pamu_iommu; } -static void fsl_pamu_release_device (struct device *dev) -{ -} -static const struct iommu_ops fsl_pamu_ops = { .capable = fsl_pamu_capable, .domain_alloc = fsl_pamu_domain_alloc, .probe_device = fsl_pamu_probe_device, - .release_device = fsl_pamu_release_device, .device_group = fsl_pamu_device_group, .default_domain_ops = &(const struct iommu_domain_ops ) { .attach_dev = fsl_pamu_attach_device,drivers/iommu/iommu.c +4
-2@@ -259,7 +259,8 @@ static int __iommu_probe_device(struct device *dev, struct list_head *group_listreturn 0 ; out_release: - ops->release_device (dev); +if (ops->release_device) + ops->release_device (dev); out_module_put:module_put (ops->owner);@@ -337,7 +338,8 @@ void iommu_release_device(struct device *dev)iommu_device_unlink (dev->iommu->iommu_dev, dev); ops =dev_iommu_ops (dev); - ops->release_device (dev); +if (ops->release_device) + ops->release_device (dev);iommu_group_remove_device (dev);module_put (ops->owner);drivers/iommu/msm_iommu.c +0
-5@@ -394,10 +394,6 @@ static struct iommu_device *msm_iommu_probe_device(struct device *dev)return &iommu->iommu; } -static void msm_iommu_release_device (struct device *dev) -{ -} -static int msm_iommu_attach_dev (struct iommu_domain *domain,struct device *dev) {int ret =0 ;@@ -677,7 +673,6 @@ irqreturn_t msm_iommu_fault_handler(int irq, void *dev_id)static struct iommu_ops msm_iommu_ops = { .domain_alloc = msm_iommu_domain_alloc, .probe_device = msm_iommu_probe_device, - .release_device = msm_iommu_release_device, .device_group = generic_device_group, .pgsize_bitmap =MSM_IOMMU_PGSIZES , .of_xlate = qcom_iommu_of_xlate,drivers/iommu/sun50i-iommu.c +0
-3@@ -738,8 +738,6 @@ static struct iommu_device *sun50i_iommu_probe_device(struct device *dev)return &iommu->iommu; } -static void sun50i_iommu_release_device (struct device *dev) {} -static struct iommu_group *sun50i_iommu_device_group (struct device *dev) {struct sun50i_iommu *iommu =sun50i_iommu_from_dev (dev);@@ -764,7 +762,6 @@ static const struct iommu_ops sun50i_iommu_ops = { .domain_alloc = sun50i_iommu_domain_alloc, .of_xlate = sun50i_iommu_of_xlate, .probe_device = sun50i_iommu_probe_device, - .release_device = sun50i_iommu_release_device, .default_domain_ops = &(const struct iommu_domain_ops ) { .attach_dev = sun50i_iommu_attach_device, .detach_dev = sun50i_iommu_detach_device,drivers/iommu/tegra-gart.c +0
-5@@ -246,10 +246,6 @@ static struct iommu_device *gart_iommu_probe_device(struct device *dev)return &gart_handle->iommu; } -static void gart_iommu_release_device (struct device *dev) -{ -} -static int gart_iommu_of_xlate (struct device *dev,struct of_phandle_args *args) {@@ -273,7 +269,6 @@ static void gart_iommu_sync(struct iommu_domain *domain,static const struct iommu_ops gart_iommu_ops = { .domain_alloc = gart_iommu_domain_alloc, .probe_device = gart_iommu_probe_device, - .release_device = gart_iommu_release_device, .device_group = generic_device_group, .pgsize_bitmap =GART_IOMMU_PGSIZES , .of_xlate = gart_iommu_of_xlate,drivers/iommu/tegra-smmu.c +0
-2@@ -864,8 +864,6 @@ static struct iommu_device *tegra_smmu_probe_device(struct device *dev)return &smmu->iommu; } -static void tegra_smmu_release_device (struct device *dev) {} -static const struct tegra_smmu_group_soc *tegra_smmu_find_group (struct tegra_smmu *smmu,unsigned int swgroup) {
drivers/iommu/tegra-smmu.c static int tegra_smmu_of_xlate(struct device *dev, · line 969
Quoted 7 lines
drivers/iommu/tegra-smmu.c +0
-1@@ -966,7 +964,6 @@ static int tegra_smmu_of_xlate(struct device *dev,static const struct iommu_ops tegra_smmu_ops = { .domain_alloc = tegra_smmu_domain_alloc, .probe_device = tegra_smmu_probe_device, - .release_device = tegra_smmu_release_device, .device_group = tegra_smmu_device_group, .of_xlate = tegra_smmu_of_xlate, .pgsize_bitmap =SZ_4K ,
Best regards,
baolu
Robin Murphy
reviewerPATCH 3/3 iommu: Clean up release_device checks
In reply to Robin MurphySince .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.
--- drivers/iommu/apple-dart.c | 3 --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 8 +------- drivers/iommu/arm/arm-smmu/arm-smmu.c | 14 +++----------- drivers/iommu/arm/arm-smmu/qcom_iommu.c | 11 ----------- drivers/iommu/exynos-iommu.c | 3 --- drivers/iommu/mtk_iommu.c | 5 ----- drivers/iommu/mtk_iommu_v1.c | 5 ----- drivers/iommu/sprd-iommu.c | 11 ----------- drivers/iommu/virtio-iommu.c | 8 +------- 9 files changed, 5 insertions(+), 63 deletions(-)
drivers/iommu/apple-dart.c +0 -3
@@ -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); }
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +1 -7
@@ -2691,20 +2691,14 @@ static struct iommu_device *arm_smmu_probe_device(struct device *dev)static void arm_smmu_release_device (struct device *dev) { -struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev); -struct arm_smmu_master *master; +struct arm_smmu_master *master =dev_iommu_priv_get (dev); -if (!fwspec || fwspec->ops != &arm_smmu_ops) -return ; - - 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)
drivers/iommu/arm/arm-smmu/arm-smmu.c +3 -11
@@ -1432,27 +1432,19 @@ static struct iommu_device *arm_smmu_probe_device(struct device *dev)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)
drivers/iommu/arm/arm-smmu/qcom_iommu.c +0 -11
@@ -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,
drivers/iommu/exynos-iommu.c +0 -3
@@ -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);
drivers/iommu/mtk_iommu.c +0 -5
@@ -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)
drivers/iommu/mtk_iommu_v1.c +0 -5
@@ -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)
drivers/iommu/sprd-iommu.c +0 -11
@@ -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 ,
drivers/iommu/virtio-iommu.c +1 -7
@@ -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);
Signature · 1 line
2.36.1.dirty
Re: [PATCH 3/3] iommu: Clean up release_device checks
Quoted 5 lines · Robin Murphy
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.
Does this depend on any other series? I didn't see iommu_fwspec_free() called in the core code. Or I missed anything?
Quoted 13 lines
Signed-off-by Robin Murphy<[email protected]>--- drivers/iommu/apple-dart.c | 3 --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 8 +------- drivers/iommu/arm/arm-smmu/arm-smmu.c | 14 +++----------- drivers/iommu/arm/arm-smmu/qcom_iommu.c | 11 ----------- drivers/iommu/exynos-iommu.c | 3 --- drivers/iommu/mtk_iommu.c | 5 ----- drivers/iommu/mtk_iommu_v1.c | 5 ----- drivers/iommu/sprd-iommu.c | 11 ----------- drivers/iommu/virtio-iommu.c | 8 +------- 9 files changed, 5 insertions(+), 63 deletions(-)
Best regards,
baolu
Robin Murphy
reviewerRe: [PATCH 3/3] iommu: Clean up release_device checks
Quoted 9 lines · Baolu Lu
Quoted 5 lines · Robin Murphy
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.
Does this depend on any other series? I didn't see
iommu_fwspec_free()called in the core code. Or I missed anything?
dev_iommu_free() cleans up param->fwspec directly (see b54240ad4943). FWIW the plan is that iommu_fwspec_free() should eventually go away - of the remaining uses after this, two are in fact similarly redundant already, since there's also a dev_iommu_free() in the probe failure path, and the other two should disappear in part 2 of fixing the bus probing mess (wherein the of_xlate step gets pulled into iommu_probe_device as well, and finally works correctly again).
Cheers,
Robin.
Quoted 17 lines
Quoted 13 lines
Signed-off-by Robin Murphy<[email protected]>---
drivers/iommu/apple-dart.c | 3 ---drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c| 8 +------- drivers/iommu/arm/arm-smmu/arm-smmu.c | 14 +++----------- drivers/iommu/arm/arm-smmu/qcom_iommu.c | 11 ----------- drivers/iommu/exynos-iommu.c | 3 --- drivers/iommu/mtk_iommu.c | 5 ----- drivers/iommu/mtk_iommu_v1.c | 5 ----- drivers/iommu/sprd-iommu.c | 11 ----------- drivers/iommu/virtio-iommu.c | 8 +-------Quoted 1 line
9 files changed, 5 insertions(+), 63 deletions(-)Best regards,
baolu
Baolu Lu
Reviewed-byRe: [PATCH 3/3] iommu: Clean up release_device checks
Quoted 8 lines · Robin Murphy
Quoted 7 lines · Baolu Lu
Quoted 5 lines · Robin Murphy
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.
Quoted 4 lines
Quoted 2 lines
Does this depend on any other series? I didn't see
iommu_fwspec_free()called in the core code. Or I missed anything?
dev_iommu_free()cleans upparam->fwspecdirectly (seeb54240ad4943). FWIW the plan is thatiommu_fwspec_free()should eventually go away - of the remaining uses after this, two are in fact similarly redundant already, since there's also adev_iommu_free()in the probe failure path, and the other two should disappear in part 2 of fixing the bus probing mess (wherein theof_xlatestep gets pulled intoiommu_probe_deviceas well, and finally works correctly again).
Yes, it is. Thanks for the explanation.
Best regards,
baolu
Quoted 4 lines · Robin Murphy
Robin Murphy (3):
iommu: Usedev_iommu_ops()forprobe_finalize
iommu: Make .release_device optional
iommu: Clean uprelease_devicechecks
Applied to core branch, thanks.