Hi Andrew, I noticed that __memblock_free_early and memblock_free has the same code. At first I think we can delete __memblock_free_early till __memblock_free_late remind me __memblock_free_early is meaningful. It's a note to call this before struct page was initialized. So I choose to make __memblock_free_early a wrapper of memblock_free. Here is the patch (see attachment file): >From 5f21fb0409e91b42373832627e44cd0a8275c820 Mon Sep 17 00:00:00 2001 From: Wentao Wang Date: Thu, 22 Nov 2018 11:35:59 +0800 Subject: [PATCH] Make __memblock_free_early a wrapper of memblock_free rather than dup it Signed-off-by: Wentao Wang --- mm/memblock.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/mm/memblock.c b/mm/memblock.c index 9a2d5ae..08bf136 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -1546,12 +1546,7 @@ void * __init memblock_alloc_try_nid( */ void __init __memblock_free_early(phys_addr_t base, phys_addr_t size) { - phys_addr_t end = base + size - 1; - - memblock_dbg("%s: [%pa-%pa] %pF\n", - __func__, &base, &end, (void *)_RET_IP_); - kmemleak_free_part_phys(base, size); - memblock_remove_range(&memblock.reserved, base, size); + memblock_free(base, size); } /** -- 1.8.3.1 Testing: Build with memblock, system bootup normally and works well. Regards, Wentao