RE: [PATCH v6 1/2] mm/memory_hotplug: optimize zone contiguous check when changing pfn range

"Liu, Yuan1" <[email protected]>
Newsgroups gmane.linux.kernel,gmane.linux.kernel.mm
Message-ID <MW4PR11MB69363CCE15647FD7D85542B6A3D12@MW4PR11MB6936.namprd11.prod.outlook.com>
> -----Original Message-----
> From: David Hildenbrand (Arm) <[email protected]>
> Sent: Friday, August 7, 2026 7:30 PM
> To: Liu, Yuan1 <[email protected]>; Oscar Salvador <[email protected]>;
> Mike Rapoport <[email protected]>; Wei Yang <[email protected]>
> Cc: [email protected]; Zou, Nanhai <[email protected]>; Deng, Pan
> <[email protected]>; Li, Tianyou <[email protected]>; Chen Zhang
> <[email protected]>; Zeng, Jason <[email protected]>; linux-
> [email protected]
> Subject: Re: [PATCH v6 1/2] mm/memory_hotplug: optimize zone contiguous
> check when changing pfn range
> 
> On 8/6/26 11:52, Liu, Yuan1 wrote:
> >> -----Original Message-----
> >> From: David Hildenbrand (Arm) <[email protected]>
> >> Sent: Thursday, August 6, 2026 4:46 PM
> >> To: Liu, Yuan1 <[email protected]>; Oscar Salvador
> <[email protected]>;
> >> Mike Rapoport <[email protected]>; Wei Yang <[email protected]>
> >> Cc: [email protected]; Zou, Nanhai <[email protected]>; Deng, Pan
> >> <[email protected]>; Li, Tianyou <[email protected]>; Chen Zhang
> >> <[email protected]>; Zeng, Jason <[email protected]>; linux-
> >> [email protected]
> >> Subject: Re: [PATCH v6 1/2] mm/memory_hotplug: optimize zone contiguous
> >> check when changing pfn range
> >>
> >>
> >>>
> >>> Will do.
> >>>
> >>>
> >>> pages_with_online_memmap counts all PFNs where pfn_to_online_page() is
> >>> valid. With CONFIG_SPARSEMEM_VMEMMAP, pfn_section_valid() operates at
> >>> PAGES_PER_SUBSECTION granularity — when any page in a subsection has
> >>> memory, the entire subsection is valid/online. So we align to
> subsection
> >>> boundaries to include hole pages within partially-populated
> subsections.
> >>
> >> But we must never account exceeding the zone range. So I don't
> understand
> >> why we
> >> would have to care about PAGES_PER_SUBSECTION here at all?
> >
> > We never account beyond the zone range, because `sub_start` and
> > `sub_end` are still clamped to the zone boundaries after the
> > alignment.
> >
> > The subsection alignment is needed for hole PFNs between memblocks
> > within the zone. These hole PFNs are valid for
> > `pfn_to_online_page()`, because they sit in a subsection that has
> > memory, so the whole subsection's memmap is online.
> >
> > |----------- zone range -----------|
> >
> > +-----------+---------+------------+
> > + memblock 1|  hole   | memblock 2 |
> > +-----------+---------+------------+
> >                ^
> >                |
> >                |
> >      subsection boundary
> 
> Right, but init_unavailable_range() can just return how many were actually
> initalized? Why can't we piggy-back on that?
> 
> I think we had something similar previously, why can't we use that?
> 
> We know the zone span, so we can just account all the mmap in the zone
> span
> that we initialize.
> 
> What is the problem with that?

Hi David

My understanding is that init_unavailable_range() initializes all
PFNs that satisfy pfn_valid(), but not all of them satisfy
pfn_to_online_page(), since some PFNs belong to subsections that are
not online.

You previously mentioned:

  pfn_valid() says early sections always have a full memmap, so even invalid
  subsections have a memmap. pfn_to_online_page() says an invalid subsection
  cannot be online and its content must be stale. for_each_valid_pfn() follows
  pfn_valid() semantics, and we use it to initialize memmap that is not going
  to be online and account it as pages_with_online_memmap, which is wrong.

  The cleanest approach is to avoid allocating memmap for subsections, which
  also removes the special early-section handling from pfn_valid() and
  for_each_valid_pfn().

I also share the concerns raised by Sashiko in the analysis below [1]:

  Scanners like isolate_migratepages_block() will then blindly iterate through
  the pageblock and access the completely uninitialized struct pages of the hole,
  leading to functional errors or kernel panics when reading these zero-filled
  structures via macros like PageHuge() or page_zone().

That's why we went with the current approach in v6 instead of your
earlier suggestion. I'd really appreciate your guidance on which
direction you think would be more appropriate.

[1] https://sashiko.dev/#/patchset/20260520093457.3719960-1-yuan1.liu%40intel.com

Best Regards,
Liu, Yuan

> Cheers,
> 
> David
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.