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

From: Mike Rapoport
Date: Tue May 11 2021 - 04:48:14 EST


On Mon, May 10, 2021 at 11:10:20AM +0800, Kefeng Wang wrote:
>
> > > The memory is not continuous, see MEMBLOCK:
> > > memory size = 0x4c0fffff reserved size = 0x027ef058
> > > memory.cnt = 0xa
> > > memory[0x0] [0x80a00000-0x855fffff], 0x04c00000 bytes flags: 0x0
> > > memory[0x1] [0x86a00000-0x87dfffff], 0x01400000 bytes flags: 0x0
> > > memory[0x2] [0x8bd00000-0x8c4fffff], 0x00800000 bytes flags: 0x0
> > > memory[0x3] [0x8e300000-0x8ecfffff], 0x00a00000 bytes flags: 0x0
> > > memory[0x4] [0x90d00000-0xbfffffff], 0x2f300000 bytes flags: 0x0
> > > memory[0x5] [0xcc000000-0xdc9fffff], 0x10a00000 bytes flags: 0x0
> > > memory[0x6] [0xde700000-0xde9fffff], 0x00300000 bytes flags: 0x0
> > > ...
> > >
> > > The pfn_range [0xde600,0xde700] => addr_range [0xde600000,0xde700000]
> > > is not available memory, and we won't create memmap , so with or without
> > > your patch, we can't see the range in free_memmap(), right?
> >
> > This is not available memory and we won't see the reange in free_memmap(),
> > but we still should create memmap for it and that's what my patch tried to
> > do.
> >
> > There are a lot of places in core mm that operate on pageblocks and
> > free_unused_memmap() should make sure that any pageblock has a valid memory
> > map.
> >
> > Currently, that's not the case when SPARSEMEM=y and my patch tried to fix
> > it.
> >
> > Can you please send log with my patch applied and with the printing of
> > ranges that are freed in free_unused_memmap() you've used in previous
> > mails?

> with your patch[1] and debug print in free_memmap,
> ----> free_memmap, start_pfn = 85800, 85800000 end_pfn = 86800, 86800000
> ----> free_memmap, start_pfn = 8c800, 8c800000 end_pfn = 8e000, 8e000000
> ----> free_memmap, start_pfn = 8f000, 8f000000 end_pfn = 90000, 90000000
> ----> free_memmap, start_pfn = dcc00, dcc00000 end_pfn = de400, de400000
> ----> free_memmap, start_pfn = dec00, dec00000 end_pfn = e0000, e0000000
> ----> free_memmap, start_pfn = e0c00, e0c00000 end_pfn = e4000, e4000000
> ----> free_memmap, start_pfn = f7000, f7000000 end_pfn = f8000, f8000000

It seems that freeing of the memory map is suboptimal still because that
code was not designed for memory layout that has more holes than Swiss
cheese.

Still, the range [0xde600,0xde700] is not freed and there should be struct
pages for this range.

Can you add

dump_page(pfn_to_page(0xde600), "");

say, in the end of memblock_free_all()?

--
Sincerely yours,
Mike.