Browse Source

iommu/vt-d: use dmar_insert_dev_info() from dma_add_dev_info()

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
David Woodhouse 11 years ago
parent
commit
0ac7266485
1 changed files with 7 additions and 15 deletions
  1. 7 15
      drivers/iommu/intel-iommu.c

+ 7 - 15
drivers/iommu/intel-iommu.c

@@ -2452,29 +2452,21 @@ static int domain_add_dev_info(struct dmar_domain *domain,
 			       struct pci_dev *pdev,
 			       struct pci_dev *pdev,
 			       int translation)
 			       int translation)
 {
 {
+	struct dmar_domain *ndomain;
 	struct device_domain_info *info;
 	struct device_domain_info *info;
 	unsigned long flags;
 	unsigned long flags;
 	int ret;
 	int ret;
 
 
-	info = alloc_devinfo_mem();
-	if (!info)
-		return -ENOMEM;
-
-	info->segment = pci_domain_nr(pdev->bus);
-	info->bus = pdev->bus->number;
-	info->devfn = pdev->devfn;
-	info->dev = &pdev->dev;
-	info->domain = domain;
-
-	spin_lock_irqsave(&device_domain_lock, flags);
-	list_add(&info->link, &domain->devices);
-	list_add(&info->global, &device_domain_list);
-	pdev->dev.archdata.iommu = info;
-	spin_unlock_irqrestore(&device_domain_lock, flags);
+	ndomain = dmar_insert_dev_info(pci_domain_nr(pdev->bus),
+				       pdev->bus->number, pdev->devfn,
+				       &pdev->dev, domain);
+	if (ndomain != domain)
+		return -EBUSY;
 
 
 	ret = domain_context_mapping(domain, pdev, translation);
 	ret = domain_context_mapping(domain, pdev, translation);
 	if (ret) {
 	if (ret) {
 		spin_lock_irqsave(&device_domain_lock, flags);
 		spin_lock_irqsave(&device_domain_lock, flags);
+		info = pdev->dev.archdata.iommu;
 		unlink_domain_info(info);
 		unlink_domain_info(info);
 		spin_unlock_irqrestore(&device_domain_lock, flags);
 		spin_unlock_irqrestore(&device_domain_lock, flags);
 		free_devinfo_mem(info);
 		free_devinfo_mem(info);