Re: [PATCH v4 12/19] selftests/mm: parameterize the mixed-source collapse case by source order
From: Lorenzo Stoakes (ARM)
Date: Tue Aug 18 2026 - 06:48:49 EST
On Sat, Aug 15, 2026 at 02:58:54AM +0100, Kiryl Shutsemau wrote:
> From: "Kiryl Shutsemau (Meta)" <kas@xxxxxxxxxx>
>
> 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 <usama.anjum@xxxxxxx>
> Signed-off-by: Kiryl Shutsemau (Meta) <kas@xxxxxxxxxx>
Looks reasonable to me so:
Acked-by: Lorenzo Stoakes (ARM) <ljs@xxxxxxxxxx>
> ---
> 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