From nobody Fri Jul 24 21:52:35 2026 Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 017FC37E5EC for ; Thu, 23 Jul 2026 21:08:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840900; cv=none; b=T4631SBL+LWcmaojGjieKYMefoLHa6ikPf7ZYRv3/5cd6lAYR7+8HTkQrl6adwYHjHLWPwb/Gotx72mSsZCeeJNNs2nTNQxp4FZBC8Agkvsz022fyKdq9BiGqwNyiN7lUvpMBP7USkkKJ87myANdr+Mxqa7pWyvO+vnFNMi19m4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840900; c=relaxed/simple; bh=G//MEJCqsmjh7Rp6WQ8wb0efVl8+cMi6HZp1dDFLbwU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=dvHAmxVYbxgEXzvOIJ+6LhtPL7NVeEOsyJdFahV2u6LJyzN7Lu4CQGN0o2HjUdtKSILeUg75dcjOZQ2QLmvFsn+npwrYYyOgOxGOKT+Fu6oO1VNWFmTj4S5C2lyvev83vnC7afii+rYWkh4s8TwRpKcdBqNWtO8RKNHW21Cm1Zo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=gISc05We; arc=none smtp.client-ip=209.85.216.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="gISc05We" Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-38e11baa66eso1144511a91.2 for ; Thu, 23 Jul 2026 14:08:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784840894; x=1785445694; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=VZYYFhSomkX55F7ie02z2KuczZjPonoKIc0palUsjIM=; b=gISc05Wez1avIFAdtTwy7Ed5zX6XUNU4qTNwK1Ft2Ee9Bad8LV5anKsVwhOWTIIQE+ jbC2iT5ramM5QGcMeWks6PKi2jAC4kSNX14cKPWq9ByetKXTY9D6xMa6XN32v1UuBhg2 7erd7mI07bKNlrTfYC9gEhhDTXDLVAQmGm38D9Nm2yXwQAa6RbmcmUHPX719ZYbUvngT QdWqRqiEAsnnBFC6OVgfrSC8EH2KsHoKIdjDqaomF+dwX4n9Yp0xMwpX6SUmf2WqwUUs kMdSUQZ4hsNy9acRwNS6H3h615Ekx1V0As5c3bgNGCDH5Gjkx19vAdpvXksJ9LeXcveP DZxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784840894; x=1785445694; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=VZYYFhSomkX55F7ie02z2KuczZjPonoKIc0palUsjIM=; b=CDbnR+0NOJ8TJ8nh/oDRaZdJBskpbLLHfWnlIvEYkCOfcQf0L/f7w43MhjPMk54kbD x7q8UI7xFa+MpmPpRwUzJ2XVrQF+Mt1mvR9AxswHle4KC532sNetC+BEU4AUg4oPsbtV Hrtt52gJ7/RLwsmdXuem5fvGYmlEsjDz/Z7FTcXnReT0yLC00eYs9bHmD8yAfmkQ9MXI ow2yEYzUxx0GaogbwJm6095h1TDjAvAv9TZpWNHY/PDPyyVgARtjF+JKUshdsVUkItXo HJhG3vg/3WMpTRdkSwguQSw/4nlMPkUgL4Qyqv5rd4gBAqzX2c80wQipsBKp5Gi3qzWN p0Qw== X-Forwarded-Encrypted: i=1; AHgh+RrcP7uVWOuCVEOM2A5Vi4k2aq1oQlnRLiy9U+X2pGRZ8NpzMvBFiov3s788xYRPshU355sNESDObh0fCe4=@vger.kernel.org X-Gm-Message-State: AOJu0Yw/4LxOQOMI6KyUJrIWsGua9CUXxlsdZxKmANq6uHOv2ah3p+V2 C+Nh7bFCGpPrftpdUUQMeTTD5FJ+Lw7DhFm2WwEkOdeTfpWLuIIfqLN7a2msIKOXEKnoIoQNTaS Yqe5Z2A== X-Received: from pjbgq9.prod.google.com ([2002:a17:90b:1049:b0:38f:6c:9fd9]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:e7c4:b0:381:25ce:bcc2 with SMTP id 98e67ed59e1d1-38ec6401dd8mr4703624a91.6.1784840893393; Thu, 23 Jul 2026 14:08:13 -0700 (PDT) Reply-To: Sean Christopherson Date: Thu, 23 Jul 2026 14:08:03 -0700 In-Reply-To: <20260723210811.72720-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260723210811.72720-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Message-ID: <20260723210811.72720-2-seanjc@google.com> Subject: [PATCH v6 1/9] KVM: guest_memfd: Pass the number of pages instead of the end pfn into .invalidate() From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng , Xiaoyao Li , Michael Roth , Fuad Tabba Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Pass the number of pages to "invalidate", i.e. reclaim, instead of the end pfn, as a first step towards aligning the function prototypes between the de facto "to private" and "to shared" arch hooks. Eventually, the goal is to end up with kvm_gmem_arch_make_{private,shared}(), and in both cases, providing the number of pages makes the call sites slightly nicer, and also avoids any confusion over whether the end pfn is inclusive or exclusive. Opportunistically rename "start" to "pfn", again to align with the expected signature of make_private() (which needs to pass a starting gfn as well, at which point the "start" becomes noise). No functional change intended. Cc: Fuad Tabba Cc: Ackerley Tng Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 2 +- arch/x86/kvm/svm/sev.c | 8 ++++---- arch/x86/kvm/svm/svm.h | 2 +- arch/x86/kvm/x86.c | 4 ++-- include/linux/kvm_host.h | 2 +- virt/kvm/guest_memfd.c | 6 +----- 6 files changed, 10 insertions(+), 14 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index 58f156ae31e7..8c96999f49a0 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1727,7 +1727,7 @@ struct kvm_x86_ops { #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE int (*gmem_prepare)(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int max_or= der); #endif - void (*gmem_invalidate)(kvm_pfn_t start, kvm_pfn_t end); + void (*gmem_invalidate)(kvm_pfn_t pfn, kvm_pfn_t nr_pages); #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE void (*gmem_invalidate_range)(struct kvm *kvm, struct kvm_gfn_range *rang= e); #endif diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c index 82b983484af2..e6987351dc04 100644 --- a/arch/x86/kvm/svm/sev.c +++ b/arch/x86/kvm/svm/sev.c @@ -5161,16 +5161,16 @@ int sev_gmem_prepare(struct kvm *kvm, kvm_pfn_t pfn= , gfn_t gfn, int max_order) return 0; } =20 -void sev_gmem_invalidate(kvm_pfn_t start, kvm_pfn_t end) +void sev_gmem_invalidate(kvm_pfn_t pfn, kvm_pfn_t nr_pages) { - kvm_pfn_t pfn; + kvm_pfn_t end =3D pfn + nr_pages; =20 if (!cc_platform_has(CC_ATTR_HOST_SEV_SNP)) return; =20 - pr_debug("%s: PFN start 0x%llx PFN end 0x%llx\n", __func__, start, end); + pr_debug("%s: PFN start 0x%llx PFN end 0x%llx\n", __func__, pfn, end); =20 - for (pfn =3D start; pfn < end;) { + while (pfn < end) { bool use_2m_update =3D false; int rc, rmp_level; bool assigned; diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h index af25e4b56212..cf8fb3d6a100 100644 --- a/arch/x86/kvm/svm/svm.h +++ b/arch/x86/kvm/svm/svm.h @@ -1010,7 +1010,7 @@ int sev_dev_get_attr(u32 group, u64 attr, u64 *val); extern unsigned int max_sev_asid; void sev_handle_rmp_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u64 error_code= ); int sev_gmem_prepare(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int max_or= der); -void sev_gmem_invalidate(kvm_pfn_t start, kvm_pfn_t end); +void sev_gmem_invalidate(kvm_pfn_t pfn, kvm_pfn_t nr_pages); void sev_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range *rang= e); int sev_gmem_max_mapping_level(struct kvm *kvm, kvm_pfn_t pfn, bool is_pri= vate); struct vmcb_save_area *sev_decrypt_vmsa(struct kvm_vcpu *vcpu); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 1f5dc685f049..65bcad3d0264 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10627,9 +10627,9 @@ int kvm_arch_gmem_prepare(struct kvm *kvm, gfn_t gf= n, kvm_pfn_t pfn, int max_ord #endif =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE -void kvm_arch_gmem_invalidate(kvm_pfn_t start, kvm_pfn_t end) +void kvm_arch_gmem_invalidate(kvm_pfn_t pfn, kvm_pfn_t nr_pages) { - kvm_x86_call(gmem_invalidate)(start, end); + kvm_x86_call(gmem_invalidate)(pfn, nr_pages); } void kvm_arch_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range = *range) { diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 9db6eb4023c4..911c3f08b3a2 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2614,7 +2614,7 @@ long kvm_gmem_populate(struct kvm *kvm, gfn_t start_g= fn, void __user *src, #endif =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE -void kvm_arch_gmem_invalidate(kvm_pfn_t start, kvm_pfn_t end); +void kvm_arch_gmem_invalidate(kvm_pfn_t pfn, kvm_pfn_t nr_pages); void kvm_arch_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range = *range); #endif =20 diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 171a9da1b685..ca1d93fb2495 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -530,11 +530,7 @@ static int kvm_gmem_error_folio(struct address_space *= mapping, struct folio *fol #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE static void kvm_gmem_free_folio(struct folio *folio) { - struct page *page =3D folio_page(folio, 0); - kvm_pfn_t pfn =3D page_to_pfn(page); - int order =3D folio_order(folio); - - kvm_arch_gmem_invalidate(pfn, pfn + (1ul << order)); + kvm_arch_gmem_invalidate(folio_file_pfn(folio, 0), folio_nr_pages(folio)); } #endif =20 --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:52:35 2026 Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 50AB9357D07 for ; Thu, 23 Jul 2026 21:08:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840906; cv=none; b=V2HsMTUZcgl3ovaexF+YyPWr81p5aT3ivVAHdnsfeHq5Ylz7dJA36X9z/vmIunZqVJ4uxYoDcvsmT5j6TR4xAIBcVj7KZA49P8r6JPQ7TfKNo+9cTuHgp3c8KT/Pqe6WBattIemKr/BoVj1AORgG4cGOJG1thwiwMZQaxHFDubM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840906; c=relaxed/simple; bh=s0uXDfBYgcPHz3WkbvMeH1zAXHcw3c7XDJE5MVVquDk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ldit1k3g73PN6WU+cG9126qWODstUrFGwSH+psT098O036MJYODt6Jhsmp43VAe7jshY4u6//NF4nyB02c2H9BQsOR4ZDHYQO8YWxgXjEfZjw6rpnyTeJMo5G153hXk+eAuQNTT+50CzDo4BbilyMlgtfWNgiU4zv/cqyj6U828= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=fnv1x9We; arc=none smtp.client-ip=209.85.216.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="fnv1x9We" Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-38e7b87ce77so2502377a91.0 for ; Thu, 23 Jul 2026 14:08:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784840895; x=1785445695; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=JaCZSt4Lr1JcWFT29J7un0sqZQm4NqOsE5eAND0wyWA=; b=fnv1x9We9dpq1FMsaAmz3BZHu345l6gM0ZemAEauAlWTIwu3X1ApVYK8TdTRLQ0jBh KOzQz3dH8i8UXuUtGAMLgb1RdYi+KUiYiWmpn0OlhWXaFVxM2G4m9PoZ3u448tRuhuGY bIHl5u80wIz4sUefGwg8iSGtTokRY80yGCSnvIO24BFT9pH9OPzSvphkBRjV7J31HJpg tTDJmnPyW1P/gybxFkxuAd029kDQpfLqpMosd3Sxdrjr5Ds9y43Y9qz5/id+i/YawRjD AXGl7HWwVhffM1R0+AZc1gwIlE+kXc9wVamMLF1z0HviybFHteW1m3nTxgP37pd5dRh+ vz1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784840895; x=1785445695; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=JaCZSt4Lr1JcWFT29J7un0sqZQm4NqOsE5eAND0wyWA=; b=oL++gX2VlMZD8l7KLo/PQIACekBSzFN1mfhs2gF3b2tj92zjrzzly5Szgxr1M7G971 mN/o1LGd6bS73uvSEYlVDrU1toFKLRRX8WSPkSarojsixBkpV73vT2TnO8elOJKaPvJo krFhve9Wcmi8qSnhaSsdPk0Fct8JTaTyppmOE8889W6v7qLjq4zvhcsnw7zNdP93rEIJ k8/08om6HhBzG1fz8RTHXuHtJQiY3CKsGXTfPdQKTrxmGd2MZBqNtsGUbInePGmYlFqK OgpYPLC1HKCcd0UhARskiWQQFDtUAECLkrptWj5d+HCoK2/hSd9QOjg1lJ5IDFlKPxsB jTOw== X-Forwarded-Encrypted: i=1; AHgh+RoXqE57zck+AdWTE/q2wGD2pq/UmOtIh/jJ4xhIFQUIVKPe6ptdcRfDxvL6F+qQSJA3uW1dja0vMK0MVUg=@vger.kernel.org X-Gm-Message-State: AOJu0YymcN9OB0VFB2v/YJFlIxsSXzFhLNwcI/1rP5nYgZkDt0x7htOV l1yc+eSEC9BIDqKgjsUp9Phi+UNtqZNKgEw4oIRRnjccPDyo3EdV6KXaBvozu0bnXJE8/Bt4Jvd oYTfNdA== X-Received: from pjps9.prod.google.com ([2002:a17:90a:a109:b0:38e:c1c7:b061]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:51c1:b0:38e:69b5:5386 with SMTP id 98e67ed59e1d1-38ec687738fmr4956430a91.33.1784840894480; Thu, 23 Jul 2026 14:08:14 -0700 (PDT) Reply-To: Sean Christopherson Date: Thu, 23 Jul 2026 14:08:04 -0700 In-Reply-To: <20260723210811.72720-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260723210811.72720-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Message-ID: <20260723210811.72720-3-seanjc@google.com> Subject: [PATCH v6 2/9] KVM: guest_memfd: Rename invalidate() arch hook to reclaim() and isolate it From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng , Xiaoyao Li , Michael Roth , Fuad Tabba Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rename guest_memfd's invalidate() hook to reclaim() and isolate it via its own RECLAIM Kconfig, as the hook is called when a folio is freed, which is far too late and lacks sufficient information for KVM to actually invalidate its usage of the memory. E.g. SNP uses the hook to convert memory back to SHARED so that it can be safely accessed by the host, there is no invalidation of guest mappings anywhere. Isolating the hook will also allow pKVM on arm64 to opt-in to reclaim() without also having to differentiate between reclaim and conversions to shared for active VMs. Keep guest_memfd's trampoline, even though it would be trivial to wire up .free_folio() directly to an arch callback, to avoid bleeding guest_memfd internals into arch code (specifically, avoid referencing folios in arch code). Leave the kvm_x86_ops hook as-is for the moment, as "reclaim" on SNP is the same as convert-to-shared, i.e. using a different name for the x86 hook will allow reusing it for in-place conversion. Reviewed-by: Xiaoyao Li Reviewed-by: Fuad Tabba Reviewed-by: Ackerley Tng Signed-off-by: Sean Christopherson --- arch/x86/kvm/Kconfig | 1 + arch/x86/kvm/x86.c | 7 +++++-- include/linux/kvm_host.h | 5 ++++- virt/kvm/Kconfig | 4 ++++ virt/kvm/guest_memfd.c | 6 +++--- 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index 801bf9e520db..e0e7ad015839 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -161,6 +161,7 @@ config KVM_AMD_SEV select ARCH_HAS_CC_PLATFORM select KVM_GENERIC_MEMORY_ATTRIBUTES select HAVE_KVM_ARCH_GMEM_PREPARE + select HAVE_KVM_ARCH_GMEM_RECLAIM select HAVE_KVM_ARCH_GMEM_INVALIDATE select HAVE_KVM_ARCH_GMEM_POPULATE help diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 65bcad3d0264..71c1f3e9044e 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10626,11 +10626,14 @@ int kvm_arch_gmem_prepare(struct kvm *kvm, gfn_t = gfn, kvm_pfn_t pfn, int max_ord } #endif =20 -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE -void kvm_arch_gmem_invalidate(kvm_pfn_t pfn, kvm_pfn_t nr_pages) +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM +void kvm_arch_gmem_reclaim(kvm_pfn_t pfn, kvm_pfn_t nr_pages) { kvm_x86_call(gmem_invalidate)(pfn, nr_pages); } +#endif + +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE void kvm_arch_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range = *range) { kvm_x86_call(gmem_invalidate_range)(kvm, range); diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 911c3f08b3a2..0b5b9cb022ba 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2613,8 +2613,11 @@ long kvm_gmem_populate(struct kvm *kvm, gfn_t start_= gfn, void __user *src, kvm_gmem_populate_cb post_populate, void *opaque); #endif =20 +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM +void kvm_arch_gmem_reclaim(kvm_pfn_t pfn, kvm_pfn_t nr_pages); +#endif + #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE -void kvm_arch_gmem_invalidate(kvm_pfn_t pfn, kvm_pfn_t nr_pages); void kvm_arch_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range = *range); #endif =20 diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 794976b88c6f..617876993225 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -111,6 +111,10 @@ config HAVE_KVM_ARCH_GMEM_PREPARE bool depends on KVM_GUEST_MEMFD =20 +config HAVE_KVM_ARCH_GMEM_RECLAIM + bool + depends on KVM_GUEST_MEMFD + config HAVE_KVM_ARCH_GMEM_INVALIDATE bool depends on KVM_GUEST_MEMFD diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index ca1d93fb2495..b5272645a98d 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -527,10 +527,10 @@ static int kvm_gmem_error_folio(struct address_space = *mapping, struct folio *fol return MF_DELAYED; } =20 -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM static void kvm_gmem_free_folio(struct folio *folio) { - kvm_arch_gmem_invalidate(folio_file_pfn(folio, 0), folio_nr_pages(folio)); + kvm_arch_gmem_reclaim(folio_file_pfn(folio, 0), folio_nr_pages(folio)); } #endif =20 @@ -538,7 +538,7 @@ static const struct address_space_operations kvm_gmem_a= ops =3D { .dirty_folio =3D noop_dirty_folio, .migrate_folio =3D kvm_gmem_migrate_folio, .error_remove_folio =3D kvm_gmem_error_folio, -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM .free_folio =3D kvm_gmem_free_folio, #endif }; --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:52:35 2026 Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 02D0037E2F9 for ; Thu, 23 Jul 2026 21:08:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840907; cv=none; b=dsJ7CWQTgJq3SjrGb4hxONYUl7XSSTZETuHuoVSbGsv/7i9mEyIAuPR8R/VkwNtmdbAbl+Gy7Bn1+wiMoZZTMEFUeGnv0MJBCGogFL4ZN/27ovyfDO44JvJGSh8fLpCMJ4GK57yZP6z/tt/k8E/h0558Zcgs+D2bk8ETcIXHNp8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840907; c=relaxed/simple; bh=JiSaDV5yWnAv3ZiiVbLmjykB1IeykF5uy/37V+6g1TQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=NbsImSSh8VBhFcxh3zedP1snBFAcAU1vWasLTtwoZxerCx9q/QMhJxN3NM8oaW4Bp3nzNaJgqUgEEviNZ2NCNKimuZwxcZpK2HvC9i26eTafODPQvonffgnD6DsXCaft7LAmFJJ6s2GEk5ozgGwiI7kfIK4OoZMECZBi41QYCLI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=p6qy91Tf; arc=none smtp.client-ip=209.85.210.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="p6qy91Tf" Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-84e048a801dso1720893b3a.3 for ; Thu, 23 Jul 2026 14:08:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784840896; x=1785445696; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=QzXefiH2phYC6PDa/Gx8/J3gGYE+/+w/H2tI/BUHUDc=; b=p6qy91Tfgs7Wl/jVbGg3Bc6IDurF30HbbfvXpsnXeuNlc6EBuAKMS9kB2uLbqlsOWb R347bMANmCJ+bpO0/XP7LvcBd/tC85SMO+QQz+KvfA98/bZbBR/9Wlo28GQ3mmm9Dqu1 JlyQa5O4PLVmsx+bY4v1pRXdHd44yF210TWH2q2fRNK73BodTKqsvxZKLsMr7QtCD62V Ns8lqU+R81NibGMR7LfH9Vx+6lPMJoOZA60nENti00g6fSw218i7pshJBQJBoOE6k3+d +hF0roOkCYSmp4/v8mlbuQlAj7szFDZll+AAkzelSUVhb7bX24K9glDtImSYxQjl0eFw gKCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784840896; x=1785445696; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=QzXefiH2phYC6PDa/Gx8/J3gGYE+/+w/H2tI/BUHUDc=; b=WukkeDjek7jsgjrGzLIA6RnFwbmMXd8MK78pSU9bLq9Oj9hVIGreBZplC1Ipp/d5hW epLCvBkx6KNoQk198oMuKdjE5tm9vLDUwSZ/foy6/VNAWAqnQGcLYpStPYHFSHjj+iX2 cjqhTz+zEXD2Bcn4JPQA2F80eTY5Zuvi8RmfgAvAPtpGNr1A1Mxh8crYBxc1OMMBF5Kx 0OaN7geXD7FGw4i0RfhF6eSaTxWzgOCwLhWJLGj4+p2TS9tEyTjC6HGFynk57PzCpad6 /Q++at218Bf69t02pdiz+NsVFJsPmFVpan5CTvQIfBM/d483CBxqZvR/9ypbXrEMeqhs wDUg== X-Forwarded-Encrypted: i=1; AHgh+RoWU8dVywckbiwB3tDjMiWH24w1P6swfOA3zN39/G6JwaqutO1RfArLQ/DZTh8CmrGvxXstgdyP4a52S/k=@vger.kernel.org X-Gm-Message-State: AOJu0Yy5+doBN0SqK5xKruad5eS50Fa/u9z1fp6DJxu2e1kC8GGHmP63 EDWuzLFBF3iG9psS3XJ4FTfTpWSLHxmq+ki1PXuV94n8Tz0IRSbMP7DPXb4k3sCx3Eynb49u/tT clexCZw== X-Received: from pgbbg23.prod.google.com ([2002:a05:6a02:117:b0:c99:aff5:708e]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:9148:b0:3c3:83e6:c6e6 with SMTP id adf61e73a8af0-3c44b1ee701mr5062081637.55.1784840895621; Thu, 23 Jul 2026 14:08:15 -0700 (PDT) Reply-To: Sean Christopherson Date: Thu, 23 Jul 2026 14:08:05 -0700 In-Reply-To: <20260723210811.72720-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260723210811.72720-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Message-ID: <20260723210811.72720-4-seanjc@google.com> Subject: [PATCH v6 3/9] KVM: x86: Rename kvm_x86_ops' gmem_invalidate() to gmem_make_shared() From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng , Xiaoyao Li , Michael Roth , Fuad Tabba Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rename kvm_x86_ops's gmem_invalidate() hook to gmem_make_shared(), as the hook doesn't invalidate anything, and so that KVM doesn't need to add yet another vendor callback to support "convert to shared" once in-place conversion comes along. Opportunistically wrap the ops declarations with a GMEM_RECLAIM guard so that attempting to wire up a .gmem_make_shared() hook without selecting CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM will result in a build failure. No functional change intended. Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm-x86-ops.h | 4 +++- arch/x86/include/asm/kvm_host.h | 4 +++- arch/x86/kvm/svm/sev.c | 2 +- arch/x86/kvm/svm/svm.c | 2 +- arch/x86/kvm/svm/svm.h | 2 +- arch/x86/kvm/x86.c | 2 +- 6 files changed, 10 insertions(+), 6 deletions(-) diff --git a/arch/x86/include/asm/kvm-x86-ops.h b/arch/x86/include/asm/kvm-= x86-ops.h index 736129db272a..210cb95d0a0b 100644 --- a/arch/x86/include/asm/kvm-x86-ops.h +++ b/arch/x86/include/asm/kvm-x86-ops.h @@ -149,7 +149,9 @@ KVM_X86_OP_OPTIONAL(alloc_apic_backing_page) #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE KVM_X86_OP_OPTIONAL_RET0(gmem_prepare) #endif -KVM_X86_OP_OPTIONAL(gmem_invalidate) +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM +KVM_X86_OP_OPTIONAL(gmem_make_shared) +#endif #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE KVM_X86_OP_OPTIONAL(gmem_invalidate_range) #endif diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index 8c96999f49a0..4dc8a03c829a 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1727,7 +1727,9 @@ struct kvm_x86_ops { #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE int (*gmem_prepare)(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int max_or= der); #endif - void (*gmem_invalidate)(kvm_pfn_t pfn, kvm_pfn_t nr_pages); +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM + void (*gmem_make_shared)(kvm_pfn_t pfn, kvm_pfn_t nr_pages); +#endif #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE void (*gmem_invalidate_range)(struct kvm *kvm, struct kvm_gfn_range *rang= e); #endif diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c index e6987351dc04..4aa8330d5b2d 100644 --- a/arch/x86/kvm/svm/sev.c +++ b/arch/x86/kvm/svm/sev.c @@ -5161,7 +5161,7 @@ int sev_gmem_prepare(struct kvm *kvm, kvm_pfn_t pfn, = gfn_t gfn, int max_order) return 0; } =20 -void sev_gmem_invalidate(kvm_pfn_t pfn, kvm_pfn_t nr_pages) +void sev_gmem_make_shared(kvm_pfn_t pfn, kvm_pfn_t nr_pages) { kvm_pfn_t end =3D pfn + nr_pages; =20 diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index 91286d46d13a..b8c9967dd0de 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -5439,7 +5439,7 @@ struct kvm_x86_ops svm_x86_ops __initdata =3D { .vm_move_enc_context_from =3D sev_vm_move_enc_context_from, =20 .gmem_prepare =3D sev_gmem_prepare, - .gmem_invalidate =3D sev_gmem_invalidate, + .gmem_make_shared =3D sev_gmem_make_shared, .gmem_invalidate_range =3D sev_gmem_invalidate_range, .gmem_max_mapping_level =3D sev_gmem_max_mapping_level, #endif diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h index cf8fb3d6a100..b2acb5ab7c26 100644 --- a/arch/x86/kvm/svm/svm.h +++ b/arch/x86/kvm/svm/svm.h @@ -1010,7 +1010,7 @@ int sev_dev_get_attr(u32 group, u64 attr, u64 *val); extern unsigned int max_sev_asid; void sev_handle_rmp_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u64 error_code= ); int sev_gmem_prepare(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int max_or= der); -void sev_gmem_invalidate(kvm_pfn_t pfn, kvm_pfn_t nr_pages); +void sev_gmem_make_shared(kvm_pfn_t pfn, kvm_pfn_t nr_pages); void sev_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range *rang= e); int sev_gmem_max_mapping_level(struct kvm *kvm, kvm_pfn_t pfn, bool is_pri= vate); struct vmcb_save_area *sev_decrypt_vmsa(struct kvm_vcpu *vcpu); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 71c1f3e9044e..249267ed2a9d 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10629,7 +10629,7 @@ int kvm_arch_gmem_prepare(struct kvm *kvm, gfn_t gf= n, kvm_pfn_t pfn, int max_ord #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM void kvm_arch_gmem_reclaim(kvm_pfn_t pfn, kvm_pfn_t nr_pages) { - kvm_x86_call(gmem_invalidate)(pfn, nr_pages); + kvm_x86_call(gmem_make_shared)(pfn, nr_pages); } #endif =20 --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:52:35 2026 Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 56FB03F3266 for ; Thu, 23 Jul 2026 21:08:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840905; cv=none; b=Ls/YrOPV2M5/79PT3sggiQrzILWKLC9O7ILh7loYfzbRcEWQGamneF6qxLpNmf5ao1jb1bZ72E9nlE88cyA5eALbbEFA76m2NAvrjkY5CNI+nNlEdxLT1cq/1uFjG5pPSn1n2E5T3+9I3OqcSjyzg2+H+DEqs3dwFXm93HOjIyA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840905; c=relaxed/simple; bh=LljWRFUKb6b8P53VSK2dy8jrpSiFxDei2TKifqh5AZk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Mkk3aSOZv6EMq1h5IfLgF8DaV5BMKGG1hN6XoZl6/KGt24dJ52SR9buY954aTaEAcrIInYq4yhnhQg0vKTs+VhH1zjWsVkQ4SbsP5dK0VjlZYpxD7SvDEutmfeekQ3KG8XMBDWadX8GCQLc+1NWFtjLP6JltNyXnzkajHdHngxA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=rm7SvqAC; arc=none smtp.client-ip=209.85.215.197 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="rm7SvqAC" Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-cb11535e6a1so985299a12.0 for ; Thu, 23 Jul 2026 14:08:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784840897; x=1785445697; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=fbwF6vr/AOTW7Vn1a0v89zwGTRmaPYHRuV1v74U/8hY=; b=rm7SvqACJnm73fOfx2fHpCKKV24BxWiWPI5zs4xZQtyfPvKob3YETVXUgMaC8Uem/i 65E+h5749uVYPSW1H/IWud/Yz7+UXX2b9od4iEQuPdartpsfYGosUI9SWgt4Kw2odRFN ImWfHTTVuU7WAzSmllm+dggRi+froCMucB3sFixAn/8mzHmQzQzRozYTI10gpEkACTRP Hr7OIy7PPjQ6aIThEJFAKB2aLDWY5ARjxAlYcGXmPg/c8TZ4TCWMhUxmvOXoUE8IVIik NPuKQptPsct4J1AeTMwWMWnQmXmF1EFwZREU6P5t15qKZzZLpedaKlloAKbRGCphXnqa wx8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784840897; x=1785445697; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=fbwF6vr/AOTW7Vn1a0v89zwGTRmaPYHRuV1v74U/8hY=; b=dpGok3kZpxYs50uECCGA2CcEy/OY73s9fSezJHE4RLCx8mVjATC0C3xbNkhnKrKkge Ir7kbyj0KKhrM0WHBk0Evxz19BgyTQmzDgMA8TpocU0HIftSji721fdyhYZ3OYYyFGAp /iYIuAm/746qXWFtXPWGOtRDiJOsJ57GDxfXdUVY9/tI4sj5urf+baia3WxdxgkPWF/i c518VBNIgwc/kFcbCmJyfT0Ho4prAoXAYk6gqeQOrkXARy5C8sSa+XjOtKyeotpz/3qh xXL6d7ruWaLzKYYHsnexPqUnzOc6ZDDF+bnjvusA4CDrTFhlTKMoXdg3SRYWMx/P18he CgdQ== X-Forwarded-Encrypted: i=1; AHgh+RrsOXTZQRKTK/1hAJcVcctTjAIx7m6dg9Z6tPtR5S8QowpuAwDkPvcWb740kxFK+m83+CvU2nq01iLuZJE=@vger.kernel.org X-Gm-Message-State: AOJu0Yw4t9XEF0w2RZXEb3XGddxW6bP+JOL20iroWRdG7E58KiTh55px obmfaNWOz5yUjFSJjqpyvpVQjo6uMdk9vwe4SRZBc5zykaIFjGpilH116qkHt+FEelYhyEKWLyA bVgiwsw== X-Received: from pfeu4-n1.prod.google.com ([2002:a05:6a00:c0c4:10b0:848:2a35:eb83]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:b902:b0:848:2c6c:dfc0 with SMTP id d2e1a72fcca58-84e2b898e78mr5346341b3a.24.1784840896735; Thu, 23 Jul 2026 14:08:16 -0700 (PDT) Reply-To: Sean Christopherson Date: Thu, 23 Jul 2026 14:08:06 -0700 In-Reply-To: <20260723210811.72720-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260723210811.72720-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Message-ID: <20260723210811.72720-5-seanjc@google.com> Subject: [PATCH v6 4/9] KVM: guest_memfd: Drop the redundant printk on arch gmem_prepare() failure From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng , Xiaoyao Li , Michael Roth , Fuad Tabba Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drop guest_memfd's ratelimited printk to log "preparation" failures, as KVM SNP already logs more precise messages in all error paths, and whether or not failure to convert the pfn to private is "unexpected", i.e. warrants logging, is firmly an architecture specific detail. Reviewed-by: Ackerley Tng Reviewed-by: Xiaoyao Li Reviewed-by: Fuad Tabba Signed-off-by: Sean Christopherson --- virt/kvm/guest_memfd.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index b5272645a98d..2effff582f50 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -66,15 +66,11 @@ static int __kvm_gmem_prepare_folio(struct kvm *kvm, st= ruct kvm_memory_slot *slo #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE kvm_pfn_t pfn =3D folio_file_pfn(folio, index); gfn_t gfn =3D slot->base_gfn + index - slot->gmem.pgoff; - int rc =3D kvm_arch_gmem_prepare(kvm, gfn, pfn, folio_order(folio)); - if (rc) { - pr_warn_ratelimited("gmem: Failed to prepare folio for index %lx GFN %ll= x PFN %llx error %d.\n", - index, gfn, pfn, rc); - return rc; - } -#endif =20 + return kvm_arch_gmem_prepare(kvm, gfn, pfn, folio_order(folio)); +#else return 0; +#endif } =20 /* --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:52:35 2026 Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9882E3F3286 for ; Thu, 23 Jul 2026 21:08:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840905; cv=none; b=Ly03+X3QmuM2agjpifHBRqDps1jqRcJMiif65vI6XCUv/Obr8efna1FGRzdPmcKWyYx3MKTTf6kssww4Ze/0ICBVfYKR5QX4AnyE8Fdfe1tpnVv/7ifOQHaT7cYsnKPoneyJ6fRCIQmT5tlk7MZBzSHLQs6T4UoV+FrIPf53X80= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840905; c=relaxed/simple; bh=eA93fv/mpTDCRlrJZcN1uZi/U70iOhyh+rAp/vvrO8E=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=sj5sq8a017bmcWeMIGDbnoy4uUiaYqbpgqUdqBsEGULhuz0WAA7aNhxtkzX2RpXVSY/1mHnhs2Yb0PB0VQvz9+/GUUnBJJbzHDHVTBIQ8sNpVN1o8ayuVzw6i+Q2/QYtNZbvPy1kn/iax4E8GX4vKE+U/eLS8I1Wbk9D38n+8Ak= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=OFn1FEu/; arc=none smtp.client-ip=209.85.210.200 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="OFn1FEu/" Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-8484b9fb055so2474200b3a.0 for ; Thu, 23 Jul 2026 14:08:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784840898; x=1785445698; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=C50SurZZSt8mA6DGLyY21O4lr+i0ojUTfN7EWK5ap7M=; b=OFn1FEu/sSn2OrngPDiPb2ecCJVSHnArFL8aGe3Hl0jQ6pRLGNWW/TVuP5ECWDY0tD sK5yIChh6fBjy9yHi4VdStitGnlX40HOna7Dx8lCYG3gVYADfqTq4UQFzbtwBdxlorng V1UDS/SjFA8EHsPZZqllKg7v+6v3tIbul6F7gB77iOhixh4jfMQaq8nb6WPZCi+GyTQ/ CBYA9PuOryt8UgZGYsdiXypJbce6e26iMDvdF6YMLjrH5OTzILyLdA8cbaK25lk5MeJE kkkuK8rikZDVu2ysV953t5YsLkgCS55R461XT0TpeGKu2+zaWWll+arXuhKXQQiTF5IY iEVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784840898; x=1785445698; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=C50SurZZSt8mA6DGLyY21O4lr+i0ojUTfN7EWK5ap7M=; b=iNDkNPJDXxyP5QW6tEY32akqvlkz30Eod7P5oFQhmhfsx8mY6FG1u9MsmvQcMM+B4S 1vC0ue8E6Df5lqUEphcQ0hVagCCrSPTpsANvqE9109j+Y52DxpPrlfSz2vO+ASzcdCv2 cTbwD9NplDe6Rw9qKTlhmjdfu6IfM4+Q/dtpPWY3ZvqsK0xPeRe9iSbcSM27I8nSOZEn TMqwlwC1Su6dEoDsTEXe+99iXekB+I7/IFM/LN1I9MxjwBSMg2RrxHpAQFvNnGmte3Zi ophpHHH2eqQPDjmNmuVB7qHUwXChQTwBXNoGZtAjp+z3XIItL+xRH0k8JQoDdnQk3xoA 8RuQ== X-Forwarded-Encrypted: i=1; AHgh+RoAxwq/uXjHEDD+Lu6Yqx47blAlNiiB0WpE/EDaeQQciStK5S/5K0G9eY3xILuG50BFZt22rAfjNFO+8iw=@vger.kernel.org X-Gm-Message-State: AOJu0YyPx3IGzc49hth+XE1XkpEBT2a7lBKwIUS0K2qi0Fq3nWuySkFp es7GP+4YNgG6X8fDfLWSver5l+qckBWyMm71rkhKqII7HX+y3UyCejEE9JRPkCxbDiRkWc5fgm4 YXdjJUQ== X-Received: from pgii15.prod.google.com ([2002:a63:220f:0:b0:ca1:3a05:d935]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:928f:b0:848:2f77:e2e0 with SMTP id d2e1a72fcca58-84e2c262b43mr5494478b3a.73.1784840897838; Thu, 23 Jul 2026 14:08:17 -0700 (PDT) Reply-To: Sean Christopherson Date: Thu, 23 Jul 2026 14:08:07 -0700 In-Reply-To: <20260723210811.72720-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260723210811.72720-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Message-ID: <20260723210811.72720-6-seanjc@google.com> Subject: [PATCH v6 5/9] KVM: guest_memfd: Add helpers to query SHARED vs. PRIVATE for a given page From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng , Xiaoyao Li , Michael Roth , Fuad Tabba Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add helpers to check if a given page in a guest_memfd instance is PRIVATE versus SHARED, and use the "is shared" helper instead of an open-coded equivalent in the user pagefault handler. In addition to the immediate usage, providing an "is private" helper will allow cleaning up the so called prepare() code, and eventually will be heavily used once in-place conversion support comes along. No functional change intended. Signed-off-by: Sean Christopherson --- virt/kvm/guest_memfd.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 2effff582f50..e9d61410e5fb 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -60,6 +60,16 @@ static pgoff_t kvm_gmem_get_index(struct kvm_memory_slot= *slot, gfn_t gfn) return gfn - slot->base_gfn + slot->gmem.pgoff; } =20 +static bool kvm_gmem_is_private_mem(struct inode *inode, pgoff_t index) +{ + return !(GMEM_I(inode)->flags & GUEST_MEMFD_FLAG_INIT_SHARED); +} + +static bool kvm_gmem_is_shared_mem(struct inode *inode, pgoff_t index) +{ + return !kvm_gmem_is_private_mem(inode, index); +} + static int __kvm_gmem_prepare_folio(struct kvm *kvm, struct kvm_memory_slo= t *slot, pgoff_t index, struct folio *folio) { @@ -397,7 +407,7 @@ static vm_fault_t kvm_gmem_fault_user_mapping(struct vm= _fault *vmf) if (((loff_t)vmf->pgoff << PAGE_SHIFT) >=3D i_size_read(inode)) return VM_FAULT_SIGBUS; =20 - if (!(GMEM_I(inode)->flags & GUEST_MEMFD_FLAG_INIT_SHARED)) + if (!kvm_gmem_is_shared_mem(inode, vmf->pgoff)) return VM_FAULT_SIGBUS; =20 folio =3D kvm_gmem_get_folio(inode, vmf->pgoff); --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:52:35 2026 Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A6C453F328F for ; Thu, 23 Jul 2026 21:08:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840905; cv=none; b=qhZEovqVtY/VX6Waqo6LdWVbmIcN4T+n/jRpHSCdol94N5lkDdzREjfj1Uzk4C3uol8G7qpMzyu6V/0wFY8gcdvUJZAdeE4N41LVXBe4c+YOcUv/a3V/H6E9iZezsdB4s2/YulAVspCtr40Y4c3AxbjpeBvHHoit4zySLldbwKU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840905; c=relaxed/simple; bh=il5fIgZarUP1i40dd38C4qltoZmuiFcM1dhxxldYAls=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=R6Edn327+6SBZMVOmRmn60ktT7zWtSqfDUI3EnqkroA8oIRBpJLflNhU4E7TSAta9Q1JBYvg9PFsKDsNnFKIR7HYy8Qerj/ieOBJuXvk4EMPioGsRm9L0ld7v0s/+q1B+vXFXkrcCdxe5Q7VnnsZWYMVB7A9m+/l55WW4xeCfHU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=C2CQpFHB; arc=none smtp.client-ip=209.85.215.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="C2CQpFHB" Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-cb5bdd8450dso794602a12.0 for ; Thu, 23 Jul 2026 14:08:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784840899; x=1785445699; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=0RRn9GYYGgZRcSQviEMPgCBppz0KQJ7kyoL5I72dbzg=; b=C2CQpFHBlSOJWv5/sTEL811ABB69eR8brYbJ2Vv74yoXB2du9mpW3Plka8ElTcVXJ6 yblLCaYXqW9DKG89nLNMKbvJAc4L65plKluvGOjIfmMCa9Npo3jYip/chceU0iuak67L izcJBuzVJqnu2xS1VNcQsqpZ92/c3fLwTTl2BJpflJ5sMc0PjwgdC3vOtW8PGlSAc2Aw gAS+nu7WMMGvGgwpfwj3HeUexaKdhmS738htuZkOYA9eq4LLjjtKg4hnC6fdnFwze0Sv OuZUr9SyX/TrSl8PriDHizMCH82EkfNFNQBNSF8xQqODrTmROkpvaA5bJT7ad7/Ekgm8 tLMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784840899; x=1785445699; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=0RRn9GYYGgZRcSQviEMPgCBppz0KQJ7kyoL5I72dbzg=; b=jM+woKiEgjT6OKzg4a804i1+3GIug5Pv6bHVC/017Yxx7BLwXdQdGl5fAreNJTSWRe udA/Z+1/HYXOHio9Z5uogcdCvrU8iOnHDazdlJzwV88zRh1YqGybPbfw2HSHWG8jjh+J 5LBFU2SfO1xeip5uGIpPkNGnAOqadRCjLofx0eu5esYvqw+P9/+8eYlHv3iC05YIVpTl kwycU5VFNVJGyKhZvpq7keZxSr5qeqgmZxeVGx1fETYxRmSP7cJ4+DZaTM99ho0QcTLM fasCeQ5CmhCV5Qvm6K6XQKjRepnJ+RP/HTFbiWeMtPp66tGhC6l+zQOSMHg10YsAd/kt 6CYA== X-Forwarded-Encrypted: i=1; AHgh+RqJcShvx/58iVKjhAefKgsupsxqAxM4Ni3oWH+WtIw3rjpSq8DCLYjPm4eJg1QngqlHhkycwIuNOKitc0U=@vger.kernel.org X-Gm-Message-State: AOJu0YwiEB2aArhN5RwOJrelepsviHkp7GU6YCy6c4n7wmaFjoJfTRqi tbfrL1PcghzXvVA4jFXoEssFV6MhvSns/XIzJ42RcsMCr75C8m1aNsCuRyy5Yy+QA28P7nOGZ26 5oJOV6g== X-Received: from pfll21.prod.google.com ([2002:a05:6a00:1595:b0:84e:4f2:22c]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:21cd:b0:845:ba94:a56 with SMTP id d2e1a72fcca58-84e2b82f77fmr5623035b3a.5.1784840898995; Thu, 23 Jul 2026 14:08:18 -0700 (PDT) Reply-To: Sean Christopherson Date: Thu, 23 Jul 2026 14:08:08 -0700 In-Reply-To: <20260723210811.72720-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260723210811.72720-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Message-ID: <20260723210811.72720-7-seanjc@google.com> Subject: [PATCH v6 6/9] KVM: guest_memfd: Only "prepare" folios for private pages From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng , Xiaoyao Li , Michael Roth , Fuad Tabba Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Ackerley Tng When getting a guest_memfd pfn, prepare the folio, i.e. convert its pages to private, if and only if the page is actually private. The misnamed prepare() hook exists specifically to allow x86's SNP to assign pages to the owning VM in the RMP when mapping private memory into a guest. Guarding the call will allow renaming the prepare() hook to better reflect its role, without creating a semantic mess, and will become a hard requirement once in-place conversion is supported, i.e. when CoCo VMs support SHARED guest_memfd pages. For all intents, no functional change intended (the sole arch hook is a nop for SHARED memory). Suggested-by: Michael Roth Reviewed-by: Fuad Tabba [sean: rewrite changelog to fit the context] Signed-off-by: Ackerley Tng --- virt/kvm/guest_memfd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index e9d61410e5fb..f64cd87ec8b0 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -814,7 +814,8 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory= _slot *slot, folio_mark_uptodate(folio); } =20 - r =3D kvm_gmem_prepare_folio(kvm, slot, gfn, folio); + if (kvm_gmem_is_private_mem(file_inode(file), index)) + r =3D kvm_gmem_prepare_folio(kvm, slot, gfn, folio); =20 folio_unlock(folio); =20 --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:52:35 2026 Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1D6CF3EBF23 for ; Thu, 23 Jul 2026 21:08:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840911; cv=none; b=qtbasYbGjqnBh0pSgOqORO7Y5lwnKok/lUX/bHI6YG39INAAngWlUZATKWarmqohvPQ27sd5d6oGsSOjxY5hZjXxVISh1tqtcshq44F885Ms09TJNsiDLQZeAxlSgcf2GxfcRzVZFxQRcQyZPdZX6M60l5+w7QL7FHYuiezibWw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840911; c=relaxed/simple; bh=qxZmM6gRP0uUjzvY2OwBMDJUInPix9yGcRlGW2gS354=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=V3LWVkEaDQtQuNF3aQLGC0npT3GEVN6h+xQTY8Rb5zQYucMIlHUSQPkS7WNTFAA3c/ofuzB3oP4BBANEbYf0Df/qO6TR2YiNLtolrCvs6bTzgnc17iqq30Bt6MJoVOXwiV0iej8xzfMFkzeA7ocXm0be/56tS46n3Xn7MT2GN6I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=FhEXoErM; arc=none smtp.client-ip=209.85.210.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="FhEXoErM" Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-84e04598adeso950072b3a.2 for ; Thu, 23 Jul 2026 14:08:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784840900; x=1785445700; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=CezFMo6AjWdBbkGqWYOJc/NxdnAR8Xr0R3EVd5Fryfk=; b=FhEXoErM7u4z8mksmeU3bXchybkchyPwYngnXVdsnblqkvMeJTgZYbEGOEoBtdq3ic f6p14J0XFmrIO08qDvIGYYUpAbElcj9VQGwlGsL+KtIpAh3PaWelQpsCyORcyKDgWA/2 HEgAqBEU4N/rI4HbfTE0zFPLCTpFQbkJ1Cg2j7HWm61DyqXU8RIueJpARtmUjcQKudVQ vQ4HndA/p4Jjpt5Ks0L3mY+Je/mhPjyrD4ItGXfd3lybIFZZswcL3aTMUTr8PbJDFRAu XjW1gmkquFx54xLVbMui1S0eiucauNKjldwAT/aXQ4pveaJY2umxRWvPtQOxjpAbFew+ QO3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784840900; x=1785445700; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=CezFMo6AjWdBbkGqWYOJc/NxdnAR8Xr0R3EVd5Fryfk=; b=W/vj33CAVWcG9pbUu7/shSvQyyEy2OoZSeJIt8T4e2ekxgwoMTq2qnR1z6LL0qHDUB bQgmlgWJVw1ITKzWJGC1Rlf968IvzC4k8Hh+u/ZbmqUiPwnbhu/hL+NHtmY1P4JkIPdc 6h9mx6ILSFv0znlEyDYLBDMI1XmXsFe6WtVr7xputJzq4ruJNZo3rSt5jsluAzZg8KXH NvZTFGHZioprcEe2yXnD+wMwrkCTdOP1a+YdzATuQQgT5xCRUe32mqSdaM3wrmadMSkr 7cmaxgts6bSE4bH+gQy/jFyuRY0Y6KgwqoRtpKVVgEdjNtC0GBDu7A66RM+egl07PgMJ IkLg== X-Forwarded-Encrypted: i=1; AHgh+RrQ8nPrXSW045H8iquhCTUbE5JlVkqSsm7x9YUK3Wsm6w4DGjlZ/IPX2ACRw8e8UC+DliAnVVmg6s0fS9o=@vger.kernel.org X-Gm-Message-State: AOJu0YzaIyf5xPktLXFNu/9gCacMWA8E6h81i9/MpC2edP8t2q/XVuJn 7ojLni1XB89MHUkhHPkbbQxjI6I/MOGDS3Xrd3ITz/lL4rxDiDka+Pkyb/9TCkadP2b3kD0ASip 3/mAUTA== X-Received: from pgbbz30.prod.google.com ([2002:a05:6a02:61e:b0:c93:5d65:8f45]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1c89:b0:848:86d6:298b with SMTP id d2e1a72fcca58-84e2b8d1207mr4895125b3a.29.1784840900107; Thu, 23 Jul 2026 14:08:20 -0700 (PDT) Reply-To: Sean Christopherson Date: Thu, 23 Jul 2026 14:08:09 -0700 In-Reply-To: <20260723210811.72720-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260723210811.72720-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Message-ID: <20260723210811.72720-8-seanjc@google.com> Subject: [PATCH v6 7/9] KVM: guest_memfd: Rename prepare() hook and Kconfig to make_private() / CONVERT From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng , Xiaoyao Li , Michael Roth , Fuad Tabba Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rework guest_memfd's prepare() hook into a more accurate make_private(), and rework its Kconfig from PREPARE to a more generic CONVERT. This will allow x86 to share (pun intended) a kvm_x86_ops.gmem_make_shared() hook between the "convert to shared" and "reclaim" flows, which are one and the same for SNP. No functional change intended. Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm-x86-ops.h | 4 ++-- arch/x86/include/asm/kvm_host.h | 4 ++-- arch/x86/kvm/Kconfig | 2 +- arch/x86/kvm/svm/sev.c | 2 +- arch/x86/kvm/svm/svm.c | 2 +- arch/x86/kvm/svm/svm.h | 2 +- arch/x86/kvm/x86.c | 6 +++--- include/linux/kvm_host.h | 5 +++-- virt/kvm/Kconfig | 2 +- virt/kvm/guest_memfd.c | 4 ++-- 10 files changed, 17 insertions(+), 16 deletions(-) diff --git a/arch/x86/include/asm/kvm-x86-ops.h b/arch/x86/include/asm/kvm-= x86-ops.h index 210cb95d0a0b..a4d872ddef9d 100644 --- a/arch/x86/include/asm/kvm-x86-ops.h +++ b/arch/x86/include/asm/kvm-x86-ops.h @@ -146,8 +146,8 @@ KVM_X86_OP(vcpu_deliver_sipi_vector) KVM_X86_OP_OPTIONAL_RET0(vcpu_get_apicv_inhibit_reasons); KVM_X86_OP_OPTIONAL(get_untagged_addr) KVM_X86_OP_OPTIONAL(alloc_apic_backing_page) -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE -KVM_X86_OP_OPTIONAL_RET0(gmem_prepare) +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT +KVM_X86_OP_OPTIONAL_RET0(gmem_make_private) #endif #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM KVM_X86_OP_OPTIONAL(gmem_make_shared) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index 4dc8a03c829a..4be57157136b 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1724,8 +1724,8 @@ struct kvm_x86_ops { =20 gva_t (*get_untagged_addr)(struct kvm_vcpu *vcpu, gva_t gva, unsigned int= flags); void *(*alloc_apic_backing_page)(struct kvm_vcpu *vcpu); -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE - int (*gmem_prepare)(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int max_or= der); +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT + int (*gmem_make_private)(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int m= ax_order); #endif #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM void (*gmem_make_shared)(kvm_pfn_t pfn, kvm_pfn_t nr_pages); diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index e0e7ad015839..538ed1e80332 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -160,7 +160,7 @@ config KVM_AMD_SEV depends on CRYPTO_DEV_SP_PSP && !(KVM_AMD=3Dy && CRYPTO_DEV_CCP_DD=3Dm) select ARCH_HAS_CC_PLATFORM select KVM_GENERIC_MEMORY_ATTRIBUTES - select HAVE_KVM_ARCH_GMEM_PREPARE + select HAVE_KVM_ARCH_GMEM_CONVERT select HAVE_KVM_ARCH_GMEM_RECLAIM select HAVE_KVM_ARCH_GMEM_INVALIDATE select HAVE_KVM_ARCH_GMEM_POPULATE diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c index 4aa8330d5b2d..0ecba768c153 100644 --- a/arch/x86/kvm/svm/sev.c +++ b/arch/x86/kvm/svm/sev.c @@ -5114,7 +5114,7 @@ static bool is_large_rmp_possible(struct kvm *kvm, kv= m_pfn_t pfn, int order) return false; } =20 -int sev_gmem_prepare(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int max_or= der) +int sev_gmem_make_private(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int m= ax_order) { struct kvm_sev_info *sev =3D to_kvm_sev_info(kvm); kvm_pfn_t pfn_aligned; diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index b8c9967dd0de..d5a08f1db84b 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -5438,7 +5438,7 @@ struct kvm_x86_ops svm_x86_ops __initdata =3D { .vm_copy_enc_context_from =3D sev_vm_copy_enc_context_from, .vm_move_enc_context_from =3D sev_vm_move_enc_context_from, =20 - .gmem_prepare =3D sev_gmem_prepare, + .gmem_make_private =3D sev_gmem_make_private, .gmem_make_shared =3D sev_gmem_make_shared, .gmem_invalidate_range =3D sev_gmem_invalidate_range, .gmem_max_mapping_level =3D sev_gmem_max_mapping_level, diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h index b2acb5ab7c26..ad849edcacc7 100644 --- a/arch/x86/kvm/svm/svm.h +++ b/arch/x86/kvm/svm/svm.h @@ -1009,7 +1009,7 @@ int sev_cpu_init(struct svm_cpu_data *sd); int sev_dev_get_attr(u32 group, u64 attr, u64 *val); extern unsigned int max_sev_asid; void sev_handle_rmp_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u64 error_code= ); -int sev_gmem_prepare(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int max_or= der); +int sev_gmem_make_private(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int m= ax_order); void sev_gmem_make_shared(kvm_pfn_t pfn, kvm_pfn_t nr_pages); void sev_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range *rang= e); int sev_gmem_max_mapping_level(struct kvm *kvm, kvm_pfn_t pfn, bool is_pri= vate); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 249267ed2a9d..e7865b28d37b 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10619,10 +10619,10 @@ bool kvm_arch_supports_gmem_init_shared(struct kv= m *kvm) return !kvm_arch_has_private_mem(kvm); } =20 -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE -int kvm_arch_gmem_prepare(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, int m= ax_order) +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT +int kvm_arch_gmem_make_private(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, = int max_order) { - return kvm_x86_call(gmem_prepare)(kvm, pfn, gfn, max_order); + return kvm_x86_call(gmem_make_private)(kvm, pfn, gfn, max_order); } #endif =20 diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 0b5b9cb022ba..9cf01429281b 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2579,8 +2579,9 @@ static inline int kvm_gmem_get_pfn(struct kvm *kvm, } #endif /* CONFIG_KVM_GUEST_MEMFD */ =20 -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE -int kvm_arch_gmem_prepare(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, int m= ax_order); +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT +int kvm_arch_gmem_make_private(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, + int max_order); #endif =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_POPULATE diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 617876993225..c3c0ee253fc7 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -107,7 +107,7 @@ config KVM_GUEST_MEMFD select XARRAY_MULTI bool =20 -config HAVE_KVM_ARCH_GMEM_PREPARE +config HAVE_KVM_ARCH_GMEM_CONVERT bool depends on KVM_GUEST_MEMFD =20 diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index f64cd87ec8b0..466f611ad4b7 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -73,11 +73,11 @@ static bool kvm_gmem_is_shared_mem(struct inode *inode,= pgoff_t index) static int __kvm_gmem_prepare_folio(struct kvm *kvm, struct kvm_memory_slo= t *slot, pgoff_t index, struct folio *folio) { -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT kvm_pfn_t pfn =3D folio_file_pfn(folio, index); gfn_t gfn =3D slot->base_gfn + index - slot->gmem.pgoff; =20 - return kvm_arch_gmem_prepare(kvm, gfn, pfn, folio_order(folio)); + return kvm_arch_gmem_make_private(kvm, gfn, pfn, folio_order(folio)); #else return 0; #endif --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:52:35 2026 Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F40F13F3277 for ; Thu, 23 Jul 2026 21:08:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840916; cv=none; b=FO99Cs5XkzcNPGuvshLy/OFtwa1j8SyRgUMSE4sNpLUe7ic1R0q1xndRYQ5gd9mH/rNL/HGlkVlF3w1tiJwh19XM+Xc8tWuCeQsvj/XWICKo051zQUgm1tkNbWSSARzJVu0m8G5+UeG+GXkIU2YGU4e8dBLkhrLWuQdrEWDbE3Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840916; c=relaxed/simple; bh=C4UzjAkeQgNz3jhX9X1p1bArt+15GMFelgLpMLC9Vqw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=CPG3Pj8FH/Oq5jrFvi3PTcc7xLv9/DZwVWeiLM1mcWv1koEJvxflgtws/ZrPoB44gkTyavKIWHEGDIajR07PnppAZl4+pK2uKttqZE2n6qa6QgetHn9KY4TWuhaDzY17uwfoTZsx/NkSFstApqs4NNQYEEBDNwSN69nAe/H/N9A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=LyjDxNtf; arc=none smtp.client-ip=209.85.215.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="LyjDxNtf" Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-cb11535e6a1so985323a12.0 for ; Thu, 23 Jul 2026 14:08:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784840901; x=1785445701; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=IDpiaOiDWkuaIgELS/orYZEj+Bt7gPfIn1c9ArEgIYg=; b=LyjDxNtfMdgPl74Et9LyFEUi8Cqazmtf1aZwaEaQ6EVp9QEi2wKZ0TZ7zfEKr3DsVP gphbZ9J71VI3KL4NePpJxJl59y4I/WmnzQlLL3BlF78+WJEg9pzTbEvjXaao/08f4Pf3 fjvcXOy5GsG+O0voMenUm8u6a106Lgk3eHqO4YSmqgBB2+xCL+wSzLwbwYbV/WZZ1J1c 9CLnIj+GY4Uvi74qYlQEVM3s3NOgG3LHqESPJLKqpHXb6ukaKg9zNLuuf0+0SBSWjUKL /pNnPT7TGYxysdFXPxNPKylAKdNeNC6tgWNjmjTSv7SEpc/osNFWalNcclqbSAw5ZjiV K34A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784840901; x=1785445701; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=IDpiaOiDWkuaIgELS/orYZEj+Bt7gPfIn1c9ArEgIYg=; b=EXdgd0laafTYC84DECeUC7jbZqYlD34Pa0DUol1BPk1j8nPZBMl2cNo2ejLJL5Ak6h 4BcOXk4KZoa9psSLjurRj0TXvwTePJ9Mgnz6ouKjB9SM+JmEgQ7SwKIANluefuEbr8xb V7qdpuOXN4bqLpsMWd93oKqEuUl2aSq+//ayBnak+ej3L8ueJZMdAx2Sq4E5Ho9LQFfk f2QFR5TteOjFbkLEursmTX7M4WOJ215UQjdxbZ1xDmdAAKA1qCYh3SxCQwy1c8rgLGVT wqe5k3ArNhWox8F0jQ4yQtvQ/CJEYl9dTF2XGfCcufO/F+ve/vZlTSlL/yyWlxCRVHzK sRDQ== X-Forwarded-Encrypted: i=1; AHgh+Rp4+8v4Lqr27dlpkp1z+mO4CeBvpQ1X9XwDokGz0F+G8/+GWZqKi5hBFkw75YpWw2+qkgEOx2023U8Z4r8=@vger.kernel.org X-Gm-Message-State: AOJu0Yy46W7SOQYEL7NC28c10uF+LFtpdZTYnZ5V1UzUeKV/7mGtV+ip Y2sLqz7VGt52RzMynpZAIWNs5QUmHbXHJQFnOOM6xdWYDlxae+jFMOcBf3IdcbT8o4KDwhqDwf9 nTSMCmQ== X-Received: from pguo10.prod.google.com ([2002:a65:6a4a:0:b0:c9a:c533:831a]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:a8d:b0:3c3:af85:85e7 with SMTP id adf61e73a8af0-3c44b078667mr5071012637.34.1784840901194; Thu, 23 Jul 2026 14:08:21 -0700 (PDT) Reply-To: Sean Christopherson Date: Thu, 23 Jul 2026 14:08:10 -0700 In-Reply-To: <20260723210811.72720-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260723210811.72720-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Message-ID: <20260723210811.72720-9-seanjc@google.com> Subject: [PATCH v6 8/9] KVM: guest_memfd: Explicitly pass number of pages to make_private() hook From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng , Xiaoyao Li , Michael Roth , Fuad Tabba Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Tweak the guest_memfd make_private() hook to explicitly pass the number of pages to align with the signature of the make_shared() hook, and because the existing code is outright broken if a guest_memfd folio is comprised of more than one page (which can't happen, yet). The SNP code *tries* to create a corresponding huge entry, but if the RMP must use 4KiB entries for whatever reason, KVM will only convert the first pfn, and not the entire range of pfns that will be mapped into the guest. Alternatively, @max_order could simply be repurposed as _the_ @order, but that will fall apart when in-place conversion comes along, at which point KVM will need to deal with conversions that aren't bound 1:1 to a folio. I.e. the number of pages to convert may not be exactly be a power-of-2 (and folios don't strictly guarantee power-of-2 pages anyways). WARN in the SNP code if the number of pages to prepare is anything other than '1', i.e. if guest_memfd is trying to prepare/convert more than a single 4KiB page, as sev_gmem_prepare() doesn't actually handle conversion greater than order-0 folios. Opportunistically swap the ordering of @pfn and @gfn params for kvm_x86_ops.gmem_make_private() to match kvm_arch_gmem_make_private(). Fixes: b85524314a3d ("KVM: guest_memfd: delay kvm_gmem_prepare_folio() unti= l the memory is passed to the guest") Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 3 ++- arch/x86/kvm/svm/sev.c | 27 +++++++++++---------------- arch/x86/kvm/svm/svm.h | 2 +- arch/x86/kvm/x86.c | 5 +++-- include/linux/kvm_host.h | 2 +- virt/kvm/guest_memfd.c | 2 +- 6 files changed, 19 insertions(+), 22 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index 4be57157136b..230267b2203b 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1725,7 +1725,8 @@ struct kvm_x86_ops { gva_t (*get_untagged_addr)(struct kvm_vcpu *vcpu, gva_t gva, unsigned int= flags); void *(*alloc_apic_backing_page)(struct kvm_vcpu *vcpu); #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT - int (*gmem_make_private)(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int m= ax_order); + int (*gmem_make_private)(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, + kvm_pfn_t nr_pages); #endif #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM void (*gmem_make_shared)(kvm_pfn_t pfn, kvm_pfn_t nr_pages); diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c index 0ecba768c153..bf7f94d1d7f9 100644 --- a/arch/x86/kvm/svm/sev.c +++ b/arch/x86/kvm/svm/sev.c @@ -5090,15 +5090,7 @@ static bool is_pfn_range_shared(kvm_pfn_t start, kvm= _pfn_t end) return true; } =20 -static u8 max_level_for_order(int order) -{ - if (order >=3D KVM_HPAGE_GFN_SHIFT(PG_LEVEL_2M)) - return PG_LEVEL_2M; - - return PG_LEVEL_4K; -} - -static bool is_large_rmp_possible(struct kvm *kvm, kvm_pfn_t pfn, int orde= r) +static bool is_large_rmp_possible(kvm_pfn_t pfn, kvm_pfn_t nr_pages) { kvm_pfn_t pfn_aligned =3D ALIGN_DOWN(pfn, PTRS_PER_PMD); =20 @@ -5107,14 +5099,14 @@ static bool is_large_rmp_possible(struct kvm *kvm, = kvm_pfn_t pfn, int order) * PFN is currently shared, then the entire 2M-aligned range can be * set to private via a single 2M RMP entry. */ - if (max_level_for_order(order) > PG_LEVEL_4K && + if (nr_pages >=3D KVM_PAGES_PER_HPAGE(PG_LEVEL_2M) && is_pfn_range_shared(pfn_aligned, pfn_aligned + PTRS_PER_PMD)) return true; =20 return false; } =20 -int sev_gmem_make_private(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int m= ax_order) +int sev_gmem_make_private(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, kvm_p= fn_t nr_pages) { struct kvm_sev_info *sev =3D to_kvm_sev_info(kvm); kvm_pfn_t pfn_aligned; @@ -5125,6 +5117,9 @@ int sev_gmem_make_private(struct kvm *kvm, kvm_pfn_t = pfn, gfn_t gfn, int max_ord if (!sev_snp_guest(kvm)) return 0; =20 + if (WARN_ON_ONCE(nr_pages !=3D 1)) + return -EIO; + rc =3D snp_lookup_rmpentry(pfn, &assigned, &level); if (rc) { pr_err_ratelimited("SEV: Failed to look up RMP entry: GFN %llx PFN %llx = error %d\n", @@ -5133,12 +5128,12 @@ int sev_gmem_make_private(struct kvm *kvm, kvm_pfn_= t pfn, gfn_t gfn, int max_ord } =20 if (assigned) { - pr_debug("%s: already assigned: gfn %llx pfn %llx max_order %d level %d\= n", - __func__, gfn, pfn, max_order, level); + pr_debug("%s: already assigned: gfn %llx pfn %llx nr_pages %llx level %d= \n", + __func__, gfn, pfn, nr_pages, level); return 0; } =20 - if (is_large_rmp_possible(kvm, pfn, max_order)) { + if (is_large_rmp_possible(pfn, nr_pages)) { level =3D PG_LEVEL_2M; pfn_aligned =3D ALIGN_DOWN(pfn, PTRS_PER_PMD); gfn_aligned =3D ALIGN_DOWN(gfn, PTRS_PER_PMD); @@ -5155,8 +5150,8 @@ int sev_gmem_make_private(struct kvm *kvm, kvm_pfn_t = pfn, gfn_t gfn, int max_ord return -EINVAL; } =20 - pr_debug("%s: updated: gfn %llx pfn %llx pfn_aligned %llx max_order %d le= vel %d\n", - __func__, gfn, pfn, pfn_aligned, max_order, level); + pr_debug("%s: updated: gfn %llx pfn %llx pfn_aligned %llx nr_pages %llx l= evel %d\n", + __func__, gfn, pfn, pfn_aligned, nr_pages, level); =20 return 0; } diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h index ad849edcacc7..a327bf751ecd 100644 --- a/arch/x86/kvm/svm/svm.h +++ b/arch/x86/kvm/svm/svm.h @@ -1009,7 +1009,7 @@ int sev_cpu_init(struct svm_cpu_data *sd); int sev_dev_get_attr(u32 group, u64 attr, u64 *val); extern unsigned int max_sev_asid; void sev_handle_rmp_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u64 error_code= ); -int sev_gmem_make_private(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int m= ax_order); +int sev_gmem_make_private(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, kvm_p= fn_t nr_pages); void sev_gmem_make_shared(kvm_pfn_t pfn, kvm_pfn_t nr_pages); void sev_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range *rang= e); int sev_gmem_max_mapping_level(struct kvm *kvm, kvm_pfn_t pfn, bool is_pri= vate); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index e7865b28d37b..511830d1b6f3 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10620,9 +10620,10 @@ bool kvm_arch_supports_gmem_init_shared(struct kvm= *kvm) } =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT -int kvm_arch_gmem_make_private(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, = int max_order) +int kvm_arch_gmem_make_private(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, + kvm_pfn_t nr_pages) { - return kvm_x86_call(gmem_make_private)(kvm, pfn, gfn, max_order); + return kvm_x86_call(gmem_make_private)(kvm, gfn, pfn, nr_pages); } #endif =20 diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 9cf01429281b..97cedf8b89c5 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2581,7 +2581,7 @@ static inline int kvm_gmem_get_pfn(struct kvm *kvm, =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT int kvm_arch_gmem_make_private(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, - int max_order); + kvm_pfn_t nr_pages); #endif =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_POPULATE diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 466f611ad4b7..255860c472ee 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -77,7 +77,7 @@ static int __kvm_gmem_prepare_folio(struct kvm *kvm, stru= ct kvm_memory_slot *slo kvm_pfn_t pfn =3D folio_file_pfn(folio, index); gfn_t gfn =3D slot->base_gfn + index - slot->gmem.pgoff; =20 - return kvm_arch_gmem_make_private(kvm, gfn, pfn, folio_order(folio)); + return kvm_arch_gmem_make_private(kvm, gfn, pfn, folio_nr_pages(folio)); #else return 0; #endif --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:52:35 2026 Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 35D1439D6E5 for ; Thu, 23 Jul 2026 21:08:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840917; cv=none; b=O8IjXDBdzwDxK5ZP9g3ojHrZogSGXoFPLkx0s1msmt1EfjrYl6kOXbTTPjTCTLv8lYS9iLT0e4kVL3vZdWTzH94MwYO+P2uKDUovPCweZDMZisDZrBuMHVFdqXYOjkLTyAa2EUq6ieucwlzrlHaNPaOKWEYprsZXMSuI8TAzsvA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784840917; c=relaxed/simple; bh=Oe1WJ5+lIknvXuN76Ycbl24v1fU74BoK1ZMumedRoYY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=G0G9J2FqZGB6Qh1EcLbtC03kUt1ymWiXhQC2DFG7LdXCEz/zSczJWGtk0hj9HI3AYFonV5jLmTnm041Lkc06409DASdT1w3FDix8B2kC2CA0Yjp5vA2u9yRzyBDULc7kbJPpWKczKRA2SzjNSXJYIKHm4XBdviSK8ttRcukt9J0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=RQ4SYHHy; arc=none smtp.client-ip=209.85.210.200 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="RQ4SYHHy" Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-8486ffba174so1799215b3a.1 for ; Thu, 23 Jul 2026 14:08:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784840903; x=1785445703; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=RCq5ylNViQZe7QiR/An1zWgvOhWD8/7z9Gv+AFo257c=; b=RQ4SYHHyqWE06N5qe2DU/NPcUxoAzKmFlg+yb/LsyplM1/B6UhC4yVRghMyasHOlpU oJjzwjeAa2KQfQRk2fOOeKJJ7JgSJDZ2+aQCES3NumKv2JS/dGE4tZhRJ50I9KLYntDJ NSww/Duj+dS9iwpf6CoVH6kPwcF5ju4x0HQz6c+Bwaf0Kmevp1PWYIFJzdkIhOUQ85DS D7JUMvyWcDBWBd1sGfmYCZBn2+wxycFjyAeYxnsB7TQeouCJBqvxw5G3+p6NqCwPkl57 eVWlVLGcGJGBnXYj400ZiDbD38WEK22uSX8h85GzalKLfXpoqWmAZG3M1EnvUGJb1uIw UiHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784840903; x=1785445703; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=RCq5ylNViQZe7QiR/An1zWgvOhWD8/7z9Gv+AFo257c=; b=SZ46H6Io7fqm6W/ToPuTtIBAG9zsO6XWAbX0Nc1jDGwzsepsZ9rMqSkA3k9/WXUg9e +PYcD2Uun1B7+wxwLM7Ckjb2L9J62nYKNk/zPFvC5RnsqRvENUd2bpF+wS5iIUFlpuH5 qiOFXvjDFQ/wI00iF2cP4BrRokTacK8KX4lBIIpI3r5Q7fYCwOAHjKkpN3JKnR+lJN8l FJnozQZ1GvI6vGVbzToEwIGBOQ1J/4+ZnXu1UM51wfUm0DdCTRNlG77FhsKrKMJwdfdg bESVdnzaueokUk2bEiKR/eRsvb4HejxSwqNsm7q6F92G0xWzHPi7e24btSt2H9mz2FgL nq0A== X-Forwarded-Encrypted: i=1; AHgh+Rqm0G30sdtYr1BtBIo10P4DckeTe6mscy1t2YkmEKUoaoq2WOlq79nrTOBfCUBDc2gjy635qEoYZvc8eyE=@vger.kernel.org X-Gm-Message-State: AOJu0Yzw5LrMWculLjgJ6Xqy2QxVXJ/OHb8/XpJUxKuAN4RFc8dikZt8 kLlNHoN6G48ZA9dK4/v2BYh0Rat8DvUbP9NSzbVkieSRG6oJHQq+Hl+cVmJuR3JFG6LhJsujVz6 eRzM4Dw== X-Received: from pfbhm24.prod.google.com ([2002:a05:6a00:6718:b0:847:9805:8254]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:390f:b0:845:d274:bf88 with SMTP id d2e1a72fcca58-84e2bb37181mr5398153b3a.49.1784840902783; Thu, 23 Jul 2026 14:08:22 -0700 (PDT) Reply-To: Sean Christopherson Date: Thu, 23 Jul 2026 14:08:11 -0700 In-Reply-To: <20260723210811.72720-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260723210811.72720-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Message-ID: <20260723210811.72720-10-seanjc@google.com> Subject: [PATCH v6 9/9] KVM: guest_memfd: Make private exactly what can be mapped on page fault From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng , Xiaoyao Li , Michael Roth , Fuad Tabba Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When calling into arch code to make the underlying memory private, i.e. to assign memory to the VM in SNP's RMP table, assign/convert *exactly* the range of memory that can be mapped into the guest for the current page fault, instead of aggressively converting/assigning the entire folio. For SNP, the mapping size in the stage-2 page tables (Nested Page Tables, NPT) must be at least the size of the corresponding RMP entry, e.g. assigning a 2MiB mapping in the RMP when it can only be mapped at 4KiB granualarity will ultimate result in another page fault (#NPF for SNP) to "smash" the RMP down to the correct mapping size. Assigning the entire folio was necessary back when guest_memfd tracked preparedness, which was done on a per-folio basis. At the time, it made sense to do per-folio tracking/preparation, because tracking per-folio meant guest_memfd didn't need to add a separate data structure to track that information, and doing per-folio tracking only works if the entire folio is prepared (or not). Now that guest_memfd no longer does preparation tracking (see commit 8622ef05709f ("KVM: guest_memfd: Remove preparation tracking")), in favor having SNP query the RMP, per-folio preparation, i.e. per-folio conversions to private, doesn't make any sense. *If* SNP allowed the RMP size to be greater than the NPT size, then per-folio conversion could theoretically provide marginal value, as it would allow KVM to assign a hugepage in the RMP even if it can only be mapped into the NPT with a smaller page, e.g. because of memslot alignment. The documentation of that reasoning would be something like this: /* * If the memory is private from KVM's perspective, and hardware tracks * VM-assigned private memory in a dedicated data structure, i.e. not * in the stage-2 page tables, then call into arch code to assign the * entire folio to the guest. Assigning the entire folio, e.g. instead * of only the memory being mapped into the guest, allows KVM to assign * an entire hugepage of memory in the out-of-band structure even if * KVM can only map a smaller page size into the MMU, e.g. because the * gmem hugepage is spread across multiple memslots. */ But even *if* a future SNP implementation supported that behavior, the value added would be dubious, as having a huge folio that is fully private, but can only be mapped at a smaller granularity, would be rare. E.g. maybe for memory at the top of lower DRAM that has holes for non-RAM assets? So, convert/assign exactly what guest_memfd allows the caller to map to simplify the guest_memfd code and provide a (super) minor performance optimization for SNP. E.g. once hugepage support comes along, guest_memfd will only need a single flow to compute "how much memory can be assigned and at what size". Signed-off-by: Sean Christopherson --- virt/kvm/guest_memfd.c | 53 ++++++------------------------------------ 1 file changed, 7 insertions(+), 46 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 255860c472ee..0bca42a0b346 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -70,50 +70,6 @@ static bool kvm_gmem_is_shared_mem(struct inode *inode, = pgoff_t index) return !kvm_gmem_is_private_mem(inode, index); } =20 -static int __kvm_gmem_prepare_folio(struct kvm *kvm, struct kvm_memory_slo= t *slot, - pgoff_t index, struct folio *folio) -{ -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT - kvm_pfn_t pfn =3D folio_file_pfn(folio, index); - gfn_t gfn =3D slot->base_gfn + index - slot->gmem.pgoff; - - return kvm_arch_gmem_make_private(kvm, gfn, pfn, folio_nr_pages(folio)); -#else - return 0; -#endif -} - -/* - * Process @folio, which contains @gfn, so that the guest can use it. - * The folio must be locked and the gfn must be contained in @slot. - * On successful return the guest sees a zero page so as to avoid - * leaking host data and the up-to-date flag is set. - */ -static int kvm_gmem_prepare_folio(struct kvm *kvm, struct kvm_memory_slot = *slot, - gfn_t gfn, struct folio *folio) -{ - pgoff_t index; - - /* - * Preparing huge folios should always be safe, since it should - * be possible to split them later if needed. - * - * Right now the folio order is always going to be zero, but the - * code is ready for huge folios. The only assumption is that - * the base pgoff of memslots is naturally aligned with the - * requested page order, ensuring that huge folios can also use - * huge page table entries for GPA->HPA mapping. - * - * The order will be passed when creating the guest_memfd, and - * checked when creating memslots. - */ - WARN_ON(!IS_ALIGNED(slot->gmem.pgoff, folio_nr_pages(folio))); - index =3D kvm_gmem_get_index(slot, gfn); - index =3D ALIGN_DOWN(index, folio_nr_pages(folio)); - - return __kvm_gmem_prepare_folio(kvm, slot, index, folio); -} - /* * Returns a locked folio on success. The caller is responsible for * setting the up-to-date flag before the memory is mapped into the guest. @@ -799,7 +755,9 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory= _slot *slot, { pgoff_t index =3D kvm_gmem_get_index(slot, gfn); struct folio *folio; - int r =3D 0; + int r =3D 0, __order; + + max_order =3D max_order ?: &__order; =20 CLASS(gmem_get_file, file)(slot); if (!file) @@ -814,8 +772,11 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memor= y_slot *slot, folio_mark_uptodate(folio); } =20 +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT if (kvm_gmem_is_private_mem(file_inode(file), index)) - r =3D kvm_gmem_prepare_folio(kvm, slot, gfn, folio); + r =3D kvm_arch_gmem_make_private(kvm, gfn, *pfn, + (kvm_pfn_t)1 << *max_order); +#endif =20 folio_unlock(folio); =20 --=20 2.55.0.229.g6434b31f56-goog