> 
> 
> 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

Reply via email to