Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'iommu-memory-accounting' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/joro/iommu intoiommufd/for-next

Jason Gunthorpe says:

====================
iommufd follows the same design as KVM and uses memory cgroups to limit
the amount of kernel memory a iommufd file descriptor can pin down. The
various internal data structures already use GFP_KERNEL_ACCOUNT to charge
its own memory.

However, one of the biggest consumers of kernel memory is the IOPTEs
stored under the iommu_domain and these allocations are not tracked.

This series is the first step in fixing it.

The iommu driver contract already includes a 'gfp' argument to the
map_pages op, allowing iommufd to specify GFP_KERNEL_ACCOUNT and then
having the driver allocate the IOPTE tables with that flag will capture a
significant amount of the allocations.

Update the iommu_map() API to pass in the GFP argument, and fix all call
sites. Replace iommu_map_atomic().

Audit the "enterprise" iommu drivers to make sure they do the right thing.
Intel and S390 ignore the GFP argument and always use GFP_ATOMIC. This is
problematic for iommufd anyhow, so fix it. AMD and ARM SMMUv2/3 are
already correct.

A follow up series will be needed to capture the allocations made when the
iommu_domain itself is allocated, which will complete the job.
====================

* 'iommu-memory-accounting' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/joro/iommu:
iommu/s390: Use GFP_KERNEL in sleepable contexts
iommu/s390: Push the gfp parameter to the kmem_cache_alloc()'s
iommu/intel: Use GFP_KERNEL in sleepable contexts
iommu/intel: Support the gfp argument to the map_pages op
iommu/intel: Add a gfp parameter to alloc_pgtable_page()
iommufd: Use GFP_KERNEL_ACCOUNT for iommu_map()
iommu/dma: Use the gfp parameter in __iommu_dma_alloc_noncontiguous()
iommu: Add a gfp parameter to iommu_map_sg()
iommu: Remove iommu_map_atomic()
iommu: Add a gfp parameter to iommu_map()

Link: https://lore.kernel.org/linux-iommu/0-v3-76b587fe28df+6e3-iommu_map_gfp_jgg@nvidia.com
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>

