selftests/mm: pagemap_ioctl: use the correct page size for transact_test()
Subsystems (3)
PATCH 1/1 selftests/mm: pagemap_ioctl: use the correct page size for transact_test()
There are several places in transact_test() where we use the hardcoded 0x1000 (4k) as page size, which is not always correct for architectures supporting multiple page sizes.
Switch to use the correct page size. Otherwise ./ksft_pagemap.sh on a 16k-page-size arm64 box fails with
$ ./ksft_pagemap.sh [...] # ok 96 mprotect_tests Both pages written after remap and mprotect # ok 97 mprotect_tests Clear and make the pages written # Bail out! ioctl failed # # Planned tests != run tests (117 != 97) # # Totals: pass:97 fail:0 xfail:0 xpass:0 skip:0 error:0 # [FAIL] not ok 1 pagemap_ioctl # exit=1 # SUMMARY: PASS=0 SKIP=0 FAIL=1 1..1
--- tools/testing/selftests/mm/pagemap_ioctl.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
tools/testing/selftests/mm/pagemap_ioctl.c +6 -6
@@ -1368,7 +1368,7 @@ void *thread_proc(void *mem)ksft_exit_fail_msg ("pthread_barrier_wait\n" );for (i =0 ; i < access_per_thread; ++i) -__atomic_add_fetch (m + i * (0x1000 /sizeof (*m)),1 , __ATOMIC_SEQ_CST); +__atomic_add_fetch (m + i * (page_size /sizeof (*m)),1 , __ATOMIC_SEQ_CST); ret =pthread_barrier_wait (&end_barrier);if (ret && ret !=PTHREAD_BARRIER_SERIAL_THREAD )
@@ -1403,15 +1403,15 @@ static void transact_test(int page_size)if (pthread_barrier_init (&end_barrier,NULL , nthreads +1 ))ksft_exit_fail_msg ("pthread_barrier_init\n" ); - mem =mmap (NULL ,0x1000 * nthreads * pages_per_thread,PROT_READ |PROT_WRITE , + mem =mmap (NULL , page_size * nthreads * pages_per_thread,PROT_READ |PROT_WRITE ,MAP_ANONYMOUS |MAP_PRIVATE ,-1 ,0 );if (mem ==MAP_FAILED )ksft_exit_fail_msg ("Error mmap %s.\n" ,strerror (errno)); -wp_init (mem,0x1000 * nthreads * pages_per_thread); -wp_addr_range (mem,0x1000 * nthreads * pages_per_thread); +wp_init (mem, page_size * nthreads * pages_per_thread); +wp_addr_range (mem, page_size * nthreads * pages_per_thread); -memset (mem,0 ,0x1000 * nthreads * pages_per_thread); +memset (mem,0 , page_size * nthreads * pages_per_thread); count =get_dirty_pages_reset (mem, nthreads * pages_per_thread,1 , page_size);ksft_test_result (count >0 ,"%s count %u\n" , __func__, count);
@@ -1420,7 +1420,7 @@ static void transact_test(int page_size) finish =0 ;for (i =0 ; i < nthreads; ++i) -pthread_create (&th,NULL , thread_proc, mem +0x1000 * i * pages_per_thread); +pthread_create (&th,NULL , thread_proc, mem + page_size * i * pages_per_thread); extra_pages =0 ;for (i =0 ; i < iter_count; ++i) {
Signature · 1 line
2.53.0
Andrew Morton
maintainerQuoted 3 lines · On Sun, 28 Jun 2026 18:11:18 +0800 Zenghui Yu <[email protected]> wrote:
There are several places in
transact_test()where we use the hardcoded0x1000(4k) as page size, which is not always correct for architectures supporting multiple page sizes.
doh.
Quoted 14 lines
Switch to use the correct page size. Otherwise ./ksft_pagemap.sh on a 16k-page-size arm64 box fails with
$ ./ksft_pagemap.sh [...] # ok 96 mprotect_tests Both pages written after remap and mprotect # ok 97 mprotect_tests Clear and make the pages written # Bail out! ioctl failed # # Planned tests != run tests (117 != 97) # # Totals: pass:97 fail:0 xfail:0 xpass:0 skip:0 error:0 # [FAIL] not ok 1 pagemap_ioctl # exit=1 # SUMMARY: PASS=0 SKIP=0 FAIL=1 1..1
Thanks. I'll add a cc:stable to this.
Quoted 2 lines
tools/testing/selftests/mm/pagemap_ioctl.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
I'd like to see this code initialize page_size and hpage_size before calling init_uffd(), hugetlb_setup_default(), etc. That won't fix anything but it's safer and saner to get these globals set up before doing other things.