Re: [PATCH v8 21/46] KVM: guest_memfd: Zero page while getting pfn
From: Fuad Tabba <hidden>
Date: 2026-06-19 10:52:08
Also in:
kvm, linux-coco, linux-doc, linux-kselftest, linux-mm, lkml
On Fri, 19 Jun 2026 at 01:31, Ackerley Tng via B4 Relay [off-list ref] wrote:
From: Ackerley Tng <redacted> Move the folio initialization logic from kvm_gmem_get_pfn() into __kvm_gmem_get_pfn() to also zero pages if the page is to be used in kvm_gmem_populate(). With in-place conversion, the existing data in a guest_memfd page can be populated into guest memory through platform-specific ioctls. Without first zeroing the page obtained using __kvm_gmem_get_pfn(), it might contain uninitialized host memory, which would leak to the guest if the populate completes. guest_memfd pages are zeroed at most once in the page's entire lifetime with guest_memfd, and that is tracked using the uptodate flag. Zeroing the page in __kvm_gmem_get_pfn() is chosen over zeroing in kvm_gmem_get_folio() since other flows, such as a future write() syscall, can get a page, write to the page and then set page uptodate without zeroing. This aligns with the concept of zeroing before first use - the other place where zeroing happens is in kvm_gmem_fault_user_mapping(). Signed-off-by: Ackerley Tng <redacted>
Reviewed-by: Fuad Tabba <redacted> Cheers, /fuad
quoted hunk ↗ jump to hunk
--- virt/kvm/guest_memfd.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 90bc1a26512b6..86c9f5b0863cb 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c@@ -1137,6 +1137,11 @@ static struct folio *__kvm_gmem_get_pfn(struct file *file, return ERR_PTR(-EHWPOISON); } + if (!folio_test_uptodate(folio)) { + clear_highpage(folio_page(folio, 0)); + folio_mark_uptodate(folio); + } + *pfn = folio_file_pfn(folio, index); if (max_order) *max_order = 0;@@ -1166,11 +1171,6 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, goto out; } - if (!folio_test_uptodate(folio)) { - clear_highpage(folio_page(folio, 0)); - folio_mark_uptodate(folio); - } - if (kvm_gmem_is_private_mem(inode, index)) r = kvm_gmem_prepare_folio(kvm, slot, gfn, folio); --2.55.0.rc0.738.g0c8ab3ebcc-goog