Enable these tests to be run on other pfnmap'ed memory like NVIDIA's EGM.
Add '--' as a separator to pass in file path. This allows passing of cmd line arguments to kselftest_harness. Use '/dev/mem' as default filename.
Existing test passes: pfnmap TAP version 13 1..6 # Starting 6 tests from 1 test cases. # PASSED: 6 / 6 tests passed. # Totals: pass:6 fail:0 xfail:0 xpass:0 skip:0 error:0
Pass params to kselftest_harness: pfnmap -r pfnmap:mremap_fixed TAP version 13 1..1 # Starting 1 tests from 1 test cases. # RUN pfnmap.mremap_fixed ... # OK pfnmap.mremap_fixed ok 1 pfnmap.mremap_fixed # PASSED: 1 / 1 tests passed. # Totals: pass:1 fail:0 xfail:0 xpass:0 skip:0 error:0
Pass random file name as input: pfnmap -- /dev/blah TAP version 13 1..6 # Starting 6 tests from 1 test cases. # RUN pfnmap.madvise_disallowed ... # SKIP Cannot open '/dev/blah'
Signed-off-by: Sudarsan Mahendran sudarsanm@google.com --- tools/testing/selftests/mm/pfnmap.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/tools/testing/selftests/mm/pfnmap.c b/tools/testing/selftests/mm/pfnmap.c index 866ac023baf5..2d4e8b165f91 100644 --- a/tools/testing/selftests/mm/pfnmap.c +++ b/tools/testing/selftests/mm/pfnmap.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Basic VM_PFNMAP tests relying on mmap() of '/dev/mem' + * Basic VM_PFNMAP tests relying on mmap() of input file provided. + * Use '/dev/mem' as default. * * Copyright 2025, Red Hat, Inc. * @@ -25,6 +26,7 @@ #include "vm_util.h"
static sigjmp_buf sigjmp_buf_env; +static char *file = "/dev/mem";
static void signal_handler(int sig) { @@ -117,19 +119,19 @@ FIXTURE_SETUP(pfnmap) if (find_ram_target(&self->phys_addr, self->pagesize)) SKIP(return, "Cannot find ram target in '/proc/iomem'\n");
- self->dev_mem_fd = open("/dev/mem", O_RDONLY); + self->dev_mem_fd = open(file, O_RDONLY); if (self->dev_mem_fd < 0) - SKIP(return, "Cannot open '/dev/mem'\n"); + SKIP(return, "Cannot open '%s'\n", file);
self->size1 = self->pagesize * 2; self->addr1 = mmap(NULL, self->size1, PROT_READ, MAP_SHARED, self->dev_mem_fd, self->phys_addr); if (self->addr1 == MAP_FAILED) - SKIP(return, "Cannot mmap '/dev/mem'\n"); + SKIP(return, "Cannot mmap '%s'\n", file);
/* ... and want to be able to read from them. */ if (test_read_access(self->addr1, self->size1, self->pagesize)) - SKIP(return, "Cannot read-access mmap'ed '/dev/mem'\n"); + SKIP(return, "Cannot read-access mmap'ed '%s'\n", file);
self->size2 = 0; self->addr2 = MAP_FAILED; @@ -246,4 +248,14 @@ TEST_F(pfnmap, fork) ASSERT_EQ(ret, 0); }
-TEST_HARNESS_MAIN +int main(int argc, char **argv) +{ + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "--") == 0) { + if (i + 1 < argc && strlen(argv[i + 1]) > 0) + file = argv[i + 1]; + return test_harness_run(i, argv); + } + } + return test_harness_run(argc, argv); +}
On 31.07.25 22:10, Sudarsan Mahendran wrote:
Enable these tests to be run on other pfnmap'ed memory like NVIDIA's EGM.
Add '--' as a separator to pass in file path. This allows passing of cmd line arguments to kselftest_harness. Use '/dev/mem' as default filename.
Existing test passes: pfnmap TAP version 13 1..6 # Starting 6 tests from 1 test cases. # PASSED: 6 / 6 tests passed. # Totals: pass:6 fail:0 xfail:0 xpass:0 skip:0 error:0
Pass params to kselftest_harness: pfnmap -r pfnmap:mremap_fixed TAP version 13 1..1 # Starting 1 tests from 1 test cases. # RUN pfnmap.mremap_fixed ... # OK pfnmap.mremap_fixed ok 1 pfnmap.mremap_fixed # PASSED: 1 / 1 tests passed. # Totals: pass:1 fail:0 xfail:0 xpass:0 skip:0 error:0
Pass random file name as input: pfnmap -- /dev/blah TAP version 13 1..6 # Starting 6 tests from 1 test cases. # RUN pfnmap.madvise_disallowed ... # SKIP Cannot open '/dev/blah'
Now, if you really just pass a random *actual file* that exists, the test case will not actually test what we want.
Unless you have a way to verify that you actually get a PFNMAP mapping, this extension is questionable. It will make the test report possibly wrong results when wrong files are provided.
I think we can test whether we get a PFNMAP mapping by looking at the flags in smaps output ("pf" in flags), so I would expect such a test to be done in pfnmap, and the test should FAIL if the file would not create a PFNMAP.
But more importantly, we rely on "/proc/iomem" to find a RAM target in /dev/mem. That doesn't make any sense with what you are doing here.
If we are not provided /dev/mem, you should probably try mapping offset 0 of the file.
Thanks for the review! I've sent a follow up v2 patch.
On Fri, Aug 1, 2025 at 12:15 AM David Hildenbrand david@redhat.com wrote:
On 31.07.25 22:10, Sudarsan Mahendran wrote:
Enable these tests to be run on other pfnmap'ed memory like NVIDIA's EGM.
Add '--' as a separator to pass in file path. This allows passing of cmd line arguments to kselftest_harness. Use '/dev/mem' as default filename.
Existing test passes: pfnmap TAP version 13 1..6 # Starting 6 tests from 1 test cases. # PASSED: 6 / 6 tests passed. # Totals: pass:6 fail:0 xfail:0 xpass:0 skip:0 error:0
Pass params to kselftest_harness: pfnmap -r pfnmap:mremap_fixed TAP version 13 1..1 # Starting 1 tests from 1 test cases. # RUN pfnmap.mremap_fixed ... # OK pfnmap.mremap_fixed ok 1 pfnmap.mremap_fixed # PASSED: 1 / 1 tests passed. # Totals: pass:1 fail:0 xfail:0 xpass:0 skip:0 error:0
Pass random file name as input: pfnmap -- /dev/blah TAP version 13 1..6 # Starting 6 tests from 1 test cases. # RUN pfnmap.madvise_disallowed ... # SKIP Cannot open '/dev/blah'
Now, if you really just pass a random *actual file* that exists, the test case will not actually test what we want.
Unless you have a way to verify that you actually get a PFNMAP mapping, this extension is questionable. It will make the test report possibly wrong results when wrong files are provided.
I think we can test whether we get a PFNMAP mapping by looking at the flags in smaps output ("pf" in flags), so I would expect such a test to be done in pfnmap, and the test should FAIL if the file would not create a PFNMAP.
But more importantly, we rely on "/proc/iomem" to find a RAM target in /dev/mem. That doesn't make any sense with what you are doing here.
If we are not provided /dev/mem, you should probably try mapping offset 0 of the file.
-- Cheers,
David / dhildenb
linux-kselftest-mirror@lists.linaro.org