Re: [PATCH RFC 09/35] mm/mm_init: make memmap_init_compound() look more like prep_compound_page()
David Hildenbrand <[email protected]>
| Newsgroups | com.zx2c4.lists.wireguard,dev.linux.lists.iommu,dev.linux.lists.virtualization,org.freedesktop.lists.dri-devel,org.freedesktop.lists.intel-gfx,org.infradead.lists.linux-arm-kernel,org.infradead.lists.linux-riscv,org.kernel.vger.io-uring,org.kernel.vger.kvm,org.kernel.vger.linux-crypto,org.kernel.vger.linux-ide,org.kernel.vger.linux-kernel,org.kernel.vger.linux-kselftest,org.kernel.vger.linux-mips,org.kernel.vger.linux-mmc,org.kernel.vger.linux-s390,org.kernel.vger.linux-scsi,org.kernel.vger.netdev,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
On 22.08.25 17:27, Mike Rapoport wrote: > On Thu, Aug 21, 2025 at 10:06:35PM +0200, David Hildenbrand wrote: >> Grepping for "prep_compound_page" leaves on clueless how devdax gets its >> compound pages initialized. >> >> Let's add a comment that might help finding this open-coded >> prep_compound_page() initialization more easily. >> >> Further, let's be less smart about the ordering of initialization and just >> perform the prep_compound_head() call after all tail pages were >> initialized: just like prep_compound_page() does. >> >> No need for a lengthy comment then: again, just like prep_compound_page(). >> >> Note that prep_compound_head() already does initialize stuff in page[2] >> through prep_compound_head() that successive tail page initialization >> will overwrite: _deferred_list, and on 32bit _entire_mapcount and >> _pincount. Very likely 32bit does not apply, and likely nobody ever ends >> up testing whether the _deferred_list is empty. >> >> So it shouldn't be a fix at this point, but certainly something to clean >> up. >> >> Signed-off-by: David Hildenbrand <[email protected]> >> --- >> mm/mm_init.c | 13 +++++-------- >> 1 file changed, 5 insertions(+), 8 deletions(-) >> >> diff --git a/mm/mm_init.c b/mm/mm_init.c >> index 5c21b3af216b2..708466c5b2cc9 100644 >> --- a/mm/mm_init.c >> +++ b/mm/mm_init.c >> @@ -1091,6 +1091,10 @@ static void __ref memmap_init_compound(struct page *head, >> unsigned long pfn, end_pfn = head_pfn + nr_pages; >> unsigned int order = pgmap->vmemmap_shift; >> >> + /* >> + * This is an open-coded prep_compound_page() whereby we avoid >> + * walking pages twice by initializing them in the same go. >> + */ > > While on it, can you also mention that prep_compound_page() is not used to > properly set page zone link? Sure, thanks! -- Cheers David / dhildenb