diff options
Diffstat (limited to 'drivers/iommu')
-rw-r--r-- | drivers/iommu/amd_iommu.c | 2 | ||||
-rw-r--r-- | drivers/iommu/amd_iommu_init.c | 2 | ||||
-rw-r--r-- | drivers/iommu/amd_iommu_v2.c | 2 | ||||
-rw-r--r-- | drivers/iommu/arm-smmu.c | 4 | ||||
-rw-r--r-- | drivers/iommu/dmar.c | 3 | ||||
-rw-r--r-- | drivers/iommu/intel-iommu.c | 10 |
6 files changed, 15 insertions, 8 deletions
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index c949520bd196..57068e8035b5 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c | |||
@@ -3999,7 +3999,7 @@ static struct irq_remap_table *get_irq_table(u16 devid, bool ioapic) | |||
3999 | iommu_flush_dte(iommu, devid); | 3999 | iommu_flush_dte(iommu, devid); |
4000 | if (devid != alias) { | 4000 | if (devid != alias) { |
4001 | irq_lookup_table[alias] = table; | 4001 | irq_lookup_table[alias] = table; |
4002 | set_dte_irq_entry(devid, table); | 4002 | set_dte_irq_entry(alias, table); |
4003 | iommu_flush_dte(iommu, alias); | 4003 | iommu_flush_dte(iommu, alias); |
4004 | } | 4004 | } |
4005 | 4005 | ||
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index b76c58dbe30c..0e08545d7298 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c | |||
@@ -788,7 +788,7 @@ static void __init set_device_exclusion_range(u16 devid, struct ivmd_header *m) | |||
788 | * per device. But we can enable the exclusion range per | 788 | * per device. But we can enable the exclusion range per |
789 | * device. This is done here | 789 | * device. This is done here |
790 | */ | 790 | */ |
791 | set_dev_entry_bit(m->devid, DEV_ENTRY_EX); | 791 | set_dev_entry_bit(devid, DEV_ENTRY_EX); |
792 | iommu->exclusion_start = m->range_start; | 792 | iommu->exclusion_start = m->range_start; |
793 | iommu->exclusion_length = m->range_length; | 793 | iommu->exclusion_length = m->range_length; |
794 | } | 794 | } |
diff --git a/drivers/iommu/amd_iommu_v2.c b/drivers/iommu/amd_iommu_v2.c index 5208828792e6..203b2e6a91cf 100644 --- a/drivers/iommu/amd_iommu_v2.c +++ b/drivers/iommu/amd_iommu_v2.c | |||
@@ -504,8 +504,10 @@ static void do_fault(struct work_struct *work) | |||
504 | 504 | ||
505 | write = !!(fault->flags & PPR_FAULT_WRITE); | 505 | write = !!(fault->flags & PPR_FAULT_WRITE); |
506 | 506 | ||
507 | down_read(&fault->state->mm->mmap_sem); | ||
507 | npages = get_user_pages(fault->state->task, fault->state->mm, | 508 | npages = get_user_pages(fault->state->task, fault->state->mm, |
508 | fault->address, 1, write, 0, &page, NULL); | 509 | fault->address, 1, write, 0, &page, NULL); |
510 | up_read(&fault->state->mm->mmap_sem); | ||
509 | 511 | ||
510 | if (npages == 1) { | 512 | if (npages == 1) { |
511 | put_page(page); | 513 | put_page(page); |
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c index 8b89e33a89fe..647c3c7fd742 100644 --- a/drivers/iommu/arm-smmu.c +++ b/drivers/iommu/arm-smmu.c | |||
@@ -1381,7 +1381,7 @@ static int arm_smmu_alloc_init_pmd(struct arm_smmu_device *smmu, pud_t *pud, | |||
1381 | 1381 | ||
1382 | do { | 1382 | do { |
1383 | next = pmd_addr_end(addr, end); | 1383 | next = pmd_addr_end(addr, end); |
1384 | ret = arm_smmu_alloc_init_pte(smmu, pmd, addr, end, pfn, | 1384 | ret = arm_smmu_alloc_init_pte(smmu, pmd, addr, next, pfn, |
1385 | prot, stage); | 1385 | prot, stage); |
1386 | phys += next - addr; | 1386 | phys += next - addr; |
1387 | } while (pmd++, addr = next, addr < end); | 1387 | } while (pmd++, addr = next, addr < end); |
@@ -1499,7 +1499,7 @@ static size_t arm_smmu_unmap(struct iommu_domain *domain, unsigned long iova, | |||
1499 | 1499 | ||
1500 | ret = arm_smmu_handle_mapping(smmu_domain, iova, 0, size, 0); | 1500 | ret = arm_smmu_handle_mapping(smmu_domain, iova, 0, size, 0); |
1501 | arm_smmu_tlb_inv_context(&smmu_domain->root_cfg); | 1501 | arm_smmu_tlb_inv_context(&smmu_domain->root_cfg); |
1502 | return ret ? ret : size; | 1502 | return ret ? 0 : size; |
1503 | } | 1503 | } |
1504 | 1504 | ||
1505 | static phys_addr_t arm_smmu_iova_to_phys(struct iommu_domain *domain, | 1505 | static phys_addr_t arm_smmu_iova_to_phys(struct iommu_domain *domain, |
diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c index f445c10df8df..39f8b717fe84 100644 --- a/drivers/iommu/dmar.c +++ b/drivers/iommu/dmar.c | |||
@@ -152,7 +152,8 @@ dmar_alloc_pci_notify_info(struct pci_dev *dev, unsigned long event) | |||
152 | info->seg = pci_domain_nr(dev->bus); | 152 | info->seg = pci_domain_nr(dev->bus); |
153 | info->level = level; | 153 | info->level = level; |
154 | if (event == BUS_NOTIFY_ADD_DEVICE) { | 154 | if (event == BUS_NOTIFY_ADD_DEVICE) { |
155 | for (tmp = dev, level--; tmp; tmp = tmp->bus->self) { | 155 | for (tmp = dev; tmp; tmp = tmp->bus->self) { |
156 | level--; | ||
156 | info->path[level].device = PCI_SLOT(tmp->devfn); | 157 | info->path[level].device = PCI_SLOT(tmp->devfn); |
157 | info->path[level].function = PCI_FUNC(tmp->devfn); | 158 | info->path[level].function = PCI_FUNC(tmp->devfn); |
158 | if (pci_is_root_bus(tmp->bus)) | 159 | if (pci_is_root_bus(tmp->bus)) |
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 69fa7da5e48b..f256ffc02e29 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c | |||
@@ -1009,11 +1009,13 @@ static struct page *dma_pte_list_pagetables(struct dmar_domain *domain, | |||
1009 | if (level == 1) | 1009 | if (level == 1) |
1010 | return freelist; | 1010 | return freelist; |
1011 | 1011 | ||
1012 | for (pte = page_address(pg); !first_pte_in_page(pte); pte++) { | 1012 | pte = page_address(pg); |
1013 | do { | ||
1013 | if (dma_pte_present(pte) && !dma_pte_superpage(pte)) | 1014 | if (dma_pte_present(pte) && !dma_pte_superpage(pte)) |
1014 | freelist = dma_pte_list_pagetables(domain, level - 1, | 1015 | freelist = dma_pte_list_pagetables(domain, level - 1, |
1015 | pte, freelist); | 1016 | pte, freelist); |
1016 | } | 1017 | pte++; |
1018 | } while (!first_pte_in_page(pte)); | ||
1017 | 1019 | ||
1018 | return freelist; | 1020 | return freelist; |
1019 | } | 1021 | } |
@@ -2235,7 +2237,9 @@ static struct dmar_domain *get_domain_for_dev(struct device *dev, int gaw) | |||
2235 | bridge_devfn = dev_tmp->devfn; | 2237 | bridge_devfn = dev_tmp->devfn; |
2236 | } | 2238 | } |
2237 | spin_lock_irqsave(&device_domain_lock, flags); | 2239 | spin_lock_irqsave(&device_domain_lock, flags); |
2238 | info = dmar_search_domain_by_dev_info(segment, bus, devfn); | 2240 | info = dmar_search_domain_by_dev_info(segment, |
2241 | bridge_bus, | ||
2242 | bridge_devfn); | ||
2239 | if (info) { | 2243 | if (info) { |
2240 | iommu = info->iommu; | 2244 | iommu = info->iommu; |
2241 | domain = info->domain; | 2245 | domain = info->domain; |