From: "Kiryl Shutsemau (Meta)" <[email protected]> collapse_order_mixed_sources faults its region as order-2 folios and collapses them to the -c target. Order 2 sits below the contpte threshold on both arm64 page-size configurations, so nothing in this suite unfolds a contpte source on purpose.
Let -s name the source order alongside -c, which was rejected before. The case then faults at that order, keeping order 2 when -s is absent, and the source order has to be a supported mTHP order below the target. Other cases are unaffected: they enable their source order locally. "-s 5 -c 7" on arm64/64K then collapses contpte-mapped sources into a larger mTHP. Assisted-by: Claude-Code:claude-opus-5 Tested-by: Muhammad Usama Anjum <[email protected]> Signed-off-by: Kiryl Shutsemau (Meta) <[email protected]> --- tools/testing/selftests/mm/khugepaged.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/tools/testing/selftests/mm/khugepaged.c b/tools/testing/selftests/mm/khugepaged.c index 7889ea1cd322..3099e7b720d9 100644 --- a/tools/testing/selftests/mm/khugepaged.c +++ b/tools/testing/selftests/mm/khugepaged.c @@ -1412,10 +1412,13 @@ static void collapse_order_max_ptes_none(struct collapse_context *c, static void collapse_order_mixed_sources(struct collapse_context *c, struct mem_ops *ops) { + int source_order = anon_order ? anon_order : MIN_MTHP_ORDER; struct thp_settings settings; void *p; - if (collapse_order <= MIN_MTHP_ORDER) { + /* Sources must be a supported mTHP order strictly below the target. */ + if (source_order >= collapse_order || + !(thp_supported_orders() & (1UL << source_order))) { ksft_test_result_skip("%s: no source order below target\n", __func__); return; @@ -1423,23 +1426,22 @@ static void collapse_order_mixed_sources(struct collapse_context *c, mthp_push_target_order(); - /* Fault the whole region as order-MIN_MTHP_ORDER folios. */ + /* Fault the whole region as order-@source_order folios. */ settings = *thp_current_settings(); - settings.hugepages[MIN_MTHP_ORDER].enabled = THP_ALWAYS; + settings.hugepages[source_order].enabled = THP_ALWAYS; thp_push_settings(&settings); p = ops->setup_area(1); ops->fault(p, 0, hpage_pmd_size); thp_pop_settings(); /* - * The order is enabled, but the allocator can still fall back under - * fragmentation. That leaves nothing to collapse from, which is the - * machine's answer rather than a reason to end the run. + * The order is enabled and supported, but the allocator can still fall + * back under fragmentation. That leaves nothing to collapse from, + * which is the machine's answer rather than a reason to end the run. */ - if (!is_range_backed_by_folio_orders(p, hpage_pmd_size, MIN_MTHP_ORDER, + if (!is_range_backed_by_folio_orders(p, hpage_pmd_size, source_order, pagemap_fd, kpageflags_fd)) { - ksft_print_msg("No order-%d sources to collapse...", - MIN_MTHP_ORDER); + ksft_print_msg("No order-%d sources to collapse...", source_order); skip("Skip"); ops->cleanup_area(p, hpage_pmd_size); thp_pop_settings(); @@ -1448,7 +1450,8 @@ static void collapse_order_mixed_sources(struct collapse_context *c, } madvise(p, hpage_pmd_size, MADV_HUGEPAGE); - ksft_print_msg("Collapse region backed by smaller large folios..."); + ksft_print_msg("Collapse region backed by order-%d sources...", + source_order); if (!khugepaged_wait_full_pass()) fail("Timeout"); else if (window_collapsed(p, hpage_pmd_size)) @@ -1479,6 +1482,8 @@ static void usage(void) fprintf(stderr, "\t\t-s: mTHP size, expressed as page order.\n"); fprintf(stderr, "\t\t Defaults to 0. Use this size for anon or shmem allocations.\n"); fprintf(stderr, "\t\t-c: collapse order for mTHP collapse, expressed as page order.\n"); + fprintf(stderr, "\t\t With -s, -s names the mTHP source order for the\n"); + fprintf(stderr, "\t\t mixed-source case (source order below the target).\n"); exit(1); } -- 2.54.0

