Skip to content

Commit 6708d42

Browse files
author
CKI KWF Bot
committed
Merge: arm64: mm: Fix zone_dma_limit calculation
MR: https://gitlab.com/redhat/rhel/src/kernel/rhel-9/-/merge_requests/3420 JIRA: https://issues.redhat.com/browse/RHEL-71914 commit 56a7087 Author: Yang Shi <[email protected]> Date: Mon, 25 Nov 2024 09:16:50 -0800 Commit ba0fb44 ("dma-mapping: replace zone_dma_bits by zone_dma_limit") and subsequent patches changed how zone_dma_limit is calculated to allow a reduced ZONE_DMA even when RAM starts above 4GB. Commit 122c234 ("arm64: mm: keep low RAM dma zone") further fixed this to ensure ZONE_DMA remains below U32_MAX if RAM starts below 4GB, especially on platforms that do not have IORT or DT description of the device DMA ranges. While zone boundaries calculation was fixed by the latter commit, zone_dma_limit, used to determine the GFP_DMA flag in the core code, was not updated. This results in excessive use of GFP_DMA and unnecessary ZONE_DMA allocations on some platforms. Update zone_dma_limit to match the actual upper bound of ZONE_DMA. Fixes: ba0fb44 ("dma-mapping: replace zone_dma_bits by zone_dma_limit") Cc: <[email protected]> # 6.12.x Reported-by: Yutang Jiang <[email protected]> Tested-by: Yutang Jiang <[email protected]> Signed-off-by: Yang Shi <[email protected]> Link: https://lore.kernel.org/r/[email protected] [[email protected]: some tweaking of the commit log] Signed-off-by: Catalin Marinas <[email protected]> Signed-off-by: Luiz Capitulino <[email protected]> Approved-by: Waiman Long <[email protected]> Approved-by: Herton R. Krzesinski <[email protected]> Approved-by: CKI KWF Bot <[email protected]> Merged-by: CKI KWF Bot <[email protected]>
2 parents 2145c2f + 803c05c commit 6708d42

File tree

1 file changed

+8
-9
lines changed

1 file changed

+8
-9
lines changed

arch/arm64/mm/init.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -115,15 +115,6 @@ static void __init arch_reserve_crashkernel(void)
115115

116116
static phys_addr_t __init max_zone_phys(phys_addr_t zone_limit)
117117
{
118-
/**
119-
* Information we get from firmware (e.g. DT dma-ranges) describe DMA
120-
* bus constraints. Devices using DMA might have their own limitations.
121-
* Some of them rely on DMA zone in low 32-bit memory. Keep low RAM
122-
* DMA zone on platforms that have RAM there.
123-
*/
124-
if (memblock_start_of_DRAM() < U32_MAX)
125-
zone_limit = min(zone_limit, U32_MAX);
126-
127118
return min(zone_limit, memblock_end_of_DRAM() - 1) + 1;
128119
}
129120

@@ -139,6 +130,14 @@ static void __init zone_sizes_init(void)
139130
acpi_zone_dma_limit = acpi_iort_dma_get_max_cpu_address();
140131
dt_zone_dma_limit = of_dma_get_max_cpu_address(NULL);
141132
zone_dma_limit = min(dt_zone_dma_limit, acpi_zone_dma_limit);
133+
/*
134+
* Information we get from firmware (e.g. DT dma-ranges) describe DMA
135+
* bus constraints. Devices using DMA might have their own limitations.
136+
* Some of them rely on DMA zone in low 32-bit memory. Keep low RAM
137+
* DMA zone on platforms that have RAM there.
138+
*/
139+
if (memblock_start_of_DRAM() < U32_MAX)
140+
zone_dma_limit = min(zone_dma_limit, U32_MAX);
142141
arm64_dma_phys_limit = max_zone_phys(zone_dma_limit);
143142
max_zone_pfns[ZONE_DMA] = PFN_DOWN(arm64_dma_phys_limit);
144143
#endif

0 commit comments

Comments
 (0)