On Wed, 25 Feb 2026 20:26:31 -0700 Nico Pache <[email protected]> wrote:
> There are cases where, if an attempted collapse fails, all subsequent > orders are guaranteed to also fail. Avoid these collapse attempts by > bailing out early. > > Signed-off-by: Nico Pache <[email protected]> > --- > mm/khugepaged.c | 35 ++++++++++++++++++++++++++++++++++- > 1 file changed, 34 insertions(+), 1 deletion(-) > > diff --git a/mm/khugepaged.c b/mm/khugepaged.c > index 1c3711ed4513..388d3f2537e2 100644 > --- a/mm/khugepaged.c > +++ b/mm/khugepaged.c > @@ -1492,9 +1492,42 @@ static int mthp_collapse(struct mm_struct *mm, > unsigned long address, > ret = collapse_huge_page(mm, collapse_address, > referenced, > unmapped, cc, mmap_locked, > order); > - if (ret == SCAN_SUCCEED) { > + > + switch (ret) { > + /* Cases were we continue to next collapse candidate */ > + case SCAN_SUCCEED: > collapsed += nr_pte_entries; > + fallthrough; > + case SCAN_PTE_MAPPED_HUGEPAGE: > continue; > + /* Cases were lower orders might still succeed */ > + case SCAN_LACK_REFERENCED_PAGE: > + case SCAN_EXCEED_NONE_PTE: > + case SCAN_EXCEED_SWAP_PTE: > + case SCAN_EXCEED_SHARED_PTE: > + case SCAN_PAGE_LOCK: > + case SCAN_PAGE_COUNT: > + case SCAN_PAGE_LRU: > + case SCAN_PAGE_NULL: > + case SCAN_DEL_PAGE_LRU: > + case SCAN_PTE_NON_PRESENT: > + case SCAN_PTE_UFFD_WP: > + case SCAN_ALLOC_HUGE_PAGE_FAIL: > + goto next_order; > + /* Cases were no further collapse is possible */ > + case SCAN_CGROUP_CHARGE_FAIL: The only one that stands out to me is SCAN_CGROUP_CHARGE_FAIL. memcg charging of higher order folio might fail, but a lower order folio might pass? That said, if the cgroup is that tight, continuing collapse work may not be productive. Acked-by: Usama Arif <[email protected]> > + case SCAN_COPY_MC: > + case SCAN_ADDRESS_RANGE: > + case SCAN_NO_PTE_TABLE: > + case SCAN_ANY_PROCESS: > + case SCAN_VMA_NULL: > + case SCAN_VMA_CHECK: > + case SCAN_SCAN_ABORT: > + case SCAN_PAGE_ANON: > + case SCAN_PMD_MAPPED: > + case SCAN_FAIL: > + default: > + return collapsed; > } > } > > -- > 2.53.0 > >
