Message ID | 20171204141313.31604-5-steve.capper@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Dec 04, 2017 at 02:13:05PM +0000, Steve Capper wrote: > The high_memory global variable is used by > cma_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. > > Signed-off-by: Steve Capper <steve.capper@arm.com> It looks like we've had this bug since 3.18 (f7426b983a6a, "mm: cma: adjust address limit to avoid hitting low/high memory boundary"). It may be worth adding a cc stable on this patch.
On Mon, Dec 11, 2017 at 12:00:22PM +0000, Catalin Marinas wrote: > On Mon, Dec 04, 2017 at 02:13:05PM +0000, Steve Capper wrote: > > The high_memory global variable is used by > > cma_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. > > > > Signed-off-by: Steve Capper <steve.capper@arm.com> > > It looks like we've had this bug since 3.18 (f7426b983a6a, "mm: cma: > adjust address limit to avoid hitting low/high memory boundary"). It may > be worth adding a cc stable on this patch. Thanks Catalin, Will add a fixes and cc stable. Cheers,
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index 5960bef0170d..00e7b900ca41 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c @@ -476,6 +476,8 @@ void __init arm64_memblock_init(void) reserve_elfcorehdr(); + high_memory = __va(memblock_end_of_DRAM() - 1) + 1; + dma_contiguous_reserve(arm64_dma_phys_limit); memblock_allow_resize(); @@ -502,7 +504,6 @@ void __init bootmem_init(void) sparse_init(); zone_sizes_init(min, max); - high_memory = __va((max << PAGE_SHIFT) - 1) + 1; memblock_dump_all(); }
The high_memory global variable is used by cma_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. Signed-off-by: Steve Capper <steve.capper@arm.com> --- arch/arm64/mm/init.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)