Messages in this thread | ![/](/images/icornerl.gif) | | From | David Hildenbrand <> | Subject | Re: [RFC PATCH 00/15] Make MAX_ORDER adjustable as a kernel boot time parameter. | Date | Fri, 6 Aug 2021 18:16:41 +0200 |
| |
On 06.08.21 17:36, Vlastimil Babka wrote: > On 8/5/21 9:02 PM, Zi Yan wrote: >> From: Zi Yan <ziy@nvidia.com> > >> Patch 3 restores the pfn_valid_within() check when buddy allocator can merge >> pages across memory sections. The check was removed when ARM64 gets rid of holes >> in zones, but holes can appear in zones again after this patchset. > > To me that's most unwelcome resurrection. I kinda missed it was going away and > now I can't even rejoice? I assume the systems that will be bumping max_order > have a lot of memory. Are they going to have many holes? What if we just > sacrificed the memory that would have a hole and don't add it to buddy at all?
I think the old implementation was just horrible and the description we have here still suffers from that old crap: "but holes can appear in zones again". No, it's not related to holes in zones at all. We can have MAX_ORDER -1 pages that are partially a hole.
And to be precise, "hole" here means "there is no memmap" and not "there is a hole but it has a valid memmap".
But IIRC, we now have under SPARSEMEM always a complete memmap for a complete memory sections (when talking about system RAM, ZONE_DEVICE is different but we don't really care for now I think).
So instead of introducing what we had before, I think we should look into something that doesn't confuse each person that stumbles over it out there. What does pfn_valid_within() even mean in the new context? pfn_valid() is most probably no longer what we really want, as we're dealing with multiple sections that might be online or offline; in the old world, this was different, as a MAX_ORDER -1 page was completely contained in a memory section that was either online or offline.
I'd imagine something that expresses something different in the context of sparsemem:
"Some page orders, such as MAX_ORDER -1, might span multiple memory sections. Each memory section has a completely valid memmap if online. Memory sections might either be completely online or completely offline. pfn_to_online_page() might succeed on one part of a MAX_ORDER - 1 page, but not on another part. But it will certainly be consistent within one memory section."
Further, as we know that MAX_ORDER -1 and memory sections are a power of two, we can actually do a binary search to identify boundaries, instead of having to check each and every page in the range.
Is what I describe the actual reason why we introduce pfn_valid_within() ? (and might better introduce something new, with a better fitting name?)
-- Thanks,
David / dhildenb
| ![\](/images/icornerr.gif) |