On Sat, Aug 15, 2026 at 02:58:54AM +0100, Kiryl Shutsemau wrote: > 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. 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. The other mTHP cases are > unaffected: mthp_push_target_order() enables only the target order. > > "-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]>
Looks reasonable to me so: Acked-by: Lorenzo Stoakes (ARM) <[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 0489967d6ee0..1844ddd77b59 100644 > --- a/tools/testing/selftests/mm/khugepaged.c > +++ b/tools/testing/selftests/mm/khugepaged.c > @@ -1389,10 +1389,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; > @@ -1400,23 +1403,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(); > @@ -1425,7 +1427,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)) > @@ -1456,6 +1459,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 > -- Cheers, Lorenzo