+126 -125
+7 -4
arch/arm/mm/dma-mapping.c
··· 984 984 985 985 len = (j - i) << PAGE_SHIFT; 986 986 ret = iommu_map(mapping->domain, iova, phys, len, 987 - __dma_info_to_prot(DMA_BIDIRECTIONAL, attrs)); 987 + __dma_info_to_prot(DMA_BIDIRECTIONAL, attrs), 988 + GFP_KERNEL); 988 989 if (ret < 0) 989 990 goto fail; 990 991 iova += len; ··· 1208 1207 1209 1208 prot = __dma_info_to_prot(dir, attrs); 1210 1209 1211 - ret = iommu_map(mapping->domain, iova, phys, len, prot); 1210 + ret = iommu_map(mapping->domain, iova, phys, len, prot, 1211 + GFP_KERNEL); 1212 1212 if (ret < 0) 1213 1213 goto fail; 1214 1214 count += len >> PAGE_SHIFT; ··· 1381 1379 1382 1380 prot = __dma_info_to_prot(dir, attrs); 1383 1381 1384 - ret = iommu_map(mapping->domain, dma_addr, page_to_phys(page), len, prot); 1382 + ret = iommu_map(mapping->domain, dma_addr, page_to_phys(page), len, 1383 + prot, GFP_KERNEL); 1385 1384 if (ret < 0) 1386 1385 goto fail; 1387 1386 ··· 1446 1443 1447 1444 prot = __dma_info_to_prot(dir, attrs) | IOMMU_MMIO; 1448 1445 1449 - ret = iommu_map(mapping->domain, dma_addr, addr, len, prot); 1446 + ret = iommu_map(mapping->domain, dma_addr, addr, len, prot, GFP_KERNEL); 1450 1447 if (ret < 0) 1451 1448 goto fail; 1452 1449
+3 -2
arch/s390/include/asm/pci_dma.h
··· 186 186 187 187 /* Prototypes */ 188 188 void dma_free_seg_table(unsigned long); 189 - unsigned long *dma_alloc_cpu_table(void); 189 + unsigned long *dma_alloc_cpu_table(gfp_t gfp); 190 190 void dma_cleanup_tables(unsigned long *); 191 - unsigned long *dma_walk_cpu_trans(unsigned long *rto, dma_addr_t dma_addr); 191 + unsigned long *dma_walk_cpu_trans(unsigned long *rto, dma_addr_t dma_addr, 192 + gfp_t gfp); 192 193 void dma_update_cpu_trans(unsigned long *entry, phys_addr_t page_addr, int flags); 193 194 194 195 extern const struct dma_map_ops s390_pci_dma_ops;
+17 -14
arch/s390/pci/pci_dma.c
··· 27 27 zdev->iommu_pages * PAGE_SIZE); 28 28 } 29 29 30 - unsigned long *dma_alloc_cpu_table(void) 30 + unsigned long *dma_alloc_cpu_table(gfp_t gfp) 31 31 { 32 32 unsigned long *table, *entry; 33 33 34 - table = kmem_cache_alloc(dma_region_table_cache, GFP_ATOMIC); 34 + table = kmem_cache_alloc(dma_region_table_cache, gfp); 35 35 if (!table) 36 36 return NULL; 37 37 ··· 45 45 kmem_cache_free(dma_region_table_cache, table); 46 46 } 47 47 48 - static unsigned long *dma_alloc_page_table(void) 48 + static unsigned long *dma_alloc_page_table(gfp_t gfp) 49 49 { 50 50 unsigned long *table, *entry; 51 51 52 - table = kmem_cache_alloc(dma_page_table_cache, GFP_ATOMIC); 52 + table = kmem_cache_alloc(dma_page_table_cache, gfp); 53 53 if (!table) 54 54 return NULL; 55 55 ··· 63 63 kmem_cache_free(dma_page_table_cache, table); 64 64 } 65 65 66 - static unsigned long *dma_get_seg_table_origin(unsigned long *rtep) 66 + static unsigned long *dma_get_seg_table_origin(unsigned long *rtep, gfp_t gfp) 67 67 { 68 68 unsigned long old_rte, rte; 69 69 unsigned long *sto; ··· 72 72 if (reg_entry_isvalid(rte)) { 73 73 sto = get_rt_sto(rte); 74 74 } else { 75 - sto = dma_alloc_cpu_table(); 75 + sto = dma_alloc_cpu_table(gfp); 76 76 if (!sto) 77 77 return NULL; 78 78 ··· 90 90 return sto; 91 91 } 92 92 93 - static unsigned long *dma_get_page_table_origin(unsigned long *step) 93 + static unsigned long *dma_get_page_table_origin(unsigned long *step, gfp_t gfp) 94 94 { 95 95 unsigned long old_ste, ste; 96 96 unsigned long *pto; ··· 99 99 if (reg_entry_isvalid(ste)) { 100 100 pto = get_st_pto(ste); 101 101 } else { 102 - pto = dma_alloc_page_table(); 102 + pto = dma_alloc_page_table(gfp); 103 103 if (!pto) 104 104 return NULL; 105 105 set_st_pto(&ste, virt_to_phys(pto)); ··· 116 116 return pto; 117 117 } 118 118 119 - unsigned long *dma_walk_cpu_trans(unsigned long *rto, dma_addr_t dma_addr) 119 + unsigned long *dma_walk_cpu_trans(unsigned long *rto, dma_addr_t dma_addr, 120 + gfp_t gfp) 120 121 { 121 122 unsigned long *sto, *pto; 122 123 unsigned int rtx, sx, px; 123 124 124 125 rtx = calc_rtx(dma_addr); 125 - sto = dma_get_seg_table_origin(&rto[rtx]); 126 + sto = dma_get_seg_table_origin(&rto[rtx], gfp); 126 127 if (!sto) 127 128 return NULL; 128 129 129 130 sx = calc_sx(dma_addr); 130 - pto = dma_get_page_table_origin(&sto[sx]); 131 + pto = dma_get_page_table_origin(&sto[sx], gfp); 131 132 if (!pto) 132 133 return NULL; 133 134 ··· 171 170 return -EINVAL; 172 171 173 172 for (i = 0; i < nr_pages; i++) { 174 - entry = dma_walk_cpu_trans(zdev->dma_table, dma_addr); 173 + entry = dma_walk_cpu_trans(zdev->dma_table, dma_addr, 174 + GFP_ATOMIC); 175 175 if (!entry) { 176 176 rc = -ENOMEM; 177 177 goto undo_cpu_trans; ··· 188 186 while (i-- > 0) { 189 187 page_addr -= PAGE_SIZE; 190 188 dma_addr -= PAGE_SIZE; 191 - entry = dma_walk_cpu_trans(zdev->dma_table, dma_addr); 189 + entry = dma_walk_cpu_trans(zdev->dma_table, dma_addr, 190 + GFP_ATOMIC); 192 191 if (!entry) 193 192 break; 194 193 dma_update_cpu_trans(entry, page_addr, flags); ··· 579 576 580 577 spin_lock_init(&zdev->iommu_bitmap_lock); 581 578 582 - zdev->dma_table = dma_alloc_cpu_table(); 579 + zdev->dma_table = dma_alloc_cpu_table(GFP_KERNEL); 583 580 if (!zdev->dma_table) { 584 581 rc = -ENOMEM; 585 582 goto out;
+2 -1
drivers/gpu/drm/nouveau/nvkm/subdev/instmem/gk20a.c
··· 475 475 u32 offset = (r->offset + i) << imem->iommu_pgshift; 476 476 477 477 ret = iommu_map(imem->domain, offset, node->dma_addrs[i], 478 - PAGE_SIZE, IOMMU_READ | IOMMU_WRITE); 478 + PAGE_SIZE, IOMMU_READ | IOMMU_WRITE, 479 + GFP_KERNEL); 479 480 if (ret < 0) { 480 481 nvkm_error(subdev, "IOMMU mapping failure: %d\n", ret); 481 482
+1 -1
drivers/gpu/drm/tegra/drm.c
··· 1057 1057 1058 1058 *dma = iova_dma_addr(&tegra->carveout.domain, alloc); 1059 1059 err = iommu_map(tegra->domain, *dma, virt_to_phys(virt), 1060 - size, IOMMU_READ | IOMMU_WRITE); 1060 + size, IOMMU_READ | IOMMU_WRITE, GFP_KERNEL); 1061 1061 if (err < 0) 1062 1062 goto free_iova; 1063 1063
+1 -1
drivers/gpu/host1x/cdma.c
··· 105 105 106 106 pb->dma = iova_dma_addr(&host1x->iova, alloc); 107 107 err = iommu_map(host1x->domain, pb->dma, pb->phys, size, 108 - IOMMU_READ); 108 + IOMMU_READ, GFP_KERNEL); 109 109 if (err) 110 110 goto iommu_free_iova; 111 111 } else {
+2 -2
drivers/infiniband/hw/usnic/usnic_uiom.c
··· 277 277 usnic_dbg("va 0x%lx pa %pa size 0x%zx flags 0x%x", 278 278 va_start, &pa_start, size, flags); 279 279 err = iommu_map(pd->domain, va_start, pa_start, 280 - size, flags); 280 + size, flags, GFP_KERNEL); 281 281 if (err) { 282 282 usnic_err("Failed to map va 0x%lx pa %pa size 0x%zx with err %d\n", 283 283 va_start, &pa_start, size, err); ··· 294 294 usnic_dbg("va 0x%lx pa %pa size 0x%zx flags 0x%x\n", 295 295 va_start, &pa_start, size, flags); 296 296 err = iommu_map(pd->domain, va_start, pa_start, 297 - size, flags); 297 + size, flags, GFP_KERNEL); 298 298 if (err) { 299 299 usnic_err("Failed to map va 0x%lx pa %pa size 0x%zx with err %d\n", 300 300 va_start, &pa_start, size, err);
+13 -5
drivers/iommu/dma-iommu.c
··· 713 713 if (!iova) 714 714 return DMA_MAPPING_ERROR; 715 715 716 - if (iommu_map_atomic(domain, iova, phys - iova_off, size, prot)) { 716 + if (iommu_map(domain, iova, phys - iova_off, size, prot, GFP_ATOMIC)) { 717 717 iommu_dma_free_iova(cookie, iova, size, NULL); 718 718 return DMA_MAPPING_ERROR; 719 719 } ··· 822 822 if (!iova) 823 823 goto out_free_pages; 824 824 825 - if (sg_alloc_table_from_pages(sgt, pages, count, 0, size, GFP_KERNEL)) 825 + /* 826 + * Remove the zone/policy flags from the GFP - these are applied to the 827 + * __iommu_dma_alloc_pages() but are not used for the supporting 828 + * internal allocations that follow. 829 + */ 830 + gfp &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM | __GFP_COMP); 831 + 832 + if (sg_alloc_table_from_pages(sgt, pages, count, 0, size, gfp)) 826 833 goto out_free_iova; 827 834 828 835 if (!(ioprot & IOMMU_CACHE)) { ··· 840 833 arch_dma_prep_coherent(sg_page(sg), sg->length); 841 834 } 842 835 843 - ret = iommu_map_sg_atomic(domain, iova, sgt->sgl, sgt->orig_nents, ioprot); 836 + ret = iommu_map_sg(domain, iova, sgt->sgl, sgt->orig_nents, ioprot, 837 + gfp); 844 838 if (ret < 0 || ret < size) 845 839 goto out_free_sg; 846 840 ··· 1289 1281 * We'll leave any physical concatenation to the IOMMU driver's 1290 1282 * implementation - it knows better than we do. 1291 1283 */ 1292 - ret = iommu_map_sg_atomic(domain, iova, sg, nents, prot); 1284 + ret = iommu_map_sg(domain, iova, sg, nents, prot, GFP_ATOMIC); 1293 1285 if (ret < 0 || ret < iova_len) 1294 1286 goto out_free_iova; 1295 1287 ··· 1623 1615 if (!iova) 1624 1616 goto out_free_page; 1625 1617 1626 - if (iommu_map(domain, iova, msi_addr, size, prot)) 1618 + if (iommu_map(domain, iova, msi_addr, size, prot, GFP_KERNEL)) 1627 1619 goto out_free_iova; 1628 1620 1629 1621 INIT_LIST_HEAD(&msi_page->list);
+21 -15
drivers/iommu/intel/iommu.c
··· 362 362 } 363 363 __setup("intel_iommu=", intel_iommu_setup); 364 364 365 - void *alloc_pgtable_page(int node) 365 + void *alloc_pgtable_page(int node, gfp_t gfp) 366 366 { 367 367 struct page *page; 368 368 void *vaddr = NULL; 369 369 370 - page = alloc_pages_node(node, GFP_ATOMIC | __GFP_ZERO, 0); 370 + page = alloc_pages_node(node, gfp | __GFP_ZERO, 0); 371 371 if (page) 372 372 vaddr = page_address(page); 373 373 return vaddr; ··· 612 612 if (!alloc) 613 613 return NULL; 614 614 615 - context = alloc_pgtable_page(iommu->node); 615 + context = alloc_pgtable_page(iommu->node, GFP_ATOMIC); 616 616 if (!context) 617 617 return NULL; 618 618 ··· 908 908 #endif 909 909 910 910 static struct dma_pte *pfn_to_dma_pte(struct dmar_domain *domain, 911 - unsigned long pfn, int *target_level) 911 + unsigned long pfn, int *target_level, 912 + gfp_t gfp) 912 913 { 913 914 struct dma_pte *parent, *pte; 914 915 int level = agaw_to_level(domain->agaw); ··· 936 935 if (!dma_pte_present(pte)) { 937 936 uint64_t pteval; 938 937 939 - tmp_page = alloc_pgtable_page(domain->nid); 938 + tmp_page = alloc_pgtable_page(domain->nid, gfp); 940 939 941 940 if (!tmp_page) 942 941 return NULL; ··· 1187 1186 { 1188 1187 struct root_entry *root; 1189 1188 1190 - root = (struct root_entry *)alloc_pgtable_page(iommu->node); 1189 + root = (struct root_entry *)alloc_pgtable_page(iommu->node, GFP_ATOMIC); 1191 1190 if (!root) { 1192 1191 pr_err("Allocating root entry for %s failed\n", 1193 1192 iommu->name); ··· 2151 2150 2152 2151 while (start_pfn <= end_pfn) { 2153 2152 if (!pte) 2154 - pte = pfn_to_dma_pte(domain, start_pfn, &level); 2153 + pte = pfn_to_dma_pte(domain, start_pfn, &level, 2154 + GFP_ATOMIC); 2155 2155 2156 2156 if (dma_pte_present(pte)) { 2157 2157 dma_pte_free_pagetable(domain, start_pfn, ··· 2174 2172 2175 2173 static int 2176 2174 __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn, 2177 - unsigned long phys_pfn, unsigned long nr_pages, int prot) 2175 + unsigned long phys_pfn, unsigned long nr_pages, int prot, 2176 + gfp_t gfp) 2178 2177 { 2179 2178 struct dma_pte *first_pte = NULL, *pte = NULL; 2180 2179 unsigned int largepage_lvl = 0; ··· 2205 2202 largepage_lvl = hardware_largepage_caps(domain, iov_pfn, 2206 2203 phys_pfn, nr_pages); 2207 2204 2208 - pte = pfn_to_dma_pte(domain, iov_pfn, &largepage_lvl); 2205 + pte = pfn_to_dma_pte(domain, iov_pfn, &largepage_lvl, 2206 + gfp); 2209 2207 if (!pte) 2210 2208 return -ENOMEM; 2211 2209 first_pte = pte; ··· 2372 2368 2373 2369 return __domain_mapping(domain, first_vpfn, 2374 2370 first_vpfn, last_vpfn - first_vpfn + 1, 2375 - DMA_PTE_READ|DMA_PTE_WRITE); 2371 + DMA_PTE_READ|DMA_PTE_WRITE, GFP_KERNEL); 2376 2372 } 2377 2373 2378 2374 static int md_domain_init(struct dmar_domain *domain, int guest_width); ··· 2680 2676 if (!old_ce) 2681 2677 goto out; 2682 2678 2683 - new_ce = alloc_pgtable_page(iommu->node); 2679 + new_ce = alloc_pgtable_page(iommu->node, GFP_KERNEL); 2684 2680 if (!new_ce) 2685 2681 goto out_unmap; 2686 2682 ··· 4140 4136 domain->max_addr = 0; 4141 4137 4142 4138 /* always allocate the top pgd */ 4143 - domain->pgd = alloc_pgtable_page(domain->nid); 4139 + domain->pgd = alloc_pgtable_page(domain->nid, GFP_ATOMIC); 4144 4140 if (!domain->pgd) 4145 4141 return -ENOMEM; 4146 4142 domain_flush_cache(domain, domain->pgd, PAGE_SIZE); ··· 4302 4298 the low bits of hpa would take us onto the next page */ 4303 4299 size = aligned_nrpages(hpa, size); 4304 4300 return __domain_mapping(dmar_domain, iova >> VTD_PAGE_SHIFT, 4305 - hpa >> VTD_PAGE_SHIFT, size, prot); 4301 + hpa >> VTD_PAGE_SHIFT, size, prot, gfp); 4306 4302 } 4307 4303 4308 4304 static int intel_iommu_map_pages(struct iommu_domain *domain, ··· 4337 4333 4338 4334 /* Cope with horrid API which requires us to unmap more than the 4339 4335 size argument if it happens to be a large-page mapping. */ 4340 - BUG_ON(!pfn_to_dma_pte(dmar_domain, iova >> VTD_PAGE_SHIFT, &level)); 4336 + BUG_ON(!pfn_to_dma_pte(dmar_domain, iova >> VTD_PAGE_SHIFT, &level, 4337 + GFP_ATOMIC)); 4341 4338 4342 4339 if (size < VTD_PAGE_SIZE << level_to_offset_bits(level)) 4343 4340 size = VTD_PAGE_SIZE << level_to_offset_bits(level); ··· 4397 4392 int level = 0; 4398 4393 u64 phys = 0; 4399 4394 4400 - pte = pfn_to_dma_pte(dmar_domain, iova >> VTD_PAGE_SHIFT, &level); 4395 + pte = pfn_to_dma_pte(dmar_domain, iova >> VTD_PAGE_SHIFT, &level, 4396 + GFP_ATOMIC); 4401 4397 if (pte && dma_pte_present(pte)) 4402 4398 phys = dma_pte_addr(pte) + 4403 4399 (iova & (BIT_MASK(level_to_offset_bits(level) +
+1 -1
drivers/iommu/intel/iommu.h
··· 737 737 738 738 extern int dmar_ir_support(void); 739 739 740 - void *alloc_pgtable_page(int node); 740 + void *alloc_pgtable_page(int node, gfp_t gfp); 741 741 void free_pgtable_page(void *vaddr); 742 742 void iommu_flush_write_buffer(struct intel_iommu *iommu); 743 743 struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devfn);
+1 -1
drivers/iommu/intel/pasid.c
··· 200 200 retry: 201 201 entries = get_pasid_table_from_pde(&dir[dir_index]); 202 202 if (!entries) { 203 - entries = alloc_pgtable_page(info->iommu->node); 203 + entries = alloc_pgtable_page(info->iommu->node, GFP_ATOMIC); 204 204 if (!entries) 205 205 return NULL; 206 206
+20 -33
drivers/iommu/iommu.c
··· 931 931 if (map_size) { 932 932 ret = iommu_map(domain, addr - map_size, 933 933 addr - map_size, map_size, 934 - entry->prot); 934 + entry->prot, GFP_KERNEL); 935 935 if (ret) 936 936 goto out; 937 937 map_size = 0; ··· 2384 2384 return ret; 2385 2385 } 2386 2386 2387 - static int _iommu_map(struct iommu_domain *domain, unsigned long iova, 2388 - phys_addr_t paddr, size_t size, int prot, gfp_t gfp) 2387 + int iommu_map(struct iommu_domain *domain, unsigned long iova, 2388 + phys_addr_t paddr, size_t size, int prot, gfp_t gfp) 2389 2389 { 2390 2390 const struct iommu_domain_ops *ops = domain->ops; 2391 2391 int ret; 2392 + 2393 + might_sleep_if(gfpflags_allow_blocking(gfp)); 2394 + 2395 + /* Discourage passing strange GFP flags */ 2396 + if (WARN_ON_ONCE(gfp & (__GFP_COMP | __GFP_DMA | __GFP_DMA32 | 2397 + __GFP_HIGHMEM))) 2398 + return -EINVAL; 2392 2399 2393 2400 ret = __iommu_map(domain, iova, paddr, size, prot, gfp); 2394 2401 if (ret == 0 && ops->iotlb_sync_map) ··· 2403 2396 2404 2397 return ret; 2405 2398 } 2406 - 2407 - int iommu_map(struct iommu_domain *domain, unsigned long iova, 2408 - phys_addr_t paddr, size_t size, int prot) 2409 - { 2410 - might_sleep(); 2411 - return _iommu_map(domain, iova, paddr, size, prot, GFP_KERNEL); 2412 - } 2413 2399 EXPORT_SYMBOL_GPL(iommu_map); 2414 - 2415 - int iommu_map_atomic(struct iommu_domain *domain, unsigned long iova, 2416 - phys_addr_t paddr, size_t size, int prot) 2417 - { 2418 - return _iommu_map(domain, iova, paddr, size, prot, GFP_ATOMIC); 2419 - } 2420 - EXPORT_SYMBOL_GPL(iommu_map_atomic); 2421 2400 2422 2401 static size_t __iommu_unmap_pages(struct iommu_domain *domain, 2423 2402 unsigned long iova, size_t size, ··· 2494 2501 } 2495 2502 EXPORT_SYMBOL_GPL(iommu_unmap_fast); 2496 2503 2497 - static ssize_t __iommu_map_sg(struct iommu_domain *domain, unsigned long iova, 2498 - struct scatterlist *sg, unsigned int nents, int prot, 2499 - gfp_t gfp) 2504 + ssize_t iommu_map_sg(struct iommu_domain *domain, unsigned long iova, 2505 + struct scatterlist *sg, unsigned int nents, int prot, 2506 + gfp_t gfp) 2500 2507 { 2501 2508 const struct iommu_domain_ops *ops = domain->ops; 2502 2509 size_t len = 0, mapped = 0; 2503 2510 phys_addr_t start; 2504 2511 unsigned int i = 0; 2505 2512 int ret; 2513 + 2514 + might_sleep_if(gfpflags_allow_blocking(gfp)); 2515 + 2516 + /* Discourage passing strange GFP flags */ 2517 + if (WARN_ON_ONCE(gfp & (__GFP_COMP | __GFP_DMA | __GFP_DMA32 | 2518 + __GFP_HIGHMEM))) 2519 + return -EINVAL; 2506 2520 2507 2521 while (i <= nents) { 2508 2522 phys_addr_t s_phys = sg_phys(sg); ··· 2550 2550 2551 2551 return ret; 2552 2552 } 2553 - 2554 - ssize_t iommu_map_sg(struct iommu_domain *domain, unsigned long iova, 2555 - struct scatterlist *sg, unsigned int nents, int prot) 2556 - { 2557 - might_sleep(); 2558 - return __iommu_map_sg(domain, iova, sg, nents, prot, GFP_KERNEL); 2559 - } 2560 2553 EXPORT_SYMBOL_GPL(iommu_map_sg); 2561 - 2562 - ssize_t iommu_map_sg_atomic(struct iommu_domain *domain, unsigned long iova, 2563 - struct scatterlist *sg, unsigned int nents, int prot) 2564 - { 2565 - return __iommu_map_sg(domain, iova, sg, nents, prot, GFP_ATOMIC); 2566 - } 2567 2554 2568 2555 /** 2569 2556 * report_iommu_fault() - report about an IOMMU fault to the IOMMU framework
+4 -2
drivers/iommu/iommufd/pages.c
··· 456 456 size % PAGE_SIZE); 457 457 458 458 while (size) { 459 - rc = iommu_map(domain, iova, paddr, PAGE_SIZE, prot); 459 + rc = iommu_map(domain, iova, paddr, PAGE_SIZE, prot, 460 + GFP_KERNEL_ACCOUNT); 460 461 if (rc) 461 462 goto err_unmap; 462 463 iova += PAGE_SIZE; ··· 501 500 else 502 501 rc = iommu_map(domain, iova, 503 502 PFN_PHYS(batch->pfns[cur]) + page_offset, 504 - next_iova - iova, area->iommu_prot); 503 + next_iova - iova, area->iommu_prot, 504 + GFP_KERNEL_ACCOUNT); 505 505 if (rc) 506 506 goto err_unmap; 507 507 iova = next_iova;
+9 -6
drivers/iommu/s390-iommu.c
··· 50 50 if (!s390_domain) 51 51 return NULL; 52 52 53 - s390_domain->dma_table = dma_alloc_cpu_table(); 53 + s390_domain->dma_table = dma_alloc_cpu_table(GFP_KERNEL); 54 54 if (!s390_domain->dma_table) { 55 55 kfree(s390_domain); 56 56 return NULL; ··· 258 258 259 259 static int s390_iommu_validate_trans(struct s390_domain *s390_domain, 260 260 phys_addr_t pa, dma_addr_t dma_addr, 261 - unsigned long nr_pages, int flags) 261 + unsigned long nr_pages, int flags, 262 + gfp_t gfp) 262 263 { 263 264 phys_addr_t page_addr = pa & PAGE_MASK; 264 265 unsigned long *entry; ··· 267 266 int rc; 268 267 269 268 for (i = 0; i < nr_pages; i++) { 270 - entry = dma_walk_cpu_trans(s390_domain->dma_table, dma_addr); 269 + entry = dma_walk_cpu_trans(s390_domain->dma_table, dma_addr, 270 + gfp); 271 271 if (unlikely(!entry)) { 272 272 rc = -ENOMEM; 273 273 goto undo_cpu_trans; ··· 284 282 while (i-- > 0) { 285 283 dma_addr -= PAGE_SIZE; 286 284 entry = dma_walk_cpu_trans(s390_domain->dma_table, 287 - dma_addr); 285 + dma_addr, gfp); 288 286 if (!entry) 289 287 break; 290 288 dma_update_cpu_trans(entry, 0, ZPCI_PTE_INVALID); ··· 301 299 int rc = 0; 302 300 303 301 for (i = 0; i < nr_pages; i++) { 304 - entry = dma_walk_cpu_trans(s390_domain->dma_table, dma_addr); 302 + entry = dma_walk_cpu_trans(s390_domain->dma_table, dma_addr, 303 + GFP_ATOMIC); 305 304 if (unlikely(!entry)) { 306 305 rc = -EINVAL; 307 306 break; ··· 340 337 flags |= ZPCI_TABLE_PROTECTED; 341 338 342 339 rc = s390_iommu_validate_trans(s390_domain, paddr, iova, 343 - pgcount, flags); 340 + pgcount, flags, gfp); 344 341 if (!rc) 345 342 *mapped = size; 346 343
+1 -1
drivers/media/platform/qcom/venus/firmware.c
··· 158 158 core->fw.mapped_mem_size = mem_size; 159 159 160 160 ret = iommu_map(iommu, VENUS_FW_START_ADDR, mem_phys, mem_size, 161 - IOMMU_READ | IOMMU_WRITE | IOMMU_PRIV); 161 + IOMMU_READ | IOMMU_WRITE | IOMMU_PRIV, GFP_KERNEL); 162 162 if (ret) { 163 163 dev_err(dev, "could not map video firmware region\n"); 164 164 return ret;
+4 -2
drivers/net/ipa/ipa_mem.c
··· 466 466 size = PAGE_ALIGN(size + addr - phys); 467 467 iova = phys; /* We just want a direct mapping */ 468 468 469 - ret = iommu_map(domain, iova, phys, size, IOMMU_READ | IOMMU_WRITE); 469 + ret = iommu_map(domain, iova, phys, size, IOMMU_READ | IOMMU_WRITE, 470 + GFP_KERNEL); 470 471 if (ret) 471 472 return ret; 472 473 ··· 575 574 size = PAGE_ALIGN(size + addr - phys); 576 575 iova = phys; /* We just want a direct mapping */ 577 576 578 - ret = iommu_map(domain, iova, phys, size, IOMMU_READ | IOMMU_WRITE); 577 + ret = iommu_map(domain, iova, phys, size, IOMMU_READ | IOMMU_WRITE, 578 + GFP_KERNEL); 579 579 if (ret) 580 580 return ret; 581 581
+1 -1
drivers/net/wireless/ath/ath10k/snoc.c
··· 1639 1639 1640 1640 ret = iommu_map(iommu_dom, ar_snoc->fw.fw_start_addr, 1641 1641 ar->msa.paddr, ar->msa.mem_size, 1642 - IOMMU_READ | IOMMU_WRITE); 1642 + IOMMU_READ | IOMMU_WRITE, GFP_KERNEL); 1643 1643 if (ret) { 1644 1644 ath10k_err(ar, "failed to map firmware region: %d\n", ret); 1645 1645 goto err_iommu_detach;
+2 -2
drivers/net/wireless/ath/ath11k/ahb.c
··· 1021 1021 1022 1022 ret = iommu_map(iommu_dom, ab_ahb->fw.msa_paddr, 1023 1023 ab_ahb->fw.msa_paddr, ab_ahb->fw.msa_size, 1024 - IOMMU_READ | IOMMU_WRITE); 1024 + IOMMU_READ | IOMMU_WRITE, GFP_KERNEL); 1025 1025 if (ret) { 1026 1026 ath11k_err(ab, "failed to map firmware region: %d\n", ret); 1027 1027 goto err_iommu_detach; ··· 1029 1029 1030 1030 ret = iommu_map(iommu_dom, ab_ahb->fw.ce_paddr, 1031 1031 ab_ahb->fw.ce_paddr, ab_ahb->fw.ce_size, 1032 - IOMMU_READ | IOMMU_WRITE); 1032 + IOMMU_READ | IOMMU_WRITE, GFP_KERNEL); 1033 1033 if (ret) { 1034 1034 ath11k_err(ab, "failed to map firmware CE region: %d\n", ret); 1035 1035 goto err_iommu_unmap;
+3 -2
drivers/remoteproc/remoteproc_core.c
··· 643 643 if (!mapping) 644 644 return -ENOMEM; 645 645 646 - ret = iommu_map(rproc->domain, rsc->da, rsc->pa, rsc->len, rsc->flags); 646 + ret = iommu_map(rproc->domain, rsc->da, rsc->pa, rsc->len, rsc->flags, 647 + GFP_KERNEL); 647 648 if (ret) { 648 649 dev_err(dev, "failed to map devmem: %d\n", ret); 649 650 goto out; ··· 738 737 } 739 738 740 739 ret = iommu_map(rproc->domain, mem->da, dma, mem->len, 741 - mem->flags); 740 + mem->flags, GFP_KERNEL); 742 741 if (ret) { 743 742 dev_err(dev, "iommu_map failed: %d\n", ret); 744 743 goto free_mapping;
+5 -4
drivers/vfio/vfio_iommu_type1.c
··· 1479 1479 1480 1480 list_for_each_entry(d, &iommu->domain_list, next) { 1481 1481 ret = iommu_map(d->domain, iova, (phys_addr_t)pfn << PAGE_SHIFT, 1482 - npage << PAGE_SHIFT, prot | IOMMU_CACHE); 1482 + npage << PAGE_SHIFT, prot | IOMMU_CACHE, 1483 + GFP_KERNEL); 1483 1484 if (ret) 1484 1485 goto unwind; 1485 1486 ··· 1777 1776 size = npage << PAGE_SHIFT; 1778 1777 } 1779 1778 1780 - ret = iommu_map(domain->domain, iova, phys, 1781 - size, dma->prot | IOMMU_CACHE); 1779 + ret = iommu_map(domain->domain, iova, phys, size, 1780 + dma->prot | IOMMU_CACHE, GFP_KERNEL); 1782 1781 if (ret) { 1783 1782 if (!dma->iommu_mapped) { 1784 1783 vfio_unpin_pages_remote(dma, iova, ··· 1866 1865 return; 1867 1866 1868 1867 ret = iommu_map(domain->domain, 0, page_to_phys(pages), PAGE_SIZE * 2, 1869 - IOMMU_READ | IOMMU_WRITE | IOMMU_CACHE); 1868 + IOMMU_READ | IOMMU_WRITE | IOMMU_CACHE, GFP_KERNEL); 1870 1869 if (!ret) { 1871 1870 size_t unmapped = iommu_unmap(domain->domain, 0, PAGE_SIZE); 1872 1871
+1 -1
drivers/vhost/vdpa.c
··· 792 792 r = ops->set_map(vdpa, asid, iotlb); 793 793 } else { 794 794 r = iommu_map(v->domain, iova, pa, size, 795 - perm_to_iommu_flags(perm)); 795 + perm_to_iommu_flags(perm), GFP_KERNEL); 796 796 } 797 797 if (r) { 798 798 vhost_iotlb_del_range(iotlb, iova, iova + size - 1);
+7 -24
include/linux/iommu.h
··· 467 467 extern struct iommu_domain *iommu_get_domain_for_dev(struct device *dev); 468 468 extern struct iommu_domain *iommu_get_dma_domain(struct device *dev); 469 469 extern int iommu_map(struct iommu_domain *domain, unsigned long iova, 470 - phys_addr_t paddr, size_t size, int prot); 471 - extern int iommu_map_atomic(struct iommu_domain *domain, unsigned long iova, 472 - phys_addr_t paddr, size_t size, int prot); 470 + phys_addr_t paddr, size_t size, int prot, gfp_t gfp); 473 471 extern size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, 474 472 size_t size); 475 473 extern size_t iommu_unmap_fast(struct iommu_domain *domain, 476 474 unsigned long iova, size_t size, 477 475 struct iommu_iotlb_gather *iotlb_gather); 478 476 extern ssize_t iommu_map_sg(struct iommu_domain *domain, unsigned long iova, 479 - struct scatterlist *sg, unsigned int nents, int prot); 480 - extern ssize_t iommu_map_sg_atomic(struct iommu_domain *domain, 481 - unsigned long iova, struct scatterlist *sg, 482 - unsigned int nents, int prot); 477 + struct scatterlist *sg, unsigned int nents, 478 + int prot, gfp_t gfp); 483 479 extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova); 484 480 extern void iommu_set_fault_handler(struct iommu_domain *domain, 485 481 iommu_fault_handler_t handler, void *token); ··· 769 773 } 770 774 771 775 static inline int iommu_map(struct iommu_domain *domain, unsigned long iova, 772 - phys_addr_t paddr, size_t size, int prot) 773 - { 774 - return -ENODEV; 775 - } 776 - 777 - static inline int iommu_map_atomic(struct iommu_domain *domain, 778 - unsigned long iova, phys_addr_t paddr, 779 - size_t size, int prot) 776 + phys_addr_t paddr, size_t size, int prot, gfp_t gfp) 780 777 { 781 778 return -ENODEV; 782 779 } ··· 789 800 790 801 static inline ssize_t iommu_map_sg(struct iommu_domain *domain, 791 802 unsigned long iova, struct scatterlist *sg, 792 - unsigned int nents, int prot) 793 - { 794 - return -ENODEV; 795 - } 796 - 797 - static inline ssize_t iommu_map_sg_atomic(struct iommu_domain *domain, 798 - unsigned long iova, struct scatterlist *sg, 799 - unsigned int nents, int prot) 803 + unsigned int nents, int prot, gfp_t gfp) 800 804 { 801 805 return -ENODEV; 802 806 } ··· 1100 1118 static inline size_t iommu_map_sgtable(struct iommu_domain *domain, 1101 1119 unsigned long iova, struct sg_table *sgt, int prot) 1102 1120 { 1103 - return iommu_map_sg(domain, iova, sgt->sgl, sgt->orig_nents, prot); 1121 + return iommu_map_sg(domain, iova, sgt->sgl, sgt->orig_nents, prot, 1122 + GFP_KERNEL); 1104 1123 } 1105 1124 1106 1125 #ifdef CONFIG_IOMMU_DEBUGFS