iommu/exynos: Properly release device from the default domain in ->remove
authorMarek Szyprowski <m.szyprowski@samsung.com>
Mon, 9 Jan 2017 12:03:56 +0000 (13:03 +0100)
committerJoerg Roedel <jroedel@suse.de>
Tue, 10 Jan 2017 14:01:21 +0000 (15:01 +0100)
IOMMU core doesn't detach device from the default domain before calling
->iommu_remove_device, so check that and do the proper cleanup or
warn if device is still attached to non-default domain.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/exynos-iommu.c

index 91f78272167c71d498d2a4bd6fdf1cd12d87b7f3..fa529c2125f514f0485a5f307a6e69f0207f30a6 100644 (file)
@@ -1242,9 +1242,21 @@ static int exynos_iommu_add_device(struct device *dev)
 
 static void exynos_iommu_remove_device(struct device *dev)
 {
+       struct exynos_iommu_owner *owner = dev->archdata.iommu;
+
        if (!has_sysmmu(dev))
                return;
 
+       if (owner->domain) {
+               struct iommu_group *group = iommu_group_get(dev);
+
+               if (group) {
+                       WARN_ON(owner->domain !=
+                               iommu_group_default_domain(group));
+                       exynos_iommu_detach_device(owner->domain, dev);
+                       iommu_group_put(group);
+               }
+       }
        iommu_group_remove_device(dev);
 }