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 <MW4PR11MB6936594CC6B15968AAB781DCA3D22@MW4PR11MB6936.namprd11.prod.outlook.com>
> -----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
> 
> 
> >>> +static void __init update_zone_online_memmap_pages(struct zone *zone,
> >>> +						   unsigned long start_pfn,
> >>> +						   unsigned long end_pfn,
> >>> +						   unsigned long *hole_pfn)
> >>> +{
> >>> +#ifdef CONFIG_SPARSEMEM_VMEMMAP
> >>> +	unsigned long zone_start_pfn = zone->zone_start_pfn;
> >>> +	unsigned long zone_end_pfn = zone_start_pfn + zone->spanned_pages;
> >>
> >> These two can be const.
> >
> > Will do.
> >
> >>> +	unsigned long sub_start, sub_end;
> >>> +
> >>> +	sub_start = max(ALIGN_DOWN(start_pfn, PAGES_PER_SUBSECTION),
> >>> +			zone_start_pfn);
> >>> +	sub_end = min(ALIGN(end_pfn, PAGES_PER_SUBSECTION), zone_end_pfn);
> >>
> >> Hm, I don't immediately understand why we do the PAGES_PER_SUBSECTION
> >> thing
> >> here. Why is that required?
> >
> > 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

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.