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