On 10 Mar 2025, at 12:39, Zi Yan wrote: > On 10 Mar 2025, at 12:30, Matthew Wilcox wrote: > >> On Fri, Mar 07, 2025 at 12:39:55PM -0500, Zi Yan wrote: >>> + for (index = new_nr_pages; index < nr_pages; index += new_nr_pages) { >>> + struct page *head = &folio->page; >>> + struct page *new_head = head + index; >>> + >>> + /* >>> + * Careful: new_folio is not a "real" folio before we cleared PageTail. >>> + * Don't pass it around before clear_compound_head(). >>> + */ >>> + struct folio *new_folio = (struct folio *)new_head; >> [...] >>> + /* ->mapping in first and second tail page is replaced by other uses */ >>> + VM_BUG_ON_PAGE(new_nr_pages > 2 && new_head->mapping != TAIL_MAPPING, >>> + new_head); >>> + new_head->mapping = head->mapping; >>> + new_head->index = head->index + index; >> >> Why are you using new_head->mapping and ->index instead of new_folio? > > Because of the “Careful” comment. But new_folio->* should be fine, > since it is the same as new_head. So I probably can replace all > new_head with new_folio except those VM_BUG_ON_PAGE checks? Something like? diff --git a/mm/huge_memory.c b/mm/huge_memory.c index f06508e4d242..007c927536bb 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3341,8 +3341,8 @@ static void __split_folio_to_order(struct folio *folio, int old_order, * unreferenced sub-pages of an anonymous THP: we can simply drop * PG_anon_exclusive (-> PG_mappedtodisk) for these here. */ - new_head->flags &= ~PAGE_FLAGS_CHECK_AT_PREP; - new_head->flags |= (head->flags & + new_folio->flags &= ~PAGE_FLAGS_CHECK_AT_PREP; + new_folio->flags |= (head->flags & ((1L << PG_referenced) | (1L << PG_swapbacked) | (1L << PG_swapcache) | @@ -3364,8 +3364,8 @@ static void __split_folio_to_order(struct folio *folio, int old_order, /* ->mapping in first and second tail page is replaced by other uses */ VM_BUG_ON_PAGE(new_nr_pages > 2 && new_head->mapping != TAIL_MAPPING, new_head); - new_head->mapping = head->mapping; - new_head->index = head->index + index; + new_folio->mapping = head->mapping; + new_folio->index = head->index + index; /* * page->private should not be set in tail pages. Fix up and warn once Best Regards, Yan, Zi