On Wed, Jun 10, 2026 at 06:29:12PM +0800, Baolin Wang wrote:
[...]
>@@ -1512,8 +1517,12 @@ static enum scan_result mthp_collapse(struct mm_struct
>*mm,
> enum scan_result ret;
>
> collapse_address = address + offset * PAGE_SIZE;
>- ret = collapse_huge_page(mm, collapse_address,
>referenced,
>- unmapped, cc, order);
>+ if (file)
>+ ret = collapse_file(mm, collapse_address, file,
>+ start + offset, cc, order);
>+ else
>+ ret = collapse_huge_page(mm, collapse_address,
>+ referenced, unmapped, cc,
>order);
>
> switch (ret) {
> /* Cases where we continue to next collapse candidate */
>@@ -1521,6 +1530,7 @@ static enum scan_result mthp_collapse(struct mm_struct
>*mm,
> collapsed += nr_ptes;
> fallthrough;
> case SCAN_PTE_MAPPED_HUGEPAGE:
Looks like SCAN_PTE_MAPPED_HUGEPAGE from collapse_file() get lost for
the PMD-order case.
Previously, collapse_file() returned it straight back to
collapse_single_pmd(), so we would run try_collapse_pte_mapped_thp().
Now it hits mthp_collapse() fitst, and that case just goes to
next_offset ...
>+ case SCAN_PAGE_COMPOUND:
> goto next_offset;
> /* Cases where lower orders might still succeed */
> case SCAN_ALLOC_HUGE_PAGE_FAIL:
[...]
Cheers, Lance