On Sat, Aug 15, 2026 at 02:58:48AM +0100, Kiryl Shutsemau wrote:
> 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.
Again far too many words, schloppy. Trim it please. This isn't a chat with
claude it's a comment.
> */
> 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
>
--
Cheers, Lorenzo