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

Reply via email to