From: Ackerley Tng <ackerleytng@google.com>
To: kvm@vger.kernel.org, linux-doc@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
linux-trace-kernel@vger.kernel.org, x86@kernel.org
Cc: aik@amd.com, andrew.jones@linux.dev, binbin.wu@linux.intel.com,
bp@alien8.de, brauner@kernel.org, chao.p.peng@intel.com,
chao.p.peng@linux.intel.com, chenhuacai@kernel.org,
corbet@lwn.net, dave.hansen@linux.intel.com, david@kernel.org,
hpa@zytor.com, ira.weiny@intel.com, jgg@nvidia.com,
jmattson@google.com, jroedel@suse.de, jthoughton@google.com,
maobibo@loongson.cn, mathieu.desnoyers@efficios.com,
maz@kernel.org, mhiramat@kernel.org, michael.roth@amd.com,
mingo@redhat.com, mlevitsk@redhat.com, oupton@kernel.org,
pankaj.gupta@amd.com, pbonzini@redhat.com, prsampat@amd.com,
qperret@google.com, ricarkol@google.com,
rick.p.edgecombe@intel.com, rientjes@google.com,
rostedt@goodmis.org, seanjc@google.com, shivankg@amd.com,
shuah@kernel.org, steven.price@arm.com, tabba@google.com,
tglx@linutronix.de, vannapurve@google.com, vbabka@suse.cz,
willy@infradead.org, wyihan@google.com, yan.y.zhao@intel.com
Subject: [RFC PATCH v2 18/37] KVM: selftests: Add helpers for calling ioctls on guest_memfd
Date: Mon, 2 Feb 2026 14:29:56 -0800 [thread overview]
Message-ID: <48396066e5d65920166b09cc9b02ec8a376ef619.1770071243.git.ackerleytng@google.com> (raw)
In-Reply-To: <cover.1770071243.git.ackerleytng@google.com>
From: Sean Christopherson <seanjc@google.com>
Add helper functions to kvm_util.h to support calling ioctls, specifically
KVM_SET_MEMORY_ATTRIBUTES2, on a guest_memfd file descriptor.
Introduce gmem_ioctl() and __gmem_ioctl() macros, modeled after the
existing vm_ioctl() helpers, to provide a standard way to call ioctls
on a guest_memfd.
Add gmem_set_memory_attributes() and its derivatives (gmem_set_private(),
gmem_set_shared()) to set memory attributes on a guest_memfd region.
Also provide "__" variants that return the ioctl error code instead of
aborting the test. These helpers will be used by upcoming guest_memfd
tests.
To avoid code duplication, factor out the check for supported memory
attributes into a new macro, TEST_ASSERT_SUPPORTED_ATTRIBUTES, and use
it in both the existing vm_set_memory_attributes() and the new
gmem_set_memory_attributes() helpers.
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
.../testing/selftests/kvm/include/kvm_util.h | 89 +++++++++++++++++--
1 file changed, 82 insertions(+), 7 deletions(-)
diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
index 872988197a5c..e767f9a99a7b 100644
--- a/tools/testing/selftests/kvm/include/kvm_util.h
+++ b/tools/testing/selftests/kvm/include/kvm_util.h
@@ -310,6 +310,16 @@ static inline bool kvm_has_cap(long cap)
TEST_ASSERT(!ret, __KVM_IOCTL_ERROR(#cmd, ret)); \
})
+#define __gmem_ioctl(gmem_fd, cmd, arg) \
+ kvm_do_ioctl(gmem_fd, cmd, arg)
+
+#define gmem_ioctl(gmem_fd, cmd, arg) \
+({ \
+ int ret = __gmem_ioctl(gmem_fd, cmd, arg); \
+ \
+ TEST_ASSERT(!ret, __KVM_IOCTL_ERROR(#cmd, ret)); \
+})
+
static __always_inline void static_assert_is_vm(struct kvm_vm *vm) { }
#define __vm_ioctl(vm, cmd, arg) \
@@ -394,6 +404,14 @@ static inline void vm_enable_cap(struct kvm_vm *vm, uint32_t cap, uint64_t arg0)
vm_ioctl(vm, KVM_ENABLE_CAP, &enable_cap);
}
+/*
+ * KVM_SET_MEMORY_ATTRIBUTES overwrites _all_ attributes. These flows need
+ * significant enhancements to support multiple attributes.
+ */
+#define TEST_ASSERT_SUPPORTED_ATTRIBUTES(attributes) \
+ TEST_ASSERT(!attributes || attributes == KVM_MEMORY_ATTRIBUTE_PRIVATE, \
+ "Update me to support multiple attributes!")
+
static inline void vm_set_memory_attributes(struct kvm_vm *vm, uint64_t gpa,
uint64_t size, uint64_t attributes)
{
@@ -404,12 +422,7 @@ static inline void vm_set_memory_attributes(struct kvm_vm *vm, uint64_t gpa,
.flags = 0,
};
- /*
- * KVM_SET_MEMORY_ATTRIBUTES2 overwrites _all_ attributes. These flows
- * need significant enhancements to support multiple attributes.
- */
- TEST_ASSERT(!attributes || attributes == KVM_MEMORY_ATTRIBUTE_PRIVATE,
- "Update me to support multiple attributes!");
+ TEST_ASSERT_SUPPORTED_ATTRIBUTES(attributes);
__TEST_REQUIRE(kvm_check_cap(KVM_CAP_MEMORY_ATTRIBUTES2) > 0,
"No valid attributes for VM fd ioctl!");
@@ -417,7 +430,6 @@ static inline void vm_set_memory_attributes(struct kvm_vm *vm, uint64_t gpa,
vm_ioctl(vm, KVM_SET_MEMORY_ATTRIBUTES2, &attr);
}
-
static inline void vm_mem_set_private(struct kvm_vm *vm, uint64_t gpa,
uint64_t size)
{
@@ -430,6 +442,69 @@ static inline void vm_mem_set_shared(struct kvm_vm *vm, uint64_t gpa,
vm_set_memory_attributes(vm, gpa, size, 0);
}
+static inline int __gmem_set_memory_attributes(int fd, loff_t offset,
+ uint64_t size,
+ uint64_t attributes,
+ loff_t *error_offset)
+{
+ struct kvm_memory_attributes2 attr = {
+ .attributes = attributes,
+ .offset = offset,
+ .size = size,
+ .flags = 0,
+ };
+ int r;
+
+ TEST_ASSERT_SUPPORTED_ATTRIBUTES(attributes);
+
+ r = __gmem_ioctl(fd, KVM_SET_MEMORY_ATTRIBUTES2, &attr);
+ if (r)
+ *error_offset = attr.error_offset;
+ return r;
+}
+
+static inline int __gmem_set_private(int fd, loff_t offset, uint64_t size,
+ loff_t *error_offset)
+{
+ return __gmem_set_memory_attributes(fd, offset, size,
+ KVM_MEMORY_ATTRIBUTE_PRIVATE,
+ error_offset);
+}
+
+static inline int __gmem_set_shared(int fd, loff_t offset, uint64_t size,
+ loff_t *error_offset)
+{
+ return __gmem_set_memory_attributes(fd, offset, size, 0, error_offset);
+}
+
+static inline void gmem_set_memory_attributes(int fd, loff_t offset,
+ uint64_t size, uint64_t attributes)
+{
+ struct kvm_memory_attributes2 attr = {
+ .attributes = attributes,
+ .offset = offset,
+ .size = size,
+ .flags = 0,
+ };
+
+ TEST_ASSERT_SUPPORTED_ATTRIBUTES(attributes);
+
+ __TEST_REQUIRE(kvm_check_cap(KVM_CAP_GUEST_MEMFD_MEMORY_ATTRIBUTES) > 0,
+ "No valid attributes for guest_memfd ioctl!");
+
+ gmem_ioctl(fd, KVM_SET_MEMORY_ATTRIBUTES2, &attr);
+}
+
+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);
+}
+
+static inline void gmem_set_shared(int fd, loff_t offset, uint64_t size)
+{
+ gmem_set_memory_attributes(fd, offset, size, 0);
+}
+
void vm_guest_mem_fallocate(struct kvm_vm *vm, uint64_t gpa, uint64_t size,
bool punch_hole);
--
2.53.0.rc1.225.gd81095ad13-goog
next prev parent reply other threads:[~2026-02-02 22:30 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-02 22:36 [RFC PATCH v2 00/37] guest_memfd: In-place conversion support Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 01/37] KVM: guest_memfd: Introduce per-gmem attributes, use to guard user mappings Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 02/37] KVM: Rename KVM_GENERIC_MEMORY_ATTRIBUTES to KVM_VM_MEMORY_ATTRIBUTES Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 03/37] KVM: Enumerate support for PRIVATE memory iff kvm_arch_has_private_mem is defined Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 04/37] KVM: Stub in ability to disable per-VM memory attribute tracking Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 05/37] KVM: guest_memfd: Wire up kvm_get_memory_attributes() to per-gmem attributes Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 06/37] KVM: guest_memfd: Update kvm_gmem_populate() to use gmem attributes Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 07/37] KVM: Introduce KVM_SET_MEMORY_ATTRIBUTES2 Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 08/37] KVM: guest_memfd: Enable INIT_SHARED on guest_memfd for x86 Coco VMs Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 09/37] KVM: guest_memfd: Add support for KVM_SET_MEMORY_ATTRIBUTES2 Ackerley Tng
2026-02-14 20:09 ` Ackerley Tng
2026-02-17 23:04 ` Sean Christopherson
2026-02-19 12:43 ` Fuad Tabba
2026-02-24 10:14 ` Ackerley Tng
2026-02-25 11:00 ` Fuad Tabba
2026-02-26 4:16 ` Ackerley Tng
2026-02-26 8:11 ` Fuad Tabba
2026-03-12 5:44 ` Ackerley Tng
2026-03-12 15:12 ` Fuad Tabba
2026-03-12 15:44 ` Sean Christopherson
2026-03-12 21:59 ` Ackerley Tng
2026-03-13 0:36 ` Sean Christopherson
2026-03-13 8:32 ` Fuad Tabba
2026-03-13 8:31 ` Fuad Tabba
2026-02-02 22:29 ` [RFC PATCH v2 10/37] KVM: guest_memfd: Handle lru_add fbatch refcounts during conversion safety check Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 11/37] KVM: Move KVM_VM_MEMORY_ATTRIBUTES config definition to x86 Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 12/37] KVM: Let userspace disable per-VM mem attributes, enable per-gmem attributes Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 13/37] KVM: selftests: Create gmem fd before "regular" fd when adding memslot Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 14/37] KVM: selftests: Rename guest_memfd{,_offset} to gmem_{fd,offset} Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 15/37] KVM: selftests: Add support for mmap() on guest_memfd in core library Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 16/37] KVM: selftests: Add selftests global for guest memory attributes capability Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 17/37] KVM: selftests: Update framework to use KVM_SET_MEMORY_ATTRIBUTES2 Ackerley Tng
2026-02-02 22:29 ` Ackerley Tng [this message]
2026-02-02 22:29 ` [RFC PATCH v2 19/37] KVM: selftests: Test using guest_memfd for guest private memory Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 20/37] KVM: selftests: Test basic single-page conversion flow Ackerley Tng
2026-02-02 22:29 ` [RFC PATCH v2 21/37] KVM: selftests: Test conversion flow when INIT_SHARED Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 22/37] KVM: selftests: Test indexing in guest_memfd Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 23/37] KVM: selftests: Test conversion before allocation Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 24/37] KVM: selftests: Convert with allocated folios in different layouts Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 25/37] KVM: selftests: Test precision of conversion Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 26/37] KVM: selftests: Test that truncation does not change shared/private status Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 27/37] KVM: selftests: Test that shared/private status is consistent across processes Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 28/37] KVM: selftests: Test conversion with elevated page refcount Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 29/37] KVM: selftests: Reset shared memory after hole-punching Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 30/37] KVM: selftests: Provide function to look up guest_memfd details from gpa Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 31/37] KVM: selftests: Provide common function to set memory attributes Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 32/37] KVM: selftests: Check fd/flags provided to mmap() when setting up memslot Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 33/37] KVM: selftests: Make TEST_EXPECT_SIGBUS thread-safe Ackerley Tng
2026-02-14 19:49 ` Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 34/37] KVM: selftests: Update private_mem_conversions_test to mmap() guest_memfd Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 35/37] KVM: selftests: Add script to exercise private_mem_conversions_test Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 36/37] KVM: selftests: Update pre-fault test to work with per-guest_memfd attributes Ackerley Tng
2026-02-02 22:30 ` [RFC PATCH v2 37/37] KVM: selftests: Update private memory exits test work with per-gmem attributes Ackerley Tng
2026-02-20 9:09 ` [RFC PATCH v2 00/37] guest_memfd: In-place conversion support Lisa Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=48396066e5d65920166b09cc9b02ec8a376ef619.1770071243.git.ackerleytng@google.com \
--to=ackerleytng@google.com \
--cc=aik@amd.com \
--cc=andrew.jones@linux.dev \
--cc=binbin.wu@linux.intel.com \
--cc=bp@alien8.de \
--cc=brauner@kernel.org \
--cc=chao.p.peng@intel.com \
--cc=chao.p.peng@linux.intel.com \
--cc=chenhuacai@kernel.org \
--cc=corbet@lwn.net \
--cc=dave.hansen@linux.intel.com \
--cc=david@kernel.org \
--cc=hpa@zytor.com \
--cc=ira.weiny@intel.com \
--cc=jgg@nvidia.com \
--cc=jmattson@google.com \
--cc=jroedel@suse.de \
--cc=jthoughton@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=maobibo@loongson.cn \
--cc=mathieu.desnoyers@efficios.com \
--cc=maz@kernel.org \
--cc=mhiramat@kernel.org \
--cc=michael.roth@amd.com \
--cc=mingo@redhat.com \
--cc=mlevitsk@redhat.com \
--cc=oupton@kernel.org \
--cc=pankaj.gupta@amd.com \
--cc=pbonzini@redhat.com \
--cc=prsampat@amd.com \
--cc=qperret@google.com \
--cc=ricarkol@google.com \
--cc=rick.p.edgecombe@intel.com \
--cc=rientjes@google.com \
--cc=rostedt@goodmis.org \
--cc=seanjc@google.com \
--cc=shivankg@amd.com \
--cc=shuah@kernel.org \
--cc=steven.price@arm.com \
--cc=tabba@google.com \
--cc=tglx@linutronix.de \
--cc=vannapurve@google.com \
--cc=vbabka@suse.cz \
--cc=willy@infradead.org \
--cc=wyihan@google.com \
--cc=x86@kernel.org \
--cc=yan.y.zhao@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox