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

dma-mapping: replace zone_dma_bits by zone_dma_limit

The hardware DMA limit might not be power of 2. When RAM range starts
above 0, say 4GB, DMA limit of 30 bits should end at 5GB. A single high
bit can not encode this limit.

Use a plain address for the DMA zone limit instead.

Since the DMA zone can now potentially span beyond 4GB physical limit of
DMA32, make sure to use DMA zone for GFP_DMA32 allocations in that case.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Co-developed-by: Baruch Siach <baruch@tkos.co.il>
Signed-off-by: Baruch Siach <baruch@tkos.co.il>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Petr Tesarik <ptesarik@suse.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>

authored by

Catalin Marinas and committed by
Christoph Hellwig
ba0fb44a fa3c109a

+29 -26
+15 -15
arch/arm64/mm/init.c
··· 115 115 } 116 116 117 117 /* 118 - * Return the maximum physical address for a zone accessible by the given bits 119 - * limit. If DRAM starts above 32-bit, expand the zone to the maximum 118 + * Return the maximum physical address for a zone given its limit. 119 + * If DRAM starts above 32-bit, expand the zone to the maximum 120 120 * available memory, otherwise cap it at 32-bit. 121 121 */ 122 - static phys_addr_t __init max_zone_phys(unsigned int zone_bits) 122 + static phys_addr_t __init max_zone_phys(phys_addr_t zone_limit) 123 123 { 124 - phys_addr_t zone_mask = DMA_BIT_MASK(zone_bits); 125 124 phys_addr_t phys_start = memblock_start_of_DRAM(); 126 125 127 126 if (phys_start > U32_MAX) 128 - zone_mask = PHYS_ADDR_MAX; 129 - else if (phys_start > zone_mask) 130 - zone_mask = U32_MAX; 127 + zone_limit = PHYS_ADDR_MAX; 128 + else if (phys_start > zone_limit) 129 + zone_limit = U32_MAX; 131 130 132 - return min(zone_mask, memblock_end_of_DRAM() - 1) + 1; 131 + return min(zone_limit, memblock_end_of_DRAM() - 1) + 1; 133 132 } 134 133 135 134 static void __init zone_sizes_init(void) 136 135 { 137 136 unsigned long max_zone_pfns[MAX_NR_ZONES] = {0}; 138 - unsigned int __maybe_unused acpi_zone_dma_bits; 139 - unsigned int __maybe_unused dt_zone_dma_bits; 140 - phys_addr_t __maybe_unused dma32_phys_limit = max_zone_phys(32); 137 + phys_addr_t __maybe_unused acpi_zone_dma_limit; 138 + phys_addr_t __maybe_unused dt_zone_dma_limit; 139 + phys_addr_t __maybe_unused dma32_phys_limit = 140 + max_zone_phys(DMA_BIT_MASK(32)); 141 141 142 142 #ifdef CONFIG_ZONE_DMA 143 - acpi_zone_dma_bits = fls64(acpi_iort_dma_get_max_cpu_address()); 144 - dt_zone_dma_bits = fls64(of_dma_get_max_cpu_address(NULL)); 145 - zone_dma_bits = min3(32U, dt_zone_dma_bits, acpi_zone_dma_bits); 146 - arm64_dma_phys_limit = max_zone_phys(zone_dma_bits); 143 + acpi_zone_dma_limit = acpi_iort_dma_get_max_cpu_address(); 144 + dt_zone_dma_limit = of_dma_get_max_cpu_address(NULL); 145 + zone_dma_limit = min(dt_zone_dma_limit, acpi_zone_dma_limit); 146 + arm64_dma_phys_limit = max_zone_phys(zone_dma_limit); 147 147 max_zone_pfns[ZONE_DMA] = PFN_DOWN(arm64_dma_phys_limit); 148 148 #endif 149 149 #ifdef CONFIG_ZONE_DMA32
+4 -1
arch/powerpc/mm/mem.c
··· 216 216 * everything else. GFP_DMA32 page allocations automatically fall back to 217 217 * ZONE_DMA. 218 218 * 219 - * By using 31-bit unconditionally, we can exploit zone_dma_bits to inform the 219 + * By using 31-bit unconditionally, we can exploit zone_dma_limit to inform the 220 220 * generic DMA mapping code. 32-bit only devices (if not handled by an IOMMU 221 221 * anyway) will take a first dip into ZONE_NORMAL and get otherwise served by 222 222 * ZONE_DMA. ··· 230 230 { 231 231 unsigned long long total_ram = memblock_phys_mem_size(); 232 232 phys_addr_t top_of_ram = memblock_end_of_DRAM(); 233 + int zone_dma_bits; 233 234 234 235 #ifdef CONFIG_HIGHMEM 235 236 unsigned long v = __fix_to_virt(FIX_KMAP_END); ··· 256 255 zone_dma_bits = 30; 257 256 else 258 257 zone_dma_bits = 31; 258 + 259 + zone_dma_limit = DMA_BIT_MASK(zone_dma_bits); 259 260 260 261 #ifdef CONFIG_ZONE_DMA 261 262 max_zone_pfns[ZONE_DMA] = min(max_low_pfn,
+1 -1
arch/s390/mm/init.c
··· 97 97 98 98 vmem_map_init(); 99 99 sparse_init(); 100 - zone_dma_bits = 31; 100 + zone_dma_limit = DMA_BIT_MASK(31); 101 101 memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); 102 102 max_zone_pfns[ZONE_DMA] = virt_to_pfn(MAX_DMA_ADDRESS); 103 103 max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
+1 -1
include/linux/dma-direct.h
··· 12 12 #include <linux/mem_encrypt.h> 13 13 #include <linux/swiotlb.h> 14 14 15 - extern unsigned int zone_dma_bits; 15 + extern u64 zone_dma_limit; 16 16 17 17 /* 18 18 * Record the mapping of CPU physical to DMA addresses for a given region.
+3 -3
kernel/dma/direct.c
··· 20 20 * it for entirely different regions. In that case the arch code needs to 21 21 * override the variable below for dma-direct to work properly. 22 22 */ 23 - unsigned int zone_dma_bits __ro_after_init = 24; 23 + u64 zone_dma_limit __ro_after_init = DMA_BIT_MASK(24); 24 24 25 25 static inline dma_addr_t phys_to_dma_direct(struct device *dev, 26 26 phys_addr_t phys) ··· 59 59 * zones. 60 60 */ 61 61 *phys_limit = dma_to_phys(dev, dma_limit); 62 - if (*phys_limit <= DMA_BIT_MASK(zone_dma_bits)) 62 + if (*phys_limit <= zone_dma_limit) 63 63 return GFP_DMA; 64 64 if (*phys_limit <= DMA_BIT_MASK(32)) 65 65 return GFP_DMA32; ··· 580 580 * part of the check. 581 581 */ 582 582 if (IS_ENABLED(CONFIG_ZONE_DMA)) 583 - min_mask = min_t(u64, min_mask, DMA_BIT_MASK(zone_dma_bits)); 583 + min_mask = min_t(u64, min_mask, zone_dma_limit); 584 584 return mask >= phys_to_dma_unencrypted(dev, min_mask); 585 585 } 586 586
+2 -2
kernel/dma/pool.c
··· 70 70 /* CMA can't cross zone boundaries, see cma_activate_area() */ 71 71 end = cma_get_base(cma) + size - 1; 72 72 if (IS_ENABLED(CONFIG_ZONE_DMA) && (gfp & GFP_DMA)) 73 - return end <= DMA_BIT_MASK(zone_dma_bits); 73 + return end <= zone_dma_limit; 74 74 if (IS_ENABLED(CONFIG_ZONE_DMA32) && (gfp & GFP_DMA32)) 75 - return end <= DMA_BIT_MASK(32); 75 + return end <= max(DMA_BIT_MASK(32), zone_dma_limit); 76 76 return true; 77 77 } 78 78
+3 -3
kernel/dma/swiotlb.c
··· 450 450 if (!remap) 451 451 io_tlb_default_mem.can_grow = true; 452 452 if (IS_ENABLED(CONFIG_ZONE_DMA) && (gfp_mask & __GFP_DMA)) 453 - io_tlb_default_mem.phys_limit = DMA_BIT_MASK(zone_dma_bits); 453 + io_tlb_default_mem.phys_limit = zone_dma_limit; 454 454 else if (IS_ENABLED(CONFIG_ZONE_DMA32) && (gfp_mask & __GFP_DMA32)) 455 - io_tlb_default_mem.phys_limit = DMA_BIT_MASK(32); 455 + io_tlb_default_mem.phys_limit = max(DMA_BIT_MASK(32), zone_dma_limit); 456 456 else 457 457 io_tlb_default_mem.phys_limit = virt_to_phys(high_memory - 1); 458 458 #endif ··· 629 629 } 630 630 631 631 gfp &= ~GFP_ZONEMASK; 632 - if (phys_limit <= DMA_BIT_MASK(zone_dma_bits)) 632 + if (phys_limit <= zone_dma_limit) 633 633 gfp |= __GFP_DMA; 634 634 else if (phys_limit <= DMA_BIT_MASK(32)) 635 635 gfp |= __GFP_DMA32;