On 2026-04-28 16:41, Mike Rapoport wrote:
From: "Mike Rapoport (Microsoft)" <[email protected]>

migration tests presume that both THP and HugeTLB huge pages are 2MB.

Add dynamic detection of huge page size with read_pmd_pagesize() for THP
and with default_huge_page_size() for HugeTLB.

Reviewed-by: Donet Tom <[email protected]>
Signed-off-by: Mike Rapoport (Microsoft) <[email protected]>
---
  tools/testing/selftests/mm/migration.c | 44 +++++++++++++++++++-------
  1 file changed, 32 insertions(+), 12 deletions(-)

diff --git a/tools/testing/selftests/mm/migration.c 
b/tools/testing/selftests/mm/migration.c
index 60e78bbfc0e3..7e547d945e1a 100644
--- a/tools/testing/selftests/mm/migration.c
+++ b/tools/testing/selftests/mm/migration.c
@@ -184,22 +184,27 @@ TEST_F_TIMEOUT(migration, shared_anon, 2*RUNTIME)
   */
  TEST_F_TIMEOUT(migration, private_anon_thp, 2*RUNTIME)
  {
+       uint64_t pmdsize;
        uint64_t *ptr;
        int i;
if (!thp_is_enabled())
                SKIP(return, "Transparent Hugepages not available");
+ pmdsize = read_pmd_pagesize();
+       if (!pmdsize)
+               SKIP(return, "Reading PMD pagesize failed");
+
        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,
+       ptr = mmap(NULL, 2 * pmdsize, PROT_READ | PROT_WRITE,
                MAP_PRIVATE | 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);
+       ptr = (uint64_t *) ALIGN((uintptr_t) ptr, pmdsize);
+       ASSERT_EQ(madvise(ptr, pmdsize, MADV_HUGEPAGE), 0);
+       memset(ptr, 0xde, pmdsize);
        for (i = 0; i < self->nthreads - 1; i++)
                if (pthread_create(&self->threads[i], NULL, access_mem, ptr))
                        perror("Couldn't create thread");
@@ -215,6 +220,7 @@ TEST_F_TIMEOUT(migration, private_anon_thp, 2*RUNTIME)
TEST_F_TIMEOUT(migration, shared_anon_thp, 2*RUNTIME)
  {
+       unsigned long pmdsize;

I don't remember if this is the one I caught before, but would be good
to match read_pmd_pagesize() uint64_t type.

As this is minor:

Reviewed-by: Luiz Capitulino <[email protected]>

        pid_t pid;
        uint64_t *ptr;
        int i;
@@ -222,17 +228,21 @@ TEST_F_TIMEOUT(migration, shared_anon_thp, 2*RUNTIME)
        if (!thp_is_enabled())
                SKIP(return, "Transparent Hugepages not available");
+ pmdsize = read_pmd_pagesize();
+       if (!pmdsize)
+               SKIP(return, "Reading PMD pagesize failed");
+
        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,
+       ptr = mmap(NULL, 2 * pmdsize, 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);
+       ptr = (uint64_t *) ALIGN((uintptr_t) ptr, pmdsize);
+       ASSERT_EQ(madvise(ptr, pmdsize, MADV_HUGEPAGE), 0);
- memset(ptr, 0xde, TWOMEG);
+       memset(ptr, 0xde, pmdsize);
        for (i = 0; i < self->nthreads - 1; i++) {
                pid = fork();
                if (!pid) {
@@ -256,17 +266,22 @@ TEST_F_TIMEOUT(migration, shared_anon_thp, 2*RUNTIME)
   */
  TEST_F_TIMEOUT(migration, private_anon_htlb, 2*RUNTIME)
  {
+       unsigned long hugepage_size;
        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,
+       hugepage_size = default_huge_page_size();
+       if (!hugepage_size)
+               SKIP(return, "Reading HugeTLB pagesize failed\n");
+
+       ptr = mmap(NULL, hugepage_size, PROT_READ | PROT_WRITE,
                MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);
        ASSERT_NE(ptr, MAP_FAILED);
- memset(ptr, 0xde, TWOMEG);
+       memset(ptr, 0xde, hugepage_size);
        for (i = 0; i < self->nthreads - 1; i++)
                if (pthread_create(&self->threads[i], NULL, access_mem, ptr))
                        perror("Couldn't create thread");
@@ -281,6 +296,7 @@ TEST_F_TIMEOUT(migration, private_anon_htlb, 2*RUNTIME)
   */
  TEST_F_TIMEOUT(migration, shared_anon_htlb, 2*RUNTIME)
  {
+       unsigned long hugepage_size;
        pid_t pid;
        uint64_t *ptr;
        int i;
@@ -288,11 +304,15 @@ TEST_F_TIMEOUT(migration, shared_anon_htlb, 2*RUNTIME)
        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,
+       hugepage_size = default_huge_page_size();
+       if (!hugepage_size)
+               SKIP(return, "Reading HugeTLB pagesize failed\n");
+
+       ptr = mmap(NULL, hugepage_size, PROT_READ | PROT_WRITE,
                MAP_SHARED | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);
        ASSERT_NE(ptr, MAP_FAILED);
- memset(ptr, 0xde, TWOMEG);
+       memset(ptr, 0xde, hugepage_size);
        for (i = 0; i < self->nthreads - 1; i++) {
                pid = fork();
                if (!pid) {


Reply via email to