diff options
| -rw-r--r-- | arch/x86/kernel/amd_iommu.c | 22 |
1 files changed, 6 insertions, 16 deletions
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 2c63d8748133..1c60554537c3 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
| @@ -1145,17 +1145,6 @@ static int device_change_notifier(struct notifier_block *nb, | |||
| 1145 | "to a non-dma-ops domain\n", dev_name(dev)); | 1145 | "to a non-dma-ops domain\n", dev_name(dev)); |
| 1146 | 1146 | ||
| 1147 | switch (action) { | 1147 | switch (action) { |
| 1148 | case BUS_NOTIFY_BOUND_DRIVER: | ||
| 1149 | if (domain) | ||
| 1150 | goto out; | ||
| 1151 | dma_domain = find_protection_domain(devid); | ||
| 1152 | if (!dma_domain) | ||
| 1153 | dma_domain = iommu->default_dom; | ||
| 1154 | attach_device(iommu, &dma_domain->domain, devid); | ||
| 1155 | DUMP_printk(KERN_INFO "AMD IOMMU: Using protection domain " | ||
| 1156 | "%d for device %s\n", | ||
| 1157 | dma_domain->domain.id, dev_name(dev)); | ||
| 1158 | break; | ||
| 1159 | case BUS_NOTIFY_UNBOUND_DRIVER: | 1148 | case BUS_NOTIFY_UNBOUND_DRIVER: |
| 1160 | if (!domain) | 1149 | if (!domain) |
| 1161 | goto out; | 1150 | goto out; |
| @@ -1277,9 +1266,8 @@ static int get_device_resources(struct device *dev, | |||
| 1277 | dma_dom = (*iommu)->default_dom; | 1266 | dma_dom = (*iommu)->default_dom; |
| 1278 | *domain = &dma_dom->domain; | 1267 | *domain = &dma_dom->domain; |
| 1279 | attach_device(*iommu, *domain, *bdf); | 1268 | attach_device(*iommu, *domain, *bdf); |
| 1280 | DUMP_printk(KERN_INFO "AMD IOMMU: Using protection domain " | 1269 | DUMP_printk("Using protection domain %d for device %s\n", |
| 1281 | "%d for device %s\n", | 1270 | (*domain)->id, dev_name(dev)); |
| 1282 | (*domain)->id, dev_name(dev)); | ||
| 1283 | } | 1271 | } |
| 1284 | 1272 | ||
| 1285 | if (domain_for_device(_bdf) == NULL) | 1273 | if (domain_for_device(_bdf) == NULL) |
| @@ -1779,8 +1767,10 @@ static void *alloc_coherent(struct device *dev, size_t size, | |||
| 1779 | *dma_addr = __map_single(dev, iommu, domain->priv, paddr, | 1767 | *dma_addr = __map_single(dev, iommu, domain->priv, paddr, |
| 1780 | size, DMA_BIDIRECTIONAL, true, dma_mask); | 1768 | size, DMA_BIDIRECTIONAL, true, dma_mask); |
| 1781 | 1769 | ||
| 1782 | if (*dma_addr == bad_dma_address) | 1770 | if (*dma_addr == bad_dma_address) { |
| 1771 | spin_unlock_irqrestore(&domain->lock, flags); | ||
| 1783 | goto out_free; | 1772 | goto out_free; |
| 1773 | } | ||
| 1784 | 1774 | ||
| 1785 | iommu_completion_wait(iommu); | 1775 | iommu_completion_wait(iommu); |
| 1786 | 1776 | ||
| @@ -2082,7 +2072,7 @@ static int amd_iommu_attach_device(struct iommu_domain *dom, | |||
| 2082 | 2072 | ||
| 2083 | old_domain = domain_for_device(devid); | 2073 | old_domain = domain_for_device(devid); |
| 2084 | if (old_domain) | 2074 | if (old_domain) |
| 2085 | return -EBUSY; | 2075 | detach_device(old_domain, devid); |
| 2086 | 2076 | ||
| 2087 | attach_device(iommu, domain, devid); | 2077 | attach_device(iommu, domain, devid); |
| 2088 | 2078 | ||
