Allow iommu_change_dev_def_domain() to create a new default domain, keeping
the same as current in case type argument is not set.

Also remove comment about function purpose, which will become stale.

Signed-off-by: John Garry <john.ga...@huawei.com>
---
 drivers/iommu/iommu.c | 53 ++++++++++++++++++++++---------------------
 1 file changed, 27 insertions(+), 26 deletions(-)

diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 62e4491f32e0..f7253a973ab9 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -3065,16 +3065,13 @@ EXPORT_SYMBOL_GPL(iommu_sva_get_pasid);
  * @prev_dev: The device in the group (this is used to make sure that the 
device
  *      hasn't changed after the caller has called this function)
  * @type: The type of the new default domain that gets associated with the 
group
+ * @new: Allocate new default domain, keeping same type when no type passed
  *
  * Returns 0 on success and error code on failure
  *
- * Note:
- * 1. Presently, this function is called only when user requests to change the
- *    group's default domain type through 
/sys/kernel/iommu_groups/<grp_id>/type
- *    Please take a closer look if intended to use for other purposes.
  */
 static int iommu_change_dev_def_domain(struct iommu_group *group,
-                                      struct device *prev_dev, int type)
+                                      struct device *prev_dev, int type, bool 
new)
 {
        struct iommu_domain *prev_dom;
        struct group_device *grp_dev;
@@ -3127,28 +3124,32 @@ static int iommu_change_dev_def_domain(struct 
iommu_group *group,
                goto out;
        }
 
-       dev_def_dom = iommu_get_def_domain_type(dev);
-       if (!type) {
+       if (new && !type) {
+               type = prev_dom->type;
+       } else {
+               dev_def_dom = iommu_get_def_domain_type(dev);
+               if (!type) {
+                       /*
+                        * If the user hasn't requested any specific type of 
domain and
+                        * if the device supports both the domains, then 
default to the
+                        * domain the device was booted with
+                        */
+                       type = dev_def_dom ? : iommu_def_domain_type;
+               } else if (dev_def_dom && type != dev_def_dom) {
+                       dev_err_ratelimited(prev_dev, "Device cannot be in %s 
domain\n",
+                                           iommu_domain_type_str(type));
+                       ret = -EINVAL;
+                       goto out;
+               }
+
                /*
-                * If the user hasn't requested any specific type of domain and
-                * if the device supports both the domains, then default to the
-                * domain the device was booted with
+                * Switch to a new domain only if the requested domain type is 
different
+                * from the existing default domain type
                 */
-               type = dev_def_dom ? : iommu_def_domain_type;
-       } else if (dev_def_dom && type != dev_def_dom) {
-               dev_err_ratelimited(prev_dev, "Device cannot be in %s domain\n",
-                                   iommu_domain_type_str(type));
-               ret = -EINVAL;
-               goto out;
-       }
-
-       /*
-        * Switch to a new domain only if the requested domain type is different
-        * from the existing default domain type
-        */
-       if (prev_dom->type == type) {
-               ret = 0;
-               goto out;
+               if (prev_dom->type == type) {
+                       ret = 0;
+                       goto out;
+               }
        }
 
        /* Sets group->default_domain to the newly allocated domain */
@@ -3292,7 +3293,7 @@ static int iommu_group_store_type_cb(const char *buf,
        else
                return -EINVAL;
 
-       return iommu_change_dev_def_domain(group, dev, type);
+       return iommu_change_dev_def_domain(group, dev, type, false);
 }
 
 static ssize_t iommu_group_store_type(struct iommu_group *group,
-- 
2.26.2

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

Reply via email to