selftests/mm: add new test cases to the migration test
authorDonet Tom <donettom@linux.ibm.com>
Thu, 19 Dec 2024 10:27:20 +0000 (04:27 -0600)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 26 Jan 2025 04:22:21 +0000 (20:22 -0800)
Added three new test cases to the migration tests:

1. Shared anon THP migration test
This test will mmap shared anon memory, madvise it to
MADV_HUGEPAGE, then do migration entry testing. One thread
will move pages back and forth between nodes whilst other
threads try and access them.

2. Private anon hugetlb migration test
This test will mmap private anon hugetlb memory and then
do the migration entry testing.

3. Shared anon hugetlb migration test
This test will mmap shared anon hugetlb memory and then
do the migration entry testing.

Test results
============
 # ./tools/testing/selftests/mm/migration
 TAP version 13
 1..6
 # Starting 6 tests from 1 test cases.
 #  RUN           migration.private_anon ...
 #            OK  migration.private_anon
 ok 1 migration.private_anon
 #  RUN           migration.shared_anon ...
 #            OK  migration.shared_anon
 ok 2 migration.shared_anon
 #  RUN           migration.private_anon_thp ...
 #            OK  migration.private_anon_thp
 ok 3 migration.private_anon_thp
 #  RUN           migration.shared_anon_thp ...
 #            OK  migration.shared_anon_thp
 ok 4 migration.shared_anon_thp
 #  RUN           migration.private_anon_htlb ...
 #            OK  migration.private_anon_htlb
 ok 5 migration.private_anon_htlb
 #  RUN           migration.shared_anon_htlb ...
 #            OK  migration.shared_anon_htlb
 ok 6 migration.shared_anon_htlb
 # PASSED: 6 / 6 tests passed.
 # Totals: pass:6 fail:0 xfail:0 xpass:0 skip:0 error:0
 #

Link: https://lkml.kernel.org/r/20241219102720.4487-1-donettom@linux.ibm.com
Signed-off-by: Donet Tom <donettom@linux.ibm.com>
Reviewed-by: Dev Jain <dev.jain@arm.com>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
tools/testing/selftests/mm/migration.c

index 64bcbb7151cff52b1d365e74362c8affa750571d..1e3a595fbf012f3b0d9a1a2c98f482368bfce0c8 100644 (file)
@@ -204,4 +204,103 @@ TEST_F_TIMEOUT(migration, private_anon_thp, 2*RUNTIME)
                ASSERT_EQ(pthread_cancel(self->threads[i]), 0);
 }
 
+/*
+ * migration test with shared anon THP page
+ */
+
+TEST_F_TIMEOUT(migration, shared_anon_thp, 2*RUNTIME)
+{
+       pid_t pid;
+       uint64_t *ptr;
+       int i;
+
+       if (self->nthreads < 2 || self->n1 < 0 || self->n2 < 0)
+               SKIP(return, "Not enough threads or NUMA nodes available");
+
+       ptr = mmap(NULL, 2 * TWOMEG, PROT_READ | PROT_WRITE,
+               MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+       ASSERT_NE(ptr, MAP_FAILED);
+
+       ptr = (uint64_t *) ALIGN((uintptr_t) ptr, TWOMEG);
+       ASSERT_EQ(madvise(ptr, TWOMEG, MADV_HUGEPAGE), 0);
+
+       memset(ptr, 0xde, TWOMEG);
+       for (i = 0; i < self->nthreads - 1; i++) {
+               pid = fork();
+               if (!pid) {
+                       prctl(PR_SET_PDEATHSIG, SIGHUP);
+                       /* Parent may have died before prctl so check now. */
+                       if (getppid() == 1)
+                               kill(getpid(), SIGHUP);
+                       access_mem(ptr);
+               } else {
+                       self->pids[i] = pid;
+               }
+       }
+
+       ASSERT_EQ(migrate(ptr, self->n1, self->n2), 0);
+       for (i = 0; i < self->nthreads - 1; i++)
+               ASSERT_EQ(kill(self->pids[i], SIGTERM), 0);
+}
+
+/*
+ * migration test with private anon hugetlb page
+ */
+TEST_F_TIMEOUT(migration, private_anon_htlb, 2*RUNTIME)
+{
+       uint64_t *ptr;
+       int i;
+
+       if (self->nthreads < 2 || self->n1 < 0 || self->n2 < 0)
+               SKIP(return, "Not enough threads or NUMA nodes available");
+
+       ptr = mmap(NULL, TWOMEG, PROT_READ | PROT_WRITE,
+               MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);
+       ASSERT_NE(ptr, MAP_FAILED);
+
+       memset(ptr, 0xde, TWOMEG);
+       for (i = 0; i < self->nthreads - 1; i++)
+               if (pthread_create(&self->threads[i], NULL, access_mem, ptr))
+                       perror("Couldn't create thread");
+
+       ASSERT_EQ(migrate(ptr, self->n1, self->n2), 0);
+       for (i = 0; i < self->nthreads - 1; i++)
+               ASSERT_EQ(pthread_cancel(self->threads[i]), 0);
+}
+
+/*
+ * migration test with shared anon hugetlb page
+ */
+TEST_F_TIMEOUT(migration, shared_anon_htlb, 2*RUNTIME)
+{
+       pid_t pid;
+       uint64_t *ptr;
+       int i;
+
+       if (self->nthreads < 2 || self->n1 < 0 || self->n2 < 0)
+               SKIP(return, "Not enough threads or NUMA nodes available");
+
+       ptr = mmap(NULL, TWOMEG, PROT_READ | PROT_WRITE,
+               MAP_SHARED | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);
+       ASSERT_NE(ptr, MAP_FAILED);
+
+       memset(ptr, 0xde, TWOMEG);
+       for (i = 0; i < self->nthreads - 1; i++) {
+               pid = fork();
+               if (!pid) {
+                       prctl(PR_SET_PDEATHSIG, SIGHUP);
+                       /* Parent may have died before prctl so check now. */
+                       if (getppid() == 1)
+                               kill(getpid(), SIGHUP);
+                       access_mem(ptr);
+               } else {
+                       self->pids[i] = pid;
+               }
+       }
+
+       ASSERT_EQ(migrate(ptr, self->n1, self->n2), 0);
+       for (i = 0; i < self->nthreads - 1; i++)
+               ASSERT_EQ(kill(self->pids[i], SIGTERM), 0);
+}
+
 TEST_HARNESS_MAIN