Allow specification of the domain-id for the new domain.
This patch only adds the 'did' parameter to iommu_attach_domain()
and modifies all of its callers to specify the default value of -1
which says "no did specified, allocate a new one".

This is no functional change from current behaviour -- just enables
a functional change to be made in a later patch.

Bill Sumner:
    Original version.

Li, Zhenhua:
    Minor change, add change to function __iommu_attach_domain.

Signed-off-by: Bill Sumner <billsumnerli...@gmail.com>
Signed-off-by: Li, Zhen-Hua <zhen-h...@hp.com>
---
 drivers/iommu/intel-iommu.c | 34 ++++++++++++++++++++--------------
 1 file changed, 20 insertions(+), 14 deletions(-)

diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 1232336..2dc6250 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -1534,31 +1534,36 @@ static struct dmar_domain *alloc_domain(int flags)
 }
 
 static int __iommu_attach_domain(struct dmar_domain *domain,
-                                struct intel_iommu *iommu)
+                                struct intel_iommu *iommu,
+                                int domain_number)
 {
        int num;
        unsigned long ndomains;
 
        ndomains = cap_ndoms(iommu->cap);
-       num = find_first_zero_bit(iommu->domain_ids, ndomains);
-       if (num < ndomains) {
-               set_bit(num, iommu->domain_ids);
-               iommu->domains[num] = domain;
-       } else {
-               num = -ENOSPC;
-       }
+       if (domain_number < 0) {
+               num = find_first_zero_bit(iommu->domain_ids, ndomains);
+               if (num < ndomains) {
+                       set_bit(num, iommu->domain_ids);
+                       iommu->domains[num] = domain;
+               } else {
+                       num = -ENOSPC;
+               }
+       } else
+               num = domain_number;
 
        return num;
 }
 
 static int iommu_attach_domain(struct dmar_domain *domain,
-                              struct intel_iommu *iommu)
+                              struct intel_iommu *iommu,
+                              int domain_number)
 {
        int num;
        unsigned long flags;
 
        spin_lock_irqsave(&iommu->lock, flags);
-       num = __iommu_attach_domain(domain, iommu);
+       num = __iommu_attach_domain(domain, iommu, domain_number);
        spin_unlock_irqrestore(&iommu->lock, flags);
        if (num < 0)
                pr_err("IOMMU: no free domain ids\n");
@@ -1577,7 +1582,7 @@ static int iommu_attach_vm_domain(struct dmar_domain 
*domain,
                if (iommu->domains[num] == domain)
                        return num;
 
-       return __iommu_attach_domain(domain, iommu);
+       return __iommu_attach_domain(domain, iommu, -1);
 }
 
 static void iommu_detach_domain(struct dmar_domain *domain,
@@ -2231,6 +2236,7 @@ static struct dmar_domain *get_domain_for_dev(struct 
device *dev, int gaw)
        u16 dma_alias;
        unsigned long flags;
        u8 bus, devfn;
+       int did = -1;   /* Default to "no domain_id supplied" */
 
        domain = find_domain(dev);
        if (domain)
@@ -2264,7 +2270,7 @@ static struct dmar_domain *get_domain_for_dev(struct 
device *dev, int gaw)
        domain = alloc_domain(0);
        if (!domain)
                return NULL;
-       domain->id = iommu_attach_domain(domain, iommu);
+       domain->id = iommu_attach_domain(domain, iommu, did);
        if (domain->id < 0) {
                free_domain_mem(domain);
                return NULL;
@@ -2442,7 +2448,7 @@ static int __init si_domain_init(int hw)
                return -EFAULT;
 
        for_each_active_iommu(iommu, drhd) {
-               ret = iommu_attach_domain(si_domain, iommu);
+               ret = iommu_attach_domain(si_domain, iommu, -1);
                if (ret < 0) {
                        domain_exit(si_domain);
                        return -EFAULT;
@@ -3866,7 +3872,7 @@ static int intel_iommu_add(struct dmar_drhd_unit *dmaru)
        iommu_enable_translation(iommu);
 
        if (si_domain) {
-               ret = iommu_attach_domain(si_domain, iommu);
+               ret = iommu_attach_domain(si_domain, iommu, -1);
                if (ret < 0 || si_domain->id != ret)
                        goto disable_iommu;
                domain_attach_iommu(si_domain, iommu);
-- 
2.0.0-rc0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to