On Thu, Aug 28, 2025 at 09:44:27AM +0200, David Hildenbrand wrote: > On 28.08.25 09:21, Mike Rapoport wrote: > > On Thu, Aug 28, 2025 at 12:01:17AM +0200, David Hildenbrand wrote: > > > We can now safely iterate over all pages in a folio, so no need for the > > > pfn_to_page(). > > > > > > Also, as we already force the refcount in __init_single_page() to 1, > > > we can just set the refcount to 0 and avoid page_ref_freeze() + > > > VM_BUG_ON. Likely, in the future, we would just want to tell > > > __init_single_page() to which value to initialize the refcount. > > > > > > Further, adjust the comments to highlight that we are dealing with an > > > open-coded prep_compound_page() variant, and add another comment > > > explaining > > > why we really need the __init_single_page() only on the tail pages. > > > > > > Note that the current code was likely problematic, but we never ran into > > > it: prep_compound_tail() would have been called with an offset that might > > > exceed a memory section, and prep_compound_tail() would have simply > > > added that offset to the page pointer -- which would not have done the > > > right thing on sparsemem without vmemmap. > > > > > > Signed-off-by: David Hildenbrand <da...@redhat.com> > > > --- > > > mm/hugetlb.c | 20 ++++++++++++-------- > > > 1 file changed, 12 insertions(+), 8 deletions(-) > > > > > > diff --git a/mm/hugetlb.c b/mm/hugetlb.c > > > index 4a97e4f14c0dc..1f42186a85ea4 100644 > > > --- a/mm/hugetlb.c > > > +++ b/mm/hugetlb.c > > > @@ -3237,17 +3237,18 @@ static void __init > > > hugetlb_folio_init_tail_vmemmap(struct folio *folio, > > > { > > > enum zone_type zone = zone_idx(folio_zone(folio)); > > > int nid = folio_nid(folio); > > > + struct page *page = folio_page(folio, start_page_number); > > > unsigned long head_pfn = folio_pfn(folio); > > > unsigned long pfn, end_pfn = head_pfn + end_page_number; > > > - int ret; > > > - > > > - for (pfn = head_pfn + start_page_number; pfn < end_pfn; pfn++) { > > > - struct page *page = pfn_to_page(pfn); > > > + /* > > > + * We mark all tail pages with memblock_reserved_mark_noinit(), > > > + * so these pages are completely uninitialized. > > > > ^ not? ;-) > > Can you elaborate?
Oh, sorry, I misread "uninitialized". Still, I'd phrase it as /* * We marked all tail pages with memblock_reserved_mark_noinit(), * so we must initialize them here. */ > -- > Cheers > > David / dhildenb > -- Sincerely yours, Mike.