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

__madvise_collapse() turns THP off before each MADV_COLLAPSE, both to keep
khugepaged out of the range and to prove MADV_COLLAPSE ignores the setting.
It clears the global controls only, which is no longer enough.  A per-order
control overrides them, and -s leaves the source order at "always", so
khugepaged collapses the very range the case is working on.  The case then
fails on a collapse that was interfered with rather than refused.

Clear the per-order controls too.  Set them to "inherit", not "never".
khugepaged honours the global never and stays out.  A forced shmem collapse
takes the order it builds from these very controls, and still finds one.

Fixes: 9f0704eae8a4 ("selftests/mm/khugepaged: enlighten for multi-size THP")
Assisted-by: Claude-Code:claude-opus-5
Signed-off-by: Kiryl Shutsemau (Meta) <[email protected]>
---
 tools/testing/selftests/mm/khugepaged.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/mm/khugepaged.c 
b/tools/testing/selftests/mm/khugepaged.c
index 7eb9db0005a0..0008862e7cbc 100644
--- a/tools/testing/selftests/mm/khugepaged.c
+++ b/tools/testing/selftests/mm/khugepaged.c
@@ -550,8 +550,8 @@ static bool is_anon(struct mem_ops *ops)
 static void __madvise_collapse(const char *msg, char *p, int nr_hpages,
                               struct mem_ops *ops, bool expect)
 {
-       int ret;
        struct thp_settings settings = *thp_current_settings();
+       int ret, i;
 
        ksft_print_msg("%s...", msg);
 
@@ -564,9 +564,20 @@ static void __madvise_collapse(const char *msg, char *p, 
int nr_hpages,
        /*
         * Prevent khugepaged interference and tests that MADV_COLLAPSE
         * ignores /sys/kernel/mm/transparent_hugepage/enabled
+        *
+        * The per-order controls have to go too, not just the global one: a
+        * source order left at "always" -- which -s does -- lets khugepaged
+        * collapse the very range the case is working on.  Set them to
+        * "inherit", not "never".  khugepaged honours the global never and
+        * stays out.  A forced shmem collapse takes the order it builds from
+        * these very controls, and still finds one.
         */
        settings.thp_enabled = THP_NEVER;
        settings.shmem_enabled = SHMEM_NEVER;
+       for (i = 0; i < NR_ORDERS; i++) {
+               settings.hugepages[i].enabled = THP_INHERIT;
+               settings.shmem_hugepages[i].enabled = SHMEM_INHERIT;
+       }
        thp_push_settings(&settings);
 
        /* Clear VM_NOHUGEPAGE */
-- 
2.54.0


Reply via email to