From: "Kiryl Shutsemau (Meta)" <[email protected]>

collapse_compound_extreme builds a PTE table full of distinct PTE-mapped
compound pages by cycling hpage_pmd_nr fault-time THPs through mremap.  It
therefore needs hpage_pmd_nr PMD-order allocations in a row.  That is fine
at a 2M PMD (4K base pages) or a 32M one (16K), but a 512M PMD -- arm64
with 64K base pages -- makes each of those an order-13 allocation, which
the allocator cannot reliably hand out even once, let alone 8192 times.

The failure is not a quiet one: the case calls ksft_exit_fail_msg(), so the
whole binary stops and every case after it is lost.

Skip the case where the PMD is larger than 32M.  The MADV_COLLAPSE cases
still cover PMD-order collapse on those configurations, and 4K and 16K
PMDs are unaffected.

Assisted-by: Claude-Code:claude-opus-5
Signed-off-by: Kiryl Shutsemau (Meta) <[email protected]>
---
 tools/testing/selftests/mm/khugepaged.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/tools/testing/selftests/mm/khugepaged.c 
b/tools/testing/selftests/mm/khugepaged.c
index 9a90ff5f484e..51fc1f04d0a0 100644
--- a/tools/testing/selftests/mm/khugepaged.c
+++ b/tools/testing/selftests/mm/khugepaged.c
@@ -1007,6 +1007,16 @@ static void collapse_compound_extreme(struct 
collapse_context *c, struct mem_ops
        void *p;
        int i;
 
+       /*
+        * The test needs hpage_pmd_nr PMD-order allocations, which is likely to
+        * fail for large PMD sizes.  Skip if the PMD size is over 32M.
+        */
+       if (hpage_pmd_size > (32UL << 20)) {
+               ksft_test_result_skip("%s: PMD too large for fault-time THP 
construction\n",
+                                     __func__);
+               return;
+       }
+
        p = ops->setup_area(1);
        ksft_print_msg("Construct PTE page table full of different PTE-mapped 
compound pages\n");
        for (i = 0; i < hpage_pmd_nr; i++) {
-- 
2.54.0


Reply via email to