Thread (48 messages) 48 messages, 5 authors, 2021-05-14

Re: arm32: panic in move_freepages (Was [PATCH v2 0/4] arm64: drop pfn_valid_within() and simplify pfn_valid())

From: Mike Rapoport <rppt@kernel.org>
Date: 2021-05-03 06:27:03
Also in: kvmarm, linux-arm-kernel, lkml

On Fri, Apr 30, 2021 at 07:24:37PM +0800, Kefeng Wang wrote:

On 2021/4/30 17:51, Mike Rapoport wrote:
quoted
On Thu, Apr 29, 2021 at 06:22:55PM +0800, Kefeng Wang wrote:
quoted
On 2021/4/29 14:57, Mike Rapoport wrote:
quoted
quoted
quoted
Do you use SPARSMEM? If yes, what is your section size?
What is the value if CONFIG_FORCE_MAX_ZONEORDER in your configuration?
Yes,

CONFIG_SPARSEMEM=y

CONFIG_SPARSEMEM_STATIC=y

CONFIG_FORCE_MAX_ZONEORDER = 11

CONFIG_PAGE_OFFSET=0xC0000000
CONFIG_HAVE_ARCH_PFN_VALID=y
CONFIG_HIGHMEM=y
#define SECTION_SIZE_BITS    26
#define MAX_PHYSADDR_BITS    32
#define MAX_PHYSMEM_BITS     32

With the patch,  the addr is aligned, but the panic still occurred,
Is this the same panic at move_freepages() for range [de600, de7ff]?

Do you enable CONFIG_ARM_LPAE?
no, the CONFIG_ARM_LPAE is not set, and yes with same panic at
move_freepages at

start_pfn/end_pfn [de600, de7ff], [de600000, de7ff000] :  pfn =de600, page
=ef3cc000, page-flags = ffffffff,  pfn2phy = de600000
quoted
quoted
__free_memory_core, range: 0xb0200000 - 0xc0000000, pfn: b0200 - b0200
__free_memory_core, range: 0xcc000000 - 0xdca00000, pfn: cc000 - b0200
__free_memory_core, range: 0xde700000 - 0xdea00000, pfn: de700 - b0200
Hmm, [de600, de7ff] is not added to the free lists which is correct. But
then it's unclear how the page for de600 gets to move_freepages()...

Can't say I have any bright ideas to try here...
the __free_memory_core will check the start pfn and end pfn,

 if (start_pfn >= end_pfn)
         return 0;

 __free_pages_memory(start_pfn, end_pfn);
so the memory will not be freed to buddy, confused...
It's a check for range validity, all valid ranges are added.
quoted
quoted
__free_memory_core, range: 0xe0800000 - 0xe0c00000, pfn: e0800 - b0200
__free_memory_core, range: 0xf4b00000 - 0xf7000000, pfn: f4b00 - b0200
__free_memory_core, range: 0xfda00000 - 0xffffffff, pfn: fda00 - b0200
quoted
It seems that with SPARSEMEM we don't align the freed parts on pageblock
boundaries.

Can you try the patch below:
diff --git a/mm/memblock.c b/mm/memblock.c
index afaefa8fc6ab..1926369b52ec 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -1941,14 +1941,13 @@ static void __init free_unused_memmap(void)
   		 * due to SPARSEMEM sections which aren't present.
   		 */
   		start = min(start, ALIGN(prev_end, PAGES_PER_SECTION));
-#else
+#endif
   		/*
   		 * Align down here since the VM subsystem insists that the
   		 * memmap entries are valid from the bank start aligned to
   		 * MAX_ORDER_NR_PAGES.
   		 */
   		start = round_down(start, MAX_ORDER_NR_PAGES);
-#endif
   		/*
   		 * If we had a previous bank, and there is a space
-- 
Sincerely yours,
Mike.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help