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 fcb927cd5456..daf39aab7e86 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -1503,9 +1503,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: + 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.51.1
