Use a global variable to track the host page size in the guest_memfd test
so that the information doesn't need to be constantly passed around. The
state is purely a reflection of the underlying system, i.e. can't be set
by the test and is constant for a given invocation of the test, and thus
explicitly passing the host page size to individual testcases adds no
value, e.g. doesn't allow testing different combinations.
Making page_size a global will simplify an upcoming change to create a new
guest_memfd instance per testcase.
No functional change intended.
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
.../testing/selftests/kvm/guest_memfd_test.c | 37 +++++++++----------
1 file changed, 18 insertions(+), 19 deletions(-)
diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing/selftests/kvm/guest_memfd_test.c
index 81b11a958c7a..8251d019206a 100644
--- a/tools/testing/selftests/kvm/guest_memfd_test.c
+++ b/tools/testing/selftests/kvm/guest_memfd_test.c
@@ -24,6 +24,8 @@
#include "test_util.h"
#include "ucall_common.h"
+static size_t page_size;
+
static void test_file_read_write(int fd)
{
char buf[64];
@@ -38,7 +40,7 @@ static void test_file_read_write(int fd)
"pwrite on a guest_mem fd should fail");
}
-static void test_mmap_supported(int fd, size_t page_size, size_t total_size)
+static void test_mmap_supported(int fd, size_t total_size)
{
const char val = 0xaa;
char *mem;
@@ -78,7 +80,7 @@ void fault_sigbus_handler(int signum)
siglongjmp(jmpbuf, 1);
}
-static void test_fault_overflow(int fd, size_t page_size, size_t total_size)
+static void test_fault_overflow(int fd, size_t total_size)
{
struct sigaction sa_old, sa_new = {
.sa_handler = fault_sigbus_handler,
@@ -106,7 +108,7 @@ static void test_fault_overflow(int fd, size_t page_size, size_t total_size)
TEST_ASSERT(!ret, "munmap() should succeed.");
}
-static void test_mmap_not_supported(int fd, size_t page_size, size_t total_size)
+static void test_mmap_not_supported(int fd, size_t total_size)
{
char *mem;
@@ -117,7 +119,7 @@ static void test_mmap_not_supported(int fd, size_t page_size, size_t total_size)
TEST_ASSERT_EQ(mem, MAP_FAILED);
}
-static void test_file_size(int fd, size_t page_size, size_t total_size)
+static void test_file_size(int fd, size_t total_size)
{
struct stat sb;
int ret;
@@ -128,7 +130,7 @@ static void test_file_size(int fd, size_t page_size, size_t total_size)
TEST_ASSERT_EQ(sb.st_blksize, page_size);
}
-static void test_fallocate(int fd, size_t page_size, size_t total_size)
+static void test_fallocate(int fd, size_t total_size)
{
int ret;
@@ -165,7 +167,7 @@ static void test_fallocate(int fd, size_t page_size, size_t total_size)
TEST_ASSERT(!ret, "fallocate to restore punched hole should succeed");
}
-static void test_invalid_punch_hole(int fd, size_t page_size, size_t total_size)
+static void test_invalid_punch_hole(int fd, size_t total_size)
{
struct {
off_t offset;
@@ -196,8 +198,7 @@ static void test_invalid_punch_hole(int fd, size_t page_size, size_t total_size)
}
static void test_create_guest_memfd_invalid_sizes(struct kvm_vm *vm,
- uint64_t guest_memfd_flags,
- size_t page_size)
+ uint64_t guest_memfd_flags)
{
size_t size;
int fd;
@@ -214,7 +215,6 @@ static void test_create_guest_memfd_multiple(struct kvm_vm *vm)
{
int fd1, fd2, ret;
struct stat st1, st2;
- size_t page_size = getpagesize();
fd1 = __vm_create_guest_memfd(vm, page_size, 0);
TEST_ASSERT(fd1 != -1, "memfd creation should succeed");
@@ -241,7 +241,6 @@ static void test_create_guest_memfd_multiple(struct kvm_vm *vm)
static void test_guest_memfd_flags(struct kvm_vm *vm, uint64_t valid_flags)
{
- size_t page_size = getpagesize();
uint64_t flag;
int fd;
@@ -265,10 +264,8 @@ static void test_guest_memfd(unsigned long vm_type)
uint64_t flags = 0;
struct kvm_vm *vm;
size_t total_size;
- size_t page_size;
int fd;
- page_size = getpagesize();
total_size = page_size * 4;
vm = vm_create_barebones_type(vm_type);
@@ -277,22 +274,22 @@ static void test_guest_memfd(unsigned long vm_type)
flags |= GUEST_MEMFD_FLAG_MMAP | GUEST_MEMFD_FLAG_DEFAULT_SHARED;
test_create_guest_memfd_multiple(vm);
- test_create_guest_memfd_invalid_sizes(vm, flags, page_size);
+ test_create_guest_memfd_invalid_sizes(vm, flags);
fd = vm_create_guest_memfd(vm, total_size, flags);
test_file_read_write(fd);
if (flags & GUEST_MEMFD_FLAG_MMAP) {
- test_mmap_supported(fd, page_size, total_size);
- test_fault_overflow(fd, page_size, total_size);
+ test_mmap_supported(fd, total_size);
+ test_fault_overflow(fd, total_size);
} else {
- test_mmap_not_supported(fd, page_size, total_size);
+ test_mmap_not_supported(fd, total_size);
}
- test_file_size(fd, page_size, total_size);
- test_fallocate(fd, page_size, total_size);
- test_invalid_punch_hole(fd, page_size, total_size);
+ test_file_size(fd, total_size);
+ test_fallocate(fd, total_size);
+ test_invalid_punch_hole(fd, total_size);
test_guest_memfd_flags(vm, flags);
@@ -367,6 +364,8 @@ int main(int argc, char *argv[])
TEST_REQUIRE(kvm_has_cap(KVM_CAP_GUEST_MEMFD));
+ page_size = getpagesize();
+
/*
* Not all architectures support KVM_CAP_VM_TYPES. However, those that
* support guest_memfd have that support for the default VM type.
--
2.51.0.536.g15c5d4f767-goog
Sean Christopherson <seanjc@google.com> writes: > Use a global variable to track the host page size in the guest_memfd test > so that the information doesn't need to be constantly passed around. The > state is purely a reflection of the underlying system, i.e. can't be set > by the test and is constant for a given invocation of the test, and thus > explicitly passing the host page size to individual testcases adds no > value, e.g. doesn't allow testing different combinations. > I was going to pass in page_size to each of these test cases to test HugeTLB support, that's how page_size crept into the parameters of these functions. Could we do a getpagesize() within the gmem_test() macro that you introduced instead? Reviewed-by: Ackerley Tng <ackerleytng@google.com> > Making page_size a global will simplify an upcoming change to create a new > guest_memfd instance per testcase. > > No functional change intended. > > Signed-off-by: Sean Christopherson <seanjc@google.com> > --- > .../testing/selftests/kvm/guest_memfd_test.c | 37 +++++++++---------- > 1 file changed, 18 insertions(+), 19 deletions(-) > > diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing/selftests/kvm/guest_memfd_test.c > index 81b11a958c7a..8251d019206a 100644 > --- a/tools/testing/selftests/kvm/guest_memfd_test.c > +++ b/tools/testing/selftests/kvm/guest_memfd_test.c > @@ -24,6 +24,8 @@ > #include "test_util.h" > #include "ucall_common.h" > > +static size_t page_size; > + > static void test_file_read_write(int fd) > { > char buf[64]; > @@ -38,7 +40,7 @@ static void test_file_read_write(int fd) > "pwrite on a guest_mem fd should fail"); > } > > -static void test_mmap_supported(int fd, size_t page_size, size_t total_size) > +static void test_mmap_supported(int fd, size_t total_size) > { > const char val = 0xaa; > char *mem; > @@ -78,7 +80,7 @@ void fault_sigbus_handler(int signum) > siglongjmp(jmpbuf, 1); > } > > > [...snip...] >
On Mon, Sep 29, 2025, Ackerley Tng wrote: > Sean Christopherson <seanjc@google.com> writes: > > > Use a global variable to track the host page size in the guest_memfd test > > so that the information doesn't need to be constantly passed around. The > > state is purely a reflection of the underlying system, i.e. can't be set > > by the test and is constant for a given invocation of the test, and thus > > explicitly passing the host page size to individual testcases adds no > > value, e.g. doesn't allow testing different combinations. > > > > I was going to pass in page_size to each of these test cases to test > HugeTLB support, that's how page_size crept into the parameters of these > functions. > > Could we do a getpagesize() within the gmem_test() macro that you > introduced instead? We could, and I actually had it that way to start. But I found that burying the effective setting of page_size made it harder to see that it's a runtime constant, versus something that can be configured by the test.
Sean Christopherson <seanjc@google.com> writes: > On Mon, Sep 29, 2025, Ackerley Tng wrote: >> Sean Christopherson <seanjc@google.com> writes: >> >> > Use a global variable to track the host page size in the guest_memfd test >> > so that the information doesn't need to be constantly passed around. The >> > state is purely a reflection of the underlying system, i.e. can't be set >> > by the test and is constant for a given invocation of the test, and thus >> > explicitly passing the host page size to individual testcases adds no >> > value, e.g. doesn't allow testing different combinations. >> > >> >> I was going to pass in page_size to each of these test cases to test >> HugeTLB support, that's how page_size crept into the parameters of these >> functions. >> >> Could we do a getpagesize() within the gmem_test() macro that you >> introduced instead? > > We could, and I actually had it that way to start. But I found that burying the > effective setting of page_size made it harder to see that it's a runtime constant, > versus something that can be configured by the test. I guess I could also just update the global static variable page_size for HugeTLB tests since we won't be running tests with different page sizes in parallel. Maybe that's better, actually.
On 26.09.25 18:31, Sean Christopherson wrote: > Use a global variable to track the host page size in the guest_memfd test > so that the information doesn't need to be constantly passed around. The > state is purely a reflection of the underlying system, i.e. can't be set > by the test and is constant for a given invocation of the test, and thus > explicitly passing the host page size to individual testcases adds no > value, e.g. doesn't allow testing different combinations. > > Making page_size a global will simplify an upcoming change to create a new > guest_memfd instance per testcase. > > No functional change intended. > Reviewed-by: David Hildenbrand <david@redhat.com> -- Cheers David / dhildenb
On Fri, 26 Sept 2025 at 17:31, Sean Christopherson <seanjc@google.com> wrote: > > Use a global variable to track the host page size in the guest_memfd test > so that the information doesn't need to be constantly passed around. The > state is purely a reflection of the underlying system, i.e. can't be set > by the test and is constant for a given invocation of the test, and thus > explicitly passing the host page size to individual testcases adds no > value, e.g. doesn't allow testing different combinations. > > Making page_size a global will simplify an upcoming change to create a new > guest_memfd instance per testcase. > > No functional change intended. > > Signed-off-by: Sean Christopherson <seanjc@google.com> Reviewed-by: Fuad Tabba <tabba@google.com> Tested-by: Fuad Tabba <tabba@google.com> Cheers, /fuad > --- > .../testing/selftests/kvm/guest_memfd_test.c | 37 +++++++++---------- > 1 file changed, 18 insertions(+), 19 deletions(-) > > diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing/selftests/kvm/guest_memfd_test.c > index 81b11a958c7a..8251d019206a 100644 > --- a/tools/testing/selftests/kvm/guest_memfd_test.c > +++ b/tools/testing/selftests/kvm/guest_memfd_test.c > @@ -24,6 +24,8 @@ > #include "test_util.h" > #include "ucall_common.h" > > +static size_t page_size; > + > static void test_file_read_write(int fd) > { > char buf[64]; > @@ -38,7 +40,7 @@ static void test_file_read_write(int fd) > "pwrite on a guest_mem fd should fail"); > } > > -static void test_mmap_supported(int fd, size_t page_size, size_t total_size) > +static void test_mmap_supported(int fd, size_t total_size) > { > const char val = 0xaa; > char *mem; > @@ -78,7 +80,7 @@ void fault_sigbus_handler(int signum) > siglongjmp(jmpbuf, 1); > } > > -static void test_fault_overflow(int fd, size_t page_size, size_t total_size) > +static void test_fault_overflow(int fd, size_t total_size) > { > struct sigaction sa_old, sa_new = { > .sa_handler = fault_sigbus_handler, > @@ -106,7 +108,7 @@ static void test_fault_overflow(int fd, size_t page_size, size_t total_size) > TEST_ASSERT(!ret, "munmap() should succeed."); > } > > -static void test_mmap_not_supported(int fd, size_t page_size, size_t total_size) > +static void test_mmap_not_supported(int fd, size_t total_size) > { > char *mem; > > @@ -117,7 +119,7 @@ static void test_mmap_not_supported(int fd, size_t page_size, size_t total_size) > TEST_ASSERT_EQ(mem, MAP_FAILED); > } > > -static void test_file_size(int fd, size_t page_size, size_t total_size) > +static void test_file_size(int fd, size_t total_size) > { > struct stat sb; > int ret; > @@ -128,7 +130,7 @@ static void test_file_size(int fd, size_t page_size, size_t total_size) > TEST_ASSERT_EQ(sb.st_blksize, page_size); > } > > -static void test_fallocate(int fd, size_t page_size, size_t total_size) > +static void test_fallocate(int fd, size_t total_size) > { > int ret; > > @@ -165,7 +167,7 @@ static void test_fallocate(int fd, size_t page_size, size_t total_size) > TEST_ASSERT(!ret, "fallocate to restore punched hole should succeed"); > } > > -static void test_invalid_punch_hole(int fd, size_t page_size, size_t total_size) > +static void test_invalid_punch_hole(int fd, size_t total_size) > { > struct { > off_t offset; > @@ -196,8 +198,7 @@ static void test_invalid_punch_hole(int fd, size_t page_size, size_t total_size) > } > > static void test_create_guest_memfd_invalid_sizes(struct kvm_vm *vm, > - uint64_t guest_memfd_flags, > - size_t page_size) > + uint64_t guest_memfd_flags) > { > size_t size; > int fd; > @@ -214,7 +215,6 @@ static void test_create_guest_memfd_multiple(struct kvm_vm *vm) > { > int fd1, fd2, ret; > struct stat st1, st2; > - size_t page_size = getpagesize(); > > fd1 = __vm_create_guest_memfd(vm, page_size, 0); > TEST_ASSERT(fd1 != -1, "memfd creation should succeed"); > @@ -241,7 +241,6 @@ static void test_create_guest_memfd_multiple(struct kvm_vm *vm) > > static void test_guest_memfd_flags(struct kvm_vm *vm, uint64_t valid_flags) > { > - size_t page_size = getpagesize(); > uint64_t flag; > int fd; > > @@ -265,10 +264,8 @@ static void test_guest_memfd(unsigned long vm_type) > uint64_t flags = 0; > struct kvm_vm *vm; > size_t total_size; > - size_t page_size; > int fd; > > - page_size = getpagesize(); > total_size = page_size * 4; > > vm = vm_create_barebones_type(vm_type); > @@ -277,22 +274,22 @@ static void test_guest_memfd(unsigned long vm_type) > flags |= GUEST_MEMFD_FLAG_MMAP | GUEST_MEMFD_FLAG_DEFAULT_SHARED; > > test_create_guest_memfd_multiple(vm); > - test_create_guest_memfd_invalid_sizes(vm, flags, page_size); > + test_create_guest_memfd_invalid_sizes(vm, flags); > > fd = vm_create_guest_memfd(vm, total_size, flags); > > test_file_read_write(fd); > > if (flags & GUEST_MEMFD_FLAG_MMAP) { > - test_mmap_supported(fd, page_size, total_size); > - test_fault_overflow(fd, page_size, total_size); > + test_mmap_supported(fd, total_size); > + test_fault_overflow(fd, total_size); > } else { > - test_mmap_not_supported(fd, page_size, total_size); > + test_mmap_not_supported(fd, total_size); > } > > - test_file_size(fd, page_size, total_size); > - test_fallocate(fd, page_size, total_size); > - test_invalid_punch_hole(fd, page_size, total_size); > + test_file_size(fd, total_size); > + test_fallocate(fd, total_size); > + test_invalid_punch_hole(fd, total_size); > > test_guest_memfd_flags(vm, flags); > > @@ -367,6 +364,8 @@ int main(int argc, char *argv[]) > > TEST_REQUIRE(kvm_has_cap(KVM_CAP_GUEST_MEMFD)); > > + page_size = getpagesize(); > + > /* > * Not all architectures support KVM_CAP_VM_TYPES. However, those that > * support guest_memfd have that support for the default VM type. > -- > 2.51.0.536.g15c5d4f767-goog >
© 2016 - 2025 Red Hat, Inc.