arm64: Initialise high_memory global variable earlier
Subsystems (2)
PATCH 1/1 arm64: Initialise high_memory global variable earlier
Commit f24e5834a2c3f6c5f814a417f858226f0a010ade upstream.
The high_memory global variable is used bycma_declare_contiguous(.) before it is defined.
We don't notice this as we compute __pa(high_memory - 1), and it looks like we're processing a VA from the direct linear map.
This problem becomes apparent when we flip the kernel virtual address space and the linear map is moved to the bottom of the kernel VA space.
This patch moves the initialisation of high_memory before it used.
--- arch/arm64/mm/init.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/arm64/mm/init.c +2 -1
@@ -155,6 +155,8 @@ void __init arm64_memblock_init(void)/* 4GB maximum for 32-bit only capable devices */ if (IS_ENABLED (CONFIG_ZONE_DMA )) dma_phys_limit =max_zone_dma_phys (); + + high_memory =__va (memblock_end_of_DRAM () -1 ) +1 ;dma_contiguous_reserve (dma_phys_limit);memblock_allow_resize ();
@@ -177,7 +179,6 @@ void __init bootmem_init(void)sparse_init ();zone_sizes_init (min, max); - high_memory =__va ((max <<PAGE_SHIFT ) -1 ) +1 ; max_pfn = max_low_pfn = max; }
Signature · 1 line
2.11.0
PATCH 1/1 arm64: Initialise high_memory global variable earlier
Commit f24e5834a2c3f6c5f814a417f858226f0a010ade upstream.
The high_memory global variable is used bycma_declare_contiguous(.) before it is defined.
We don't notice this as we compute __pa(high_memory - 1), and it looks like we're processing a VA from the direct linear map.
This problem becomes apparent when we flip the kernel virtual address space and the linear map is moved to the bottom of the kernel VA space.
This patch moves the initialisation of high_memory before it used.
--- arch/arm64/mm/init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/mm/init.c +1 -1
@@ -178,6 +178,7 @@ void __init arm64_memblock_init(void) arm64_dma_phys_limit =max_zone_dma_phys (); else arm64_dma_phys_limit =PHYS_MASK +1 ; + high_memory =__va (memblock_end_of_DRAM () -1 ) +1 ;dma_contiguous_reserve (arm64_dma_phys_limit);memblock_allow_resize ();
@@ -202,7 +203,6 @@ void __init bootmem_init(void)sparse_init ();zone_sizes_init (min, max); - high_memory =__va ((max <<PAGE_SHIFT ) -1 ) +1 ; max_pfn = max_low_pfn = max; }
Signature · 1 line
2.11.0
PATCH 1/1 arm64: Initialise high_memory global variable earlier
In reply to Steve CapperCommit f24e5834a2c3f6c5f814a417f858226f0a010ade upstream.
The high_memory global variable is used bycma_declare_contiguous(.) before it is defined.
We don't notice this as we compute __pa(high_memory - 1), and it looks like we're processing a VA from the direct linear map.
This problem becomes apparent when we flip the kernel virtual address space and the linear map is moved to the bottom of the kernel VA space.
This patch moves the initialisation of high_memory before it used.
--- arch/arm64/mm/init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/mm/init.c +1 -1
@@ -296,6 +296,7 @@ void __init arm64_memblock_init(void) arm64_dma_phys_limit =max_zone_dma_phys (); else arm64_dma_phys_limit =PHYS_MASK +1 ; + high_memory =__va (memblock_end_of_DRAM () -1 ) +1 ;dma_contiguous_reserve (arm64_dma_phys_limit);memblock_allow_resize ();
@@ -322,7 +323,6 @@ void __init bootmem_init(void)sparse_init ();zone_sizes_init (min, max); - high_memory =__va ((max <<PAGE_SHIFT ) -1 ) +1 ;memblock_dump_all (); }
Signature · 1 line
2.11.0
Quoted 5 lines · Steve Capper
Commit
f24e5834a2c3f6c5f814a417f858226f0a010adeupstream.The
high_memoryglobal variable is used bycma_declare_contiguous(.)before it is defined.
Quoted 7 lines
We don't notice this as we compute
__pa(high_memory - 1), and it looks like we're processing a VA from the direct linear map.This problem becomes apparent when we flip the kernel virtual address space and the linear map is moved to the bottom of the kernel VA space.
This patch moves the initialisation of
high_memorybefore it used.
Thanks for all 3 of these, now queued up.
greg k-h