tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: 9fbcd7b32bf7c0a5bda0f22c25df29d00a872017 commit: fb4b4b748b3a140c49115c9ad2973d56e6e1f7c5 [10324/10719] mm/huge_memory: unfreeze head folio after page cache entries are updated config: mips-randconfig-r132-20250313 (https://download.01.org/0day-ci/archive/20250313/202503131109.s7iuWfGq-lkp@xxxxxxxxx/config) compiler: mips-linux-gcc (GCC) 14.2.0 reproduce: (https://download.01.org/0day-ci/archive/20250313/202503131109.s7iuWfGq-lkp@xxxxxxxxx/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@xxxxxxxxx> | Closes: https://lore.kernel.org/oe-kbuild-all/202503131109.s7iuWfGq-lkp@xxxxxxxxx/ sparse warnings: (new ones prefixed by >>) >> mm/huge_memory.c:3587:46: sparse: sparse: Using plain integer as NULL pointer mm/huge_memory.c: note: in included file (through include/linux/mmzone.h, include/linux/gfp.h, include/linux/mm.h): include/linux/page-flags.h:275:46: sparse: sparse: self-comparison always evaluates to false include/linux/page-flags.h:275:46: sparse: sparse: self-comparison always evaluates to false mm/huge_memory.c:2191:20: sparse: sparse: context imbalance in 'madvise_free_huge_pmd' - unexpected unlock include/linux/page-flags.h:275:46: sparse: sparse: self-comparison always evaluates to false mm/huge_memory.c:2229:28: sparse: sparse: context imbalance in 'zap_huge_pmd' - unexpected unlock mm/huge_memory.c:2353:28: sparse: sparse: context imbalance in 'move_huge_pmd' - unexpected unlock mm/huge_memory.c:2493:20: sparse: sparse: context imbalance in 'change_huge_pmd' - unexpected unlock mm/huge_memory.c:2690:12: sparse: sparse: context imbalance in '__pmd_trans_huge_lock' - wrong count at exit include/linux/page-flags.h:275:46: sparse: sparse: self-comparison always evaluates to false mm/huge_memory.c:3450:27: sparse: sparse: context imbalance in '__split_huge_page' - unexpected unlock include/linux/page-flags.h:275:46: sparse: sparse: self-comparison always evaluates to false mm/huge_memory.c: note: in included file (through include/linux/mm.h): include/linux/page_ref.h:291:27: sparse: sparse: context imbalance in '__split_unmapped_folio' - unexpected unlock mm/huge_memory.c:4112:17: sparse: sparse: context imbalance in 'split_huge_page_to_list_to_order' - different lock contexts for basic block mm/huge_memory.c: note: in included file (through include/linux/mmzone.h, include/linux/gfp.h, include/linux/mm.h): include/linux/page-flags.h:275:46: sparse: sparse: self-comparison always evaluates to false mm/huge_memory.c:4546:17: sparse: sparse: context imbalance in 'split_huge_pages_pid' - unexpected unlock vim +3587 mm/huge_memory.c 3518 3519 /* 3520 * It splits @folio into @new_order folios and copies the @folio metadata to 3521 * all the resulting folios. 3522 */ 3523 static void __split_folio_to_order(struct folio *folio, int old_order, 3524 int new_order) 3525 { 3526 long new_nr_pages = 1 << new_order; 3527 long nr_pages = 1 << old_order; 3528 long i; 3529 3530 /* 3531 * Skip the first new_nr_pages, since the new folio from them have all 3532 * the flags from the original folio. 3533 */ 3534 for (i = new_nr_pages; i < nr_pages; i += new_nr_pages) { 3535 struct page *new_head = &folio->page + i; 3536 3537 /* 3538 * Careful: new_folio is not a "real" folio before we cleared PageTail. 3539 * Don't pass it around before clear_compound_head(). 3540 */ 3541 struct folio *new_folio = (struct folio *)new_head; 3542 3543 VM_BUG_ON_PAGE(atomic_read(&new_folio->_mapcount) != -1, new_head); 3544 3545 /* 3546 * Clone page flags before unfreezing refcount. 3547 * 3548 * After successful get_page_unless_zero() might follow flags change, 3549 * for example lock_page() which set PG_waiters. 3550 * 3551 * Note that for mapped sub-pages of an anonymous THP, 3552 * PG_anon_exclusive has been cleared in unmap_folio() and is stored in 3553 * the migration entry instead from where remap_page() will restore it. 3554 * We can still have PG_anon_exclusive set on effectively unmapped and 3555 * unreferenced sub-pages of an anonymous THP: we can simply drop 3556 * PG_anon_exclusive (-> PG_mappedtodisk) for these here. 3557 */ 3558 new_folio->flags &= ~PAGE_FLAGS_CHECK_AT_PREP; 3559 new_folio->flags |= (folio->flags & 3560 ((1L << PG_referenced) | 3561 (1L << PG_swapbacked) | 3562 (1L << PG_swapcache) | 3563 (1L << PG_mlocked) | 3564 (1L << PG_uptodate) | 3565 (1L << PG_active) | 3566 (1L << PG_workingset) | 3567 (1L << PG_locked) | 3568 (1L << PG_unevictable) | 3569 #ifdef CONFIG_ARCH_USES_PG_ARCH_2 3570 (1L << PG_arch_2) | 3571 #endif 3572 #ifdef CONFIG_ARCH_USES_PG_ARCH_3 3573 (1L << PG_arch_3) | 3574 #endif 3575 (1L << PG_dirty) | 3576 LRU_GEN_MASK | LRU_REFS_MASK)); 3577 3578 new_folio->mapping = folio->mapping; 3579 new_folio->index = folio->index + i; 3580 3581 /* 3582 * page->private should not be set in tail pages. Fix up and warn once 3583 * if private is unexpectedly set. 3584 */ 3585 if (unlikely(new_folio->private)) { 3586 VM_WARN_ON_ONCE_PAGE(true, new_head); > 3587 new_folio->private = 0; 3588 } 3589 3590 if (folio_test_swapcache(folio)) 3591 new_folio->swap.val = folio->swap.val + i; 3592 3593 /* Page flags must be visible before we make the page non-compound. */ 3594 smp_wmb(); 3595 3596 /* 3597 * Clear PageTail before unfreezing page refcount. 3598 * 3599 * After successful get_page_unless_zero() might follow put_page() 3600 * which needs correct compound_head(). 3601 */ 3602 clear_compound_head(new_head); 3603 if (new_order) { 3604 prep_compound_page(new_head, new_order); 3605 folio_set_large_rmappable(new_folio); 3606 } 3607 3608 if (folio_test_young(folio)) 3609 folio_set_young(new_folio); 3610 if (folio_test_idle(folio)) 3611 folio_set_idle(new_folio); 3612 3613 folio_xchg_last_cpupid(new_folio, folio_last_cpupid(folio)); 3614 } 3615 3616 if (new_order) 3617 folio_set_order(folio, new_order); 3618 else 3619 ClearPageCompound(&folio->page); 3620 } 3621 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki