Allow specification of the domain-id for the new domain.

Signed-off-by: Bill Sumner <bill.sum...@hp.com>
---
 drivers/iommu/intel-iommu.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 4352731..0c00c2d 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -1003,7 +1003,8 @@ static struct dmar_domain *alloc_domain(void)
 }
 
 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;
@@ -1013,12 +1014,15 @@ static int iommu_attach_domain(struct dmar_domain 
*domain,
 
        spin_lock_irqsave(&iommu->lock, flags);
 
-       num = find_first_zero_bit(iommu->domain_ids, ndomains);
-       if (num >= ndomains) {
-               spin_unlock_irqrestore(&iommu->lock, flags);
-               printk(KERN_ERR "IOMMU: no free domain ids\n");
-               return -ENOMEM;
-       }
+       if (domain_number < 0) {
+               num = find_first_zero_bit(iommu->domain_ids, ndomains);
+               if (num >= ndomains) {
+                       spin_unlock_irqrestore(&iommu->lock, flags);
+                       pr_err("IOMMU: no free domain ids\n");
+                       return -ENOMEM;
+               }
+       } else
+               num = domain_number;
 
        domain->id = num;
        set_bit(num, iommu->domain_ids);
@@ -1629,6 +1633,7 @@ static struct dmar_domain *get_domain_for_dev(struct 
pci_dev *pdev, int gaw)
        int bus = 0, devfn = 0;
        int segment;
        int ret;
+       int did = -1;   /* Default to "no domain_id supplied" */
 
        domain = find_domain(pdev);
        if (domain)
@@ -1675,7 +1680,7 @@ static struct dmar_domain *get_domain_for_dev(struct 
pci_dev *pdev, int gaw)
        }
        iommu = drhd->iommu;
 
-       ret = iommu_attach_domain(domain, iommu);
+       ret = iommu_attach_domain(domain, iommu, did);
        if (ret) {
                free_domain_mem(domain);
                goto error;
@@ -1894,7 +1899,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, (int) -1);
                if (ret) {
                        domain_exit(si_domain);
                        return -EFAULT;
-- 
Bill Sumner <bill.sum...@hp.com>

--
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