Re: [PATCH v13 mm-new 07/16] khugepaged: introduce collapse_max_ptes_none helper function

kernel test robot
2025-12-03T13:41:37Z

Hi Nico,

kernel test robot noticed the following build warnings:

[auto build test WARNING on akpm-mm/mm-everything]
[also build test WARNING on next-20251203]
[cannot apply to linus/master v6.18]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Nico-Pache/khugepaged-rename-hpage_collapse_-to-collapse_/20251202-015150
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link: https://lore.kernel.org/r/20251201174627.23295-8-npache%40redhat.com
patch subject: [PATCH v13 mm-new 07/16] khugepaged: introduce collapse_max_ptes_none helper function
config: x86_64-rhel-9.4-rust (https://download.01.org/0day-ci/archive/20251203/202512032107.44KoCA71-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
rustc: rustc 1.88.0 (6b00bc388 2025-06-23)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251203/202512032107.44KoCA71-lkp@intel.com/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@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512032107.44KoCA71-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> mm/khugepaged.c:593:6: warning: variable '_pte' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
593 | if (max_ptes_none == -EINVAL)
| ^~~~~~~~~~~~~~~~~~~~~~~~
mm/khugepaged.c:724:25: note: uninitialized use occurs here
724 | release_pte_pages(pte, _pte, compound_pagelist);
| ^~~~
mm/khugepaged.c:593:2: note: remove the 'if' if its condition is always false
593 | if (max_ptes_none == -EINVAL)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
594 | goto out;
| ~~~~~~~~
mm/khugepaged.c:588:13: note: initialize the variable '_pte' to silence this warning
588 | pte_t *_pte;
| ^
| = NULL
1 warning generated.

vim +593 mm/khugepaged.c

580
581 static int __collapse_huge_page_isolate(struct vm_area_struct *vma,
582 unsigned long start_addr, pte_t *pte, struct collapse_control *cc,
583 unsigned int order, struct list_head *compound_pagelist)
584 {
585 struct page *page = NULL;
586 struct folio *folio = NULL;
587 unsigned long addr = start_addr;
588 pte_t *_pte;
589 int none_or_zero = 0, shared = 0, result = SCAN_FAIL, referenced = 0;
590 const unsigned long nr_pages = 1UL << order;
591 int max_ptes_none = collapse_max_ptes_none(order, !cc->is_khugepaged);
592
> 593 if (max_ptes_none == -EINVAL)
594 goto out;
595
596 for (_pte = pte; _pte < pte + nr_pages;
597 _pte++, addr += PAGE_SIZE) {
598 pte_t pteval = ptep_get(_pte);
599 if (pte_none_or_zero(pteval)) {
600 ++none_or_zero;
601 if (!userfaultfd_armed(vma) &&
602 (!cc->is_khugepaged ||
603 none_or_zero <= max_ptes_none)) {
604 continue;
605 } else {
606 result = SCAN_EXCEED_NONE_PTE;
607 count_vm_event(THP_SCAN_EXCEED_NONE_PTE);
608 goto out;
609 }
610 }
611 if (!pte_present(pteval)) {
612 result = SCAN_PTE_NON_PRESENT;
613 goto out;
614 }
615 if (pte_uffd_wp(pteval)) {
616 result = SCAN_PTE_UFFD_WP;
617 goto out;
618 }
619 page = vm_normal_page(vma, addr, pteval);
620 if (unlikely(!page) || unlikely(is_zone_device_page(page))) {
621 result = SCAN_PAGE_NULL;
622 goto out;
623 }
624
625 folio = page_folio(page);
626 VM_BUG_ON_FOLIO(!folio_test_anon(folio), folio);
627
628 /* See collapse_scan_pmd(). */
629 if (folio_maybe_mapped_shared(folio)) {
630 ++shared;
631 /*
632 * TODO: Support shared pages without leading to further
633 * mTHP collapses. Currently bringing in new pages via
634 * shared may cause a future higher order collapse on a
635 * rescan of the same range.
636 */
637 if (is_mthp_order(order) || (cc->is_khugepaged &&
638 shared > khugepaged_max_ptes_shared)) {
639 result = SCAN_EXCEED_SHARED_PTE;
640 count_vm_event(THP_SCAN_EXCEED_SHARED_PTE);
641 goto out;
642 }
643 }
644
645 if (folio_test_large(folio)) {
646 struct folio *f;
647
648 /*
649 * Check if we have dealt with the compound page
650 * already
651 */
652 list_for_each_entry(f, compound_pagelist, lru) {
653 if (folio == f)
654 goto next;
655 }
656 }
657
658 /*
659 * We can do it before folio_isolate_lru because the
660 * folio can't be freed from under us. NOTE: PG_lock
661 * is needed to serialize against split_huge_page
662 * when invoked from the VM.
663 */
664 if (!folio_trylock(folio)) {
665 result = SCAN_PAGE_LOCK;
666 goto out;
667 }
668
669 /*
670 * Check if the page has any GUP (or other external) pins.
671 *
672 * The page table that maps the page has been already unlinked
673 * from the page table tree and this process cannot get
674 * an additional pin on the page.
675 *
676 * New pins can come later if the page is shared across fork,
677 * but not from this process. The other process cannot write to
678 * the page, only trigger CoW.
679 */
680 if (folio_expected_ref_count(folio) != folio_ref_count(folio)) {
681 folio_unlock(folio);
682 result = SCAN_PAGE_COUNT;
683 goto out;
684 }
685
686 /*
687 * Isolate the page to avoid collapsing an hugepage
688 * currently in use by the VM.
689 */
690 if (!folio_isolate_lru(folio)) {
691 folio_unlock(folio);
692 result = SCAN_DEL_PAGE_LRU;
693 goto out;
694 }
695 node_stat_mod_folio(folio,
696 NR_ISOLATED_ANON + folio_is_file_lru(folio),
697 folio_nr_pages(folio));
698 VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio);
699 VM_BUG_ON_FOLIO(folio_test_lru(folio), folio);
700
701 if (folio_test_large(folio))
702 list_add_tail(&folio->lru, compound_pagelist);
703 next:
704 /*
705 * If collapse was initiated by khugepaged, check that there is
706 * enough young pte to justify collapsing the page
707 */
708 if (cc->is_khugepaged &&
709 (pte_young(pteval) || folio_test_young(folio) ||
710 folio_test_referenced(folio) ||
711 mmu_notifier_test_young(vma->vm_mm, addr)))
712 referenced++;
713 }
714
715 if (unlikely(cc->is_khugepaged && !referenced)) {
716 result = SCAN_LACK_REFERENCED_PAGE;
717 } else {
718 result = SCAN_SUCCEED;
719 trace_mm_collapse_huge_page_isolate(folio, none_or_zero,
720 referenced, result);
721 return result;
722 }
723 out:
724 release_pte_pages(pte, _pte, compound_pagelist);
725 trace_mm_collapse_huge_page_isolate(folio, none_or_zero,
726 referenced, result);
727 return result;
728 }
729

--
0-DAY CI Kernel Test Service