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


Reply via email to