This patch ensures that devices attached to the default_domain will be
first detached from it before attaching to new domain. To avoid forward
declaration, __iommu_attach_group() function has been moved to new place
in the source code.

Signed-off-by: Marek Szyprowski <m.szyprow...@samsung.com>
---
 drivers/iommu/iommu.c | 38 ++++++++++++++++++++++----------------
 1 file changed, 22 insertions(+), 16 deletions(-)

diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 0e3b009..db231ad 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -1198,22 +1198,6 @@ static int iommu_group_do_attach_device(struct device 
*dev, void *data)
        return __iommu_attach_device(domain, dev);
 }
 
-static int __iommu_attach_group(struct iommu_domain *domain,
-                               struct iommu_group *group)
-{
-       int ret;
-
-       if (group->default_domain && group->domain != group->default_domain)
-               return -EBUSY;
-
-       ret = __iommu_group_for_each_dev(group, domain,
-                                        iommu_group_do_attach_device);
-       if (ret == 0)
-               group->domain = domain;
-
-       return ret;
-}
-
 int iommu_attach_group(struct iommu_domain *domain, struct iommu_group *group)
 {
        int ret;
@@ -1235,6 +1219,28 @@ static int iommu_group_do_detach_device(struct device 
*dev, void *data)
        return 0;
 }
 
+static int __iommu_attach_group(struct iommu_domain *domain,
+                               struct iommu_group *group)
+{
+       int ret;
+
+       if (group->default_domain && group->domain != group->default_domain)
+               return -EBUSY;
+
+       if (group->default_domain && group->default_domain == group->domain) {
+               __iommu_group_for_each_dev(group, group->domain,
+                                          iommu_group_do_detach_device);
+               group->domain = NULL;
+       }
+
+       ret = __iommu_group_for_each_dev(group, domain,
+                                        iommu_group_do_attach_device);
+       if (ret == 0)
+               group->domain = domain;
+
+       return ret;
+}
+
 static void __iommu_detach_group(struct iommu_domain *domain,
                                 struct iommu_group *group)
 {
-- 
1.9.2

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to