>
>
> On 9/25/26 12:41 AM, Yeoreum Yun wrote:
> > There're some random failure for split_huge_page_test when khugepaged
> > collapses pages into pmd again which had split by the test.
> >
> > Prevent the khugepaged's collapses for split page by setting the
> > mapped pmd-huge-page with MADV_NOHUGEPAGE before split.
> >
> > Suggested-by: Kevin Brodsky <[email protected]>
> > Suggested-by: Lorenzo Stoakes (ARM) <[email protected]>
> > Reviewed-by: Lorenzo Stoakes (ARM) <[email protected]>
> > Reviewed-by: Zi Yan <[email protected]>
> > Acked-by: David Hildenbrand (Arm) <[email protected]>
> > Signed-off-by: Yeoreum Yun <[email protected]>
> > ---
> > tools/testing/selftests/mm/split_huge_page_test.c | 19 +++++++++++++++++++
> > 1 file changed, 19 insertions(+)
> >
> > diff --git a/tools/testing/selftests/mm/split_huge_page_test.c
> > b/tools/testing/selftests/mm/split_huge_page_test.c
> > index c5d96a4b1db3..ef4058662b91 100644
> > --- a/tools/testing/selftests/mm/split_huge_page_test.c
> > +++ b/tools/testing/selftests/mm/split_huge_page_test.c
> > @@ -108,6 +108,18 @@ static char *allocate_zero_filled_hugepage(size_t len)
> > return result;
> > }
> >
> > +static void disable_khugepaged(void *addr, size_t len)
> > +{
> > + /*
> > + * Disables khugepaged from collapsing THPs in range, existing THP
>
> Should it be "collapsing pages in range into THPs" instead?
That would be clear. I'll change with it.
>
> > + * pages remain.
> > + */
> > + if (!madvise(addr, len, MADV_NOHUGEPAGE))
> > + return;
> > +
> > + ksft_exit_fail_msg("MADV_NOHUGEPAGE failed, err=%d\n", errno);
>
> I feel a ksft_exit_fail_perror() would be better here, since it will
> automatically print strerror(errno) as well. Still, it is not something
> that should require a respin of its own, so if you plan to respin for
> some other changes, you might fold these changes in as well.
Yeap. I'll change it with _perror.
>
> Rest looks good, so:
>
> Reviewed-by: Sarthak Sharma <[email protected]>
>
> > +}
> > +
> > static void verify_rss_anon_split_huge_page_all_zeroes(char *one_page, int
> > nr_hpages, size_t len)
> > {
> > unsigned long rss_anon_before, rss_anon_after;
> > @@ -120,6 +132,8 @@ static void
> > verify_rss_anon_split_huge_page_all_zeroes(char *one_page, int nr_hp
> > if (!rss_anon_before)
> > ksft_exit_fail_msg("No RssAnon is allocated before split\n");
> >
> > + disable_khugepaged(one_page, len);
> > +
> > /* split all THPs */
> > write_debugfs(PID_FMT, getpid(), (uint64_t)one_page,
> > (uint64_t)one_page + len, 0);
> > @@ -167,6 +181,8 @@ static void split_pmd_thp_to_order(int order)
> > if (!check_huge_anon(one_page, 4 * pmd_pagesize, 4, pmd_pagesize))
> > ksft_exit_fail_msg("No THP is allocated\n");
> >
> > + disable_khugepaged(one_page, len);
> > +
> > /* split all THPs */
> > write_debugfs(PID_FMT, getpid(), (uint64_t)one_page,
> > (uint64_t)one_page + len, order);
> > @@ -215,6 +231,8 @@ static void split_pte_mapped_thp(void)
> > goto out;
> > }
> >
> > + disable_khugepaged(thp_area, thp_area_size);
> > +
> > /*
> > * To challenge spitting code, we will mremap a single page of each
> > * THP (page[i] of thp[i]) in the thp_area into page_area. This will
> > @@ -482,6 +500,7 @@ static int create_pagecache_thp_and_fd(const char
> > *testfile, size_t fd_size,
> > ksft_test_result_skip("Pagecache folio split skipped\n");
> > return -2;
> > }
> > + disable_khugepaged(*addr, fd_size);
> > return 0;
> > err_out_close:
> > close(*fd);
> >
>
--
Sincerely,
Yeoreum Yun