On Thu, Aug 28, 2025 at 12:01:13AM +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 comment to describe the initialization order: again, > just like prep_compound_page().
Wow this is great, thank you for putting a quality comment for this and thinking of this :) We have too much 'special case you just have to know' stuff sitting around, so this kind of thing is always great to see. > > Reviewed-by: Mike Rapoport (Microsoft) <r...@kernel.org> > Signed-off-by: David Hildenbrand <da...@redhat.com> LGTM, so: Reviewed-by: Lorenzo Stoakes <lorenzo.stoa...@oracle.com> > --- > mm/mm_init.c | 15 +++++++-------- > 1 file changed, 7 insertions(+), 8 deletions(-) > > diff --git a/mm/mm_init.c b/mm/mm_init.c > index 5c21b3af216b2..df614556741a4 100644 > --- a/mm/mm_init.c > +++ b/mm/mm_init.c > @@ -1091,6 +1091,12 @@ static void __ref memmap_init_compound(struct page > *head, > unsigned long pfn, end_pfn = head_pfn + nr_pages; > unsigned int order = pgmap->vmemmap_shift; > > + /* > + * We have to initialize the pages, including setting up page links. > + * prep_compound_page() does not take care of that, so instead we > + * open-code prep_compound_page() so we can take care of initializing > + * the pages in the same go. > + */ > __SetPageHead(head); > for (pfn = head_pfn + 1; pfn < end_pfn; pfn++) { > struct page *page = pfn_to_page(pfn); > @@ -1098,15 +1104,8 @@ static void __ref memmap_init_compound(struct page > *head, > __init_zone_device_page(page, pfn, zone_idx, nid, pgmap); > prep_compound_tail(head, pfn - head_pfn); > set_page_count(page, 0); > - > - /* > - * The first tail page stores important compound page info. > - * Call prep_compound_head() after the first tail page has > - * been initialized, to not have the data overwritten. > - */ > - if (pfn == head_pfn + 1) > - prep_compound_head(head, order); > } > + prep_compound_head(head, order); > } > > void __ref memmap_init_zone_device(struct zone *zone, > -- > 2.50.1 >