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 Signed-off-by: Kiryl Shutsemau (Meta) <[email protected]> --- tools/testing/selftests/mm/khugepaged.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/mm/khugepaged.c b/tools/testing/selftests/mm/khugepaged.c index bcaef17e430d..d3ff1b196e09 100644 --- a/tools/testing/selftests/mm/khugepaged.c +++ b/tools/testing/selftests/mm/khugepaged.c @@ -1430,10 +1430,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; @@ -1441,21 +1444,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(); - 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_exit_fail_msg("Region not backed by order-%d folios after fault\n", - MIN_MTHP_ORDER); + source_order); 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)) @@ -1486,6 +1490,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

