This allocates a domain for the mediated device if it is able to
be isolated and protected individually by IOMMU.

Cc: Ashok Raj <[email protected]>
Cc: Jacob Pan <[email protected]>
Cc: Kevin Tian <[email protected]>
Cc: Liu Yi L <[email protected]>
Signed-off-by: Sanjay Kumar <[email protected]>
Signed-off-by: Lu Baolu <[email protected]>
---
 drivers/vfio/vfio_iommu_type1.c | 43 ++++++++++++++++++++++++++++++-----------
 1 file changed, 32 insertions(+), 11 deletions(-)

diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
index 3e5b177..496bea6 100644
--- a/drivers/vfio/vfio_iommu_type1.c
+++ b/drivers/vfio/vfio_iommu_type1.c
@@ -1177,6 +1177,22 @@ static int vfio_bus_type(struct device *dev, void *data)
        return 0;
 }
 
+static int mdev_private_domain(struct device *dev, void *data)
+{
+       enum mdev_domain_type type;
+       enum mdev_domain_type (*fn)(struct device *dev);
+
+       fn = symbol_get(mdev_get_domain_type);
+       if (fn) {
+               type = fn(dev);
+               symbol_put(mdev_get_domain_type);
+
+               return type != DOMAIN_TYPE_PRIVATE;
+       }
+
+       return -EINVAL;
+}
+
 static int vfio_iommu_replay(struct vfio_iommu *iommu,
                             struct vfio_domain *domain)
 {
@@ -1371,18 +1387,23 @@ static int vfio_iommu_type1_attach_group(void 
*iommu_data,
        mdev_bus = symbol_get(mdev_bus_type);
 
        if (mdev_bus) {
-               if ((bus == mdev_bus) && !iommu_present(bus)) {
-                       symbol_put(mdev_bus_type);
-                       if (!iommu->external_domain) {
-                               INIT_LIST_HEAD(&domain->group_list);
-                               iommu->external_domain = domain;
-                       } else
-                               kfree(domain);
+               if (bus == mdev_bus) {
+                       ret = iommu_group_for_each_dev(iommu_group, NULL,
+                                                      mdev_private_domain);
+                       if (!iommu_present(bus) || ret) {
+                               symbol_put(mdev_bus_type);
+                               if (!iommu->external_domain) {
+                                       INIT_LIST_HEAD(&domain->group_list);
+                                       iommu->external_domain = domain;
+                               } else {
+                                       kfree(domain);
+                               }
 
-                       list_add(&group->next,
-                                &iommu->external_domain->group_list);
-                       mutex_unlock(&iommu->lock);
-                       return 0;
+                               list_add(&group->next,
+                                        &iommu->external_domain->group_list);
+                               mutex_unlock(&iommu->lock);
+                               return 0;
+                       }
                }
                symbol_put(mdev_bus_type);
        }
-- 
2.7.4

_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to