On 13.04.22 22:55, Mike Rapoport wrote: > On Tue, Apr 12, 2022 at 02:05:51PM -0700, David Rientjes wrote: >> On Tue, 12 Apr 2022, Andrew Morton wrote: >> >>> On Tue, 12 Apr 2022 13:16:23 -0700 Sudarshan Rajagopalan <quic_sudaraja@xxxxxxxxxxx> wrote: >>> >>>> Check if pfn is valid before or not before moving it to freelist. >>>> >>>> There are possible scenario where a pageblock can have partial physical >>>> hole and partial part of System RAM. This happens when base address in RAM >>>> partition table is not aligned to pageblock size. >>>> >>>> ... >>>> >>>> >>>> Signed-off-by: Sudarshan Rajagopalan <quic_sudaraja@xxxxxxxxxxx> >>>> Fixes: 4c7b9896621be ("mm: remove pfn_valid_within() and CONFIG_HOLES_IN_ZONE") >>> >>> I made that 859a85ddf90e714092dea71a0e54c7b9896621be and added >>> cc:stable. I'll await reviewer input before proceeding further. >>> >> >> Acked-by: David Rientjes <rientjes@xxxxxxxxxx> >> >>>> --- a/mm/page_alloc.c >>>> +++ b/mm/page_alloc.c >>>> @@ -2521,6 +2521,11 @@ static int move_freepages(struct zone *zone, >>>> int pages_moved = 0; >>>> >>>> for (pfn = start_pfn; pfn <= end_pfn;) { >>>> + if (!pfn_valid(pfn)) { >>> >>> Readers will wonder how we can encounter an invalid pfn here. A small >>> comment might help clue them in. >>> >> >> Sudarshan can correct me if I'm wrong, but this has to do with the >> pageblock alignment of the caller that assumes all pages in the range has >> an underlying struct page that we can access but that fails to hold true >> when we have a memory hole. A comment would definitely help: > > We do have a struct page for every page in a pageblock even if there is a > hole in the physical memory. If this is not the case, there is more > fundamental bug that should be fixed. Also, I dislike handling such a corner case in a way that affects all other sane cases. move_freepages() is also used for page isolation. I agree that this should be fixed differently, if possible. -- Thanks, David / dhildenb