Skip to contentSkip to conversation

iommu/arm-smmu: Don't inadvertently reject multiple SMMUv3s

PATCH New Robin Murphy 2 participants 2 messages Nov 3, 2016 IOMMU

lore
Share & tools
lore

Robin Murphy

author reviewer
#0 lore raw

PATCH v2 1/1 iommu/arm-smmu: Don't inadvertently reject multiple SMMUv3s

We now delay installing our per-bus iommu_ops until we know an SMMU has successfully probed, as they don't serve much purpose beforehand, and doing so also avoids fights between multiple IOMMU drivers in a single kernel. However, the upshot of passing the return value of bus_set_iommu() back from our probe function is that if there happens to be more than one SMMUv3 device in a system, the second and subsequent probes will wind up returning -EBUSY to the driver core and getting torn down again.

Avoid re-setting ops if ours are already installed, so that any genuine failures stand out.

Fixes 08d4ca2a672b ("iommu/arm-smmu: Support non-PCI devices with SMMUv3")
CC Lorenzo Pieralisi <[email protected]>
CC Hanjun Guo <[email protected]>
---
 drivers/iommu/arm-smmu-v3.c | 25 +++++++++++++++++--------
 1 file changed, 17 insertions(+), 8 deletions(-)
drivers/iommu/arm-smmu-v3.c +17 -8
index 15c01c3cd540..e6f9b2d745ca 100644
@@ -2636,17 +2636,26 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
 	/* And we're up. Go go go! */
 	of_iommu_set_ops(dev->of_node, &arm_smmu_ops);
 #ifdef CONFIG_PCI
-	pci_request_acs();
-	ret = bus_set_iommu(&pci_bus_type, &arm_smmu_ops);
-	if (ret)
-		return ret;
+	if (pci_bus_type.iommu_ops != &arm_smmu_ops) {
+		pci_request_acs();
+		ret = bus_set_iommu(&pci_bus_type, &arm_smmu_ops);
+		if (ret)
+			return ret;
+	}
 #endif
 #ifdef CONFIG_ARM_AMBA
-	ret = bus_set_iommu(&amba_bustype, &arm_smmu_ops);
-	if (ret)
-		return ret;
+	if (amba_bustype.iommu_ops != &arm_smmu_ops) {
+		ret = bus_set_iommu(&amba_bustype, &arm_smmu_ops);
+		if (ret)
+			return ret;
+	}
 #endif
-	return bus_set_iommu(&platform_bus_type, &arm_smmu_ops);
+	if (platform_bus_type.iommu_ops != &arm_smmu_ops) {
+		ret = bus_set_iommu(&platform_bus_type, &arm_smmu_ops);
+		if (ret)
+			return ret;
+	}
+	return 0;
 }
 
 static int arm_smmu_device_remove(struct platform_device *pdev)
Signature · 1 line
2.10.2.dirty
maintainer
#1 lore raw

PATCH v2 1/1 iommu/arm-smmu: Don't inadvertently reject multiple SMMUv3s

Quoted 2 lines · Robin Murphy
 drivers/iommu/arm-smmu-v3.c | 25 +++++++++++++++++--------
 1 file changed, 17 insertions(+), 8 deletions(-)

This looks better, thanks. Cherry-picked the other fix from the pull-request and applied this on-top.

Joerg