mm/mm_init: make memmap_init_compound() look more like prep_compound_page()
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(). Link: https://lkml.kernel.org/r/20250901150359.867252-10-david@redhat.com Signed-off-by: David Hildenbrand <david@redhat.com> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org> Reviewed-by: Wei Yang <richard.weiyang@gmail.com> Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Acked-by: Liam R. Howlett <Liam.Howlett@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
7b4f21f5e0
commit
50765b46ab
15
mm/mm_init.c
15
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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue