Re: [PATCH] iommu/arm-smmu: don't unregister on shutdown

From: Robin Murphy
Date: Wed Dec 14 2022 - 16:27:51 EST


On 2022-12-14 17:34, Vladimir Oltean wrote:
On Fri, Dec 09, 2022 at 11:24:32AM +0000, Robin Murphy wrote:
Fixes: b06c076ea962 ("Revert "iommu/arm-smmu: Make arm-smmu explicitly non-modular"")

I think that's semantically correct, but I'm pretty sure at that point it
would have been benign in practice - the observable splat will be a much
more recent fallout from me changing the iommu_device_unregister() behaviour
in 57365a04c921 ("iommu: Move bus setup to IOMMU device registration"). The
assumption therein is that unregister would only happen on probe failure,
before the IOMMU instance is in use, or on module unload, which would not be
allowed while active devices still hold module references. I overlooked that
the SMMU drivers were doing what they do, sorry about that.

Ok, I'll change the Fixes: tag, I didn't notice that iommu_device_unregister()
changed in behavior only later, I just looked at current trees and tried
to infer what went wrong.

The change itself looks sensible. The point of this shutdown hook is simply
not to leave active translations in place that might confuse future software
after reboot/kexec; any housekeeping in the current kernel state is a waste
of time anyway. Fancy doing the same for SMMUv3 as well?

I can try, but I won't have hardware to test.

Basically the only thing truly relevant for shutdown from arm_smmu_device_remove()
is arm_smmu_device_disable(), would you agree to a patch which changes
things as below?

diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
index 6d5df91c5c46..d4d8bfee9feb 100644
--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
+++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
@@ -3854,7 +3854,9 @@ static int arm_smmu_device_remove(struct platform_device *pdev)
static void arm_smmu_device_shutdown(struct platform_device *pdev)
{
- arm_smmu_device_remove(pdev);
+ struct arm_smmu_device *smmu = platform_get_drvdata(pdev);
+
+ arm_smmu_device_disable(smmu);
}
static const struct of_device_id arm_smmu_of_match[] = {


Looks fine to me! I'll let Will decide if he'd still prefer to do the full remove-calls-shutdown reversal here as well for complete consistency, but I reckon the minimal diff is no bad thing :)

Cheers,
Robin.