Skip to content

Commit c02e7c5

Browse files
jgoulywilldeacon
authored andcommitted
arm64/mm: use lm_alias() with addresses passed to memblock_free()
The pointer argument to memblock_free() needs to be a linear map address, but in mem_init() we pass __init_begin/__init_end, which is a kernel image address. This results in warnings when building with CONFIG_DEBUG_VIRTUAL=y: virt_to_phys used for non-linear address: ffff800081270000 (set_reset_devices+0x0/0x10) WARNING: CPU: 0 PID: 1 at arch/arm64/mm/physaddr.c:12 __virt_to_phys+0x54/0x70 Modules linked in: CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.11.0-rc6-next-20240905 #5810 b1ebb0ad06653f35ce875413d5afad24668df3f3 Hardware name: FVP Base RevC (DT) pstate: 2161402005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS BTYPE=--) pc : __virt_to_phys+0x54/0x70 lr : __virt_to_phys+0x54/0x70 sp : ffff80008169be20 ... Call trace: __virt_to_phys+0x54/0x70 memblock_free+0x18/0x30 free_initmem+0x3c/0x9c kernel_init+0x30/0x1cc ret_from_fork+0x10/0x20 Fix this by having mem_init() convert the pointers via lm_alias(). Fixes: 1db9716 ("arm64/mm: Delete __init region from memblock.reserved") Signed-off-by: Joey Gouly <[email protected]> Suggested-by: Mark Rutland <[email protected]> Cc: Will Deacon <[email protected]> Cc: Catalin Marinas <[email protected]> Cc: Rong Qianfeng <[email protected]> Reviewed-by: Mark Rutland <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Will Deacon <[email protected]>
1 parent 70565f2 commit c02e7c5

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

arch/arm64/mm/init.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -414,14 +414,16 @@ void __init mem_init(void)
414414

415415
void free_initmem(void)
416416
{
417-
unsigned long aligned_begin = ALIGN_DOWN((u64)__init_begin, PAGE_SIZE);
418-
unsigned long aligned_end = ALIGN((u64)__init_end, PAGE_SIZE);
417+
void *lm_init_begin = lm_alias(__init_begin);
418+
void *lm_init_end = lm_alias(__init_end);
419+
420+
WARN_ON(!IS_ALIGNED((unsigned long)lm_init_begin, PAGE_SIZE));
421+
WARN_ON(!IS_ALIGNED((unsigned long)lm_init_end, PAGE_SIZE));
419422

420423
/* Delete __init region from memblock.reserved. */
421-
memblock_free((void *)aligned_begin, aligned_end - aligned_begin);
424+
memblock_free(lm_init_begin, lm_init_end - lm_init_begin);
422425

423-
free_reserved_area(lm_alias(__init_begin),
424-
lm_alias(__init_end),
426+
free_reserved_area(lm_init_begin, lm_init_end,
425427
POISON_FREE_INITMEM, "unused kernel");
426428
/*
427429
* Unmap the __init region but leave the VM area in place. This

0 commit comments

Comments
 (0)