Skip to content

mm: fix initialization of struct page for holes in memory layout

Mike Rapoport linux-mm lkml stable 9 versions – Applied

Status from this message: [merged] mm-page_allocc-refactor-initialization-of-struct-page-for-holes-in-memory-layout.patch removed from -mm tree

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v8 Latest1 patch 4 repliesApplied 1/1
  2. v71 patch 10 repliesSuperseded
  3. v6 posting 2/21 patch 6 repliesSuperseded
Earlier versions · 6
VersionPostedPatchesRepliesStatus
v6 posting 1/20 of 1 patch0 repliesSuperseded
v51 patch26 repliesSuperseded
v42 patches11 repliesSuperseded
v32 patches10 repliesApplied 2/2
v22 patches15 repliesSuperseded
v11 patch3 repliesSuperseded

Changes in v8 from the cover letter

* make comments and changelog more elaborate as per David, Linus and Vlastimil
* add Vlastimil's ack

Patches in v8 All 1 applied

#Subject and filesSizeRepliesApplied
1/1mm/page_alloc.c: refactor initialization of struct page for holes in memory layoutmm/page_alloc.c+75 -834 repliesApplied

Reviews trailers per patch

The patch has a Reviewed-by or Acked-by.

PatchBaoquan HeVlastimil BabkaDavid Hildenbrand
1/1R-b A-b R-b

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes. Scroll the table sideways for all 3 reviewers.

Read the v8 thread

Cover letter [PATCH v8 0/1] mm: fix initialization of struct page for holes in memory layout

From: Mike Rapoport <[email protected]>

Hi,

@Andrew, this is based on v5.11-mmotm-2021-02-18-18-29 with the previous version reverted

Commit 73a6e474cb37 ("mm: memmap_init: iterate over memblock regions rather that check each PFN") exposed several issues with the memory map initialization and these patches fix those issues.

Initially there were crashes during compaction that Qian Cai reported back in April [1]. It seemed back then that the problem was fixed, but a few weeks ago Andrea Arcangeli hit the same bug [2] and there was an additional discussion at [3].

I didn't appreciate variety of ways BIOSes can report memory in the first megabyte, so previous versions of this set caused all kinds of troubles.

The last version that implicitly extended node/zone to cover the complete section might also have unexpected side effects, so this time I'm trying to move in forward in baby steps.

This is mostly a return to the fist version that simply merges init_unavailable_pages() into memmap_init() so that the only effective change would be more sensible zone/node links in unavailable struct pages.

For now, I've dropped the patch that tried to make ZONE_DMA to span pfn 0 because it didn't cause any issues for really long time and there are way to many hidden mines around this.

I have an ugly workaround for "pfn 0" issue that IMHO is the safest way to deal with it until it could be gradually fixed properly:

https://git.kernel.org/pub/scm/linux/kernel/git/rppt/linux.git/commit/?h=meminit/pfn0&id=90272f37151c6e1bc2610997310c51f4e984cf2f

v8:
* make comments and changelog more elaborate as per David, Linus and Vlastimil
* add Vlastimil's ack

v7: https://lore.kernel.org/lkml/[email protected]
* add handling of section end that span beyond the populated zones

v6: https://lore.kernel.org/lkml/[email protected]
* only interleave initialization of unavailable pages in memmap_init(), so that it is essentially includes init_unavailable_pages().

v5: https://lore.kernel.org/lkml/[email protected]
* extend node/zone spans to cover complete sections, this allows to interleave the initialization of unavailable pages with "normal" memory map init.
* drop modifications to x86 early setup

v4: https://lore.kernel.org/lkml/[email protected]/
* make sure pages in the range 0 - start_pfn_of_lowest_zone are initialized even if an architecture hides them from the generic mm
* finally make pfn 0 on x86 to be a part of memory visible to the generic mm as reserved memory.

v3: https://lore.kernel.org/lkml/[email protected]
* use architectural zone constraints to set zone links for struct pages corresponding to the holes
* drop implicit update of memblock.memory
* add a patch that sets pfn 0 to E820_TYPE_RAM on x86

v2: https://lore.kernel.org/lkml/[email protected]/):
* added patch that adds all regions in memblock.reserved that do not overlap with memblock.memory to memblock.memory in the beginning of free_area_init()

[1] https://lore.kernel.org/lkml/[email protected]
[2] https://lore.kernel.org/lkml/[email protected]
[3] https://lore.kernel.org/mm-commits/20201206005401.qKuAVgOXr%[email protected]

Mike Rapoport (1):
mm/page_alloc.c: refactor initialization of struct page for holes in
memory layout

 mm/page_alloc.c | 147 +++++++++++++++++++++---------------------------
 1 file changed, 64 insertions(+), 83 deletions(-)
Signature · 13 lines
2.28.0

*** BLURB HERE ***

Mike Rapoport (1):
  mm/page_alloc.c: refactor initialization of struct page for holes in
    memory layout

 mm/page_alloc.c | 158 +++++++++++++++++++++++-------------------------
 1 file changed, 75 insertions(+), 83 deletions(-)

-- 
2.28.0