|
@@ -2287,12 +2287,6 @@ static int domain_add_dev_info(struct dmar_domain *domain,
|
|
|
if (!info)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- ret = domain_context_mapping(domain, pdev, translation);
|
|
|
- if (ret) {
|
|
|
- free_devinfo_mem(info);
|
|
|
- return ret;
|
|
|
- }
|
|
|
-
|
|
|
info->segment = pci_domain_nr(pdev->bus);
|
|
|
info->bus = pdev->bus->number;
|
|
|
info->devfn = pdev->devfn;
|
|
@@ -2305,6 +2299,17 @@ static int domain_add_dev_info(struct dmar_domain *domain,
|
|
|
pdev->dev.archdata.iommu = info;
|
|
|
spin_unlock_irqrestore(&device_domain_lock, flags);
|
|
|
|
|
|
+ ret = domain_context_mapping(domain, pdev, translation);
|
|
|
+ if (ret) {
|
|
|
+ spin_lock_irqsave(&device_domain_lock, flags);
|
|
|
+ list_del(&info->link);
|
|
|
+ list_del(&info->global);
|
|
|
+ pdev->dev.archdata.iommu = NULL;
|
|
|
+ spin_unlock_irqrestore(&device_domain_lock, flags);
|
|
|
+ free_devinfo_mem(info);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|