On 4/29/26 2:12 AM, Mike Rapoport wrote: > From: "Mike Rapoport (Microsoft)" <[email protected]> > > migration skips HugeTLB tests if there are no free huge pages > prepared by a wrapper script. > > Add setup of HugeTLB pages to the test and make sure that the original > settings are restored on the test exit. > > Since kselftest_harness runs fixture setup and the tests in child > processes, use HUGETLB_SETUP_DEFAULT_PAGES() that defines a constructor > that runs in the main process and add verification that there are enough > free huge pages to the tests that use them. > > Reset signal handlers to defaults in FIXTURE_SETUP() so that sending > SIGTERM and SIGHUP during the tests won't cause restoration of HugeTLB > settings. > > Signed-off-by: Mike Rapoport (Microsoft) <[email protected]> I have run the test before and after applying the patch. Before the patch, the hugetlb subtests failed with MAP_FAILED because hugepages were not preallocated. After the patch, those subtests correctly allocate the required hugepages and pass successfully, restoring the original settings at exit. Tested-by: Sarthak Sharma [email protected] > --- > tools/testing/selftests/mm/migration.c | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/tools/testing/selftests/mm/migration.c > b/tools/testing/selftests/mm/migration.c > index 0212cd5bde6e..f212c1b06455 100644 > --- a/tools/testing/selftests/mm/migration.c > +++ b/tools/testing/selftests/mm/migration.c > @@ -23,6 +23,8 @@ > #define MAX_RETRIES 100 > #define ALIGN(x, a) (((x) + (a - 1)) & (~((a) - 1))) > > +HUGETLB_SETUP_DEFAULT_PAGES(1) > + > FIXTURE(migration) > { > pthread_t *threads; > @@ -32,10 +34,21 @@ FIXTURE(migration) > int n2; > }; > > +static void reset_signals(void) > +{ > + struct sigaction sa = { .sa_handler = SIG_DFL }; > + > + sigemptyset(&sa.sa_mask); > + sigaction(SIGTERM, &sa, NULL); > + sigaction(SIGHUP, &sa, NULL); > +} > + > FIXTURE_SETUP(migration) > { > int n; > > + reset_signals(); > + > if (numa_available() < 0) > SKIP(return, "NUMA not available"); > self->nthreads = numa_num_task_cpus() - 2; > @@ -271,6 +284,9 @@ TEST_F_TIMEOUT(migration, private_anon_htlb, 2*RUNTIME) > if (!hugepage_size) > SKIP(return, "Reading HugeTLB pagesize failed\n"); > > + if (hugetlb_free_default_pages() < 1) > + SKIP(return, "Not enough huge pages\n"); > + > ptr = mmap(NULL, hugepage_size, PROT_READ | PROT_WRITE, > MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0); > ASSERT_NE(ptr, MAP_FAILED); > @@ -299,6 +315,9 @@ TEST_F_TIMEOUT(migration, shared_anon_htlb, 2*RUNTIME) > if (!hugepage_size) > SKIP(return, "Reading HugeTLB pagesize failed\n"); > > + if (hugetlb_free_default_pages() < 1) > + SKIP(return, "Not enough huge pages\n"); > + > ptr = mmap(NULL, hugepage_size, PROT_READ | PROT_WRITE, > MAP_SHARED | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0); > ASSERT_NE(ptr, MAP_FAILED);

