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.

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 4116377..226c1d0 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -1181,7 +1181,8 @@ static struct dmar_domain *alloc_domain(bool vm)
 }
 
 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;
@@ -1191,12 +1192,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;
        domain->iommu_count++;
@@ -1875,6 +1879,7 @@ static struct dmar_domain *get_domain_for_dev(struct 
device *dev, int gaw)
        struct pci_dev *dev_tmp = NULL;
        unsigned long flags;
        u8 bus, devfn, bridge_bus, bridge_devfn;
+       int did = -1;   /* Default to "no domain_id supplied" */
 
        domain = find_domain(dev);
        if (domain)
@@ -1915,7 +1920,7 @@ static struct dmar_domain *get_domain_for_dev(struct 
device *dev, int gaw)
        domain = alloc_domain(false);
        if (!domain)
                goto error;
-       if (iommu_attach_domain(domain, iommu)) {
+       if (iommu_attach_domain(domain, iommu, did)) {
                free_domain_mem(domain);
                domain = NULL;
                goto error;
@@ -2083,7 +2088,7 @@ static int __init si_domain_init(int hw)
        si_domain->flags = DOMAIN_FLAG_STATIC_IDENTITY;
 
        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