[PATCH RFC v3 42/43] KVM: selftests: Allow flags to be specified in set_memory_attributes functions

From: Ackerley Tng

Date: Fri Mar 13 2026 - 02:28:26 EST


Update the set_memory_attributes-related selftest library functions to
support specification of flags.

Signed-off-by: Ackerley Tng <ackerleytng@xxxxxxxxxx>
---
tools/testing/selftests/kvm/include/kvm_util.h | 36 ++++++++++++++++----------
1 file changed, 22 insertions(+), 14 deletions(-)

diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
index e4de0050d1ab3..a89a4f85aefdb 100644
--- a/tools/testing/selftests/kvm/include/kvm_util.h
+++ b/tools/testing/selftests/kvm/include/kvm_util.h
@@ -459,13 +459,14 @@ static inline void vm_set_memory_attributes(struct kvm_vm *vm, uint64_t gpa,
static inline int __gmem_set_memory_attributes(int fd, loff_t offset,
uint64_t size,
uint64_t attributes,
- loff_t *error_offset)
+ loff_t *error_offset,
+ u64 flags)
{
struct kvm_memory_attributes2 attr = {
.attributes = attributes,
.offset = offset,
.size = size,
- .flags = 0,
+ .flags = flags,
};
int r;

@@ -478,27 +479,30 @@ static inline int __gmem_set_memory_attributes(int fd, loff_t offset,
}

static inline int __gmem_set_private(int fd, loff_t offset, uint64_t size,
- loff_t *error_offset)
+ loff_t *error_offset, u64 flags)
{
return __gmem_set_memory_attributes(fd, offset, size,
KVM_MEMORY_ATTRIBUTE_PRIVATE,
- error_offset);
+ error_offset, flags);
}

static inline int __gmem_set_shared(int fd, loff_t offset, uint64_t size,
- loff_t *error_offset)
+ loff_t *error_offset, u64 flags)
{
- return __gmem_set_memory_attributes(fd, offset, size, 0, error_offset);
+ return __gmem_set_memory_attributes(fd, offset, size, 0,
+ error_offset, flags);
}

static inline void gmem_set_memory_attributes(int fd, loff_t offset,
- uint64_t size, uint64_t attributes)
+ uint64_t size,
+ uint64_t attributes,
+ u64 flags)
{
struct kvm_memory_attributes2 attr = {
.attributes = attributes,
.offset = offset,
.size = size,
- .flags = 0,
+ .flags = flags,
};

TEST_ASSERT_SUPPORTED_ATTRIBUTES(attributes);
@@ -511,16 +515,19 @@ static inline void gmem_set_memory_attributes(int fd, loff_t offset,

static inline void gmem_set_private(int fd, loff_t offset, uint64_t size)
{
- gmem_set_memory_attributes(fd, offset, size, KVM_MEMORY_ATTRIBUTE_PRIVATE);
+ gmem_set_memory_attributes(fd, offset, size, KVM_MEMORY_ATTRIBUTE_PRIVATE,
+ KVM_SET_MEMORY_ATTRIBUTES2_ZERO);
}

static inline void gmem_set_shared(int fd, loff_t offset, uint64_t size)
{
- gmem_set_memory_attributes(fd, offset, size, 0);
+ gmem_set_memory_attributes(fd, offset, size, 0,
+ KVM_SET_MEMORY_ATTRIBUTES2_ZERO);
}

static inline void vm_mem_set_memory_attributes(struct kvm_vm *vm, uint64_t gpa,
- uint64_t size, uint64_t attrs)
+ uint64_t size, uint64_t attrs,
+ u64 flags)
{
if (kvm_has_gmem_attributes) {
uint64_t end = gpa + size;
@@ -532,9 +539,10 @@ static inline void vm_mem_set_memory_attributes(struct kvm_vm *vm, uint64_t gpa,
fd = kvm_gpa_to_guest_memfd(vm, addr, &fd_offset, &len);
len = min(end - addr, len);

- gmem_set_memory_attributes(fd, fd_offset, len, attrs);
+ gmem_set_memory_attributes(fd, fd_offset, len, attrs, flags);
}
} else {
+ TEST_ASSERT(!flags, "Flags are not supported.");
vm_set_memory_attributes(vm, gpa, size, attrs);
}
}
@@ -542,13 +550,13 @@ static inline void vm_mem_set_memory_attributes(struct kvm_vm *vm, uint64_t gpa,
static inline void vm_mem_set_private(struct kvm_vm *vm, uint64_t gpa,
uint64_t size)
{
- vm_mem_set_memory_attributes(vm, gpa, size, KVM_MEMORY_ATTRIBUTE_PRIVATE);
+ vm_mem_set_memory_attributes(vm, gpa, size, KVM_MEMORY_ATTRIBUTE_PRIVATE, 0);
}

static inline void vm_mem_set_shared(struct kvm_vm *vm, uint64_t gpa,
uint64_t size)
{
- vm_mem_set_memory_attributes(vm, gpa, size, 0);
+ vm_mem_set_memory_attributes(vm, gpa, size, 0, 0);
}

void vm_guest_mem_fallocate(struct kvm_vm *vm, uint64_t gpa, uint64_t size,

--
2.53.0.851.ga537e3e6e9-goog