On Mon, 31 Aug 2026 at 01:25, Ackerley Tng via B4 Relay <[email protected]> wrote: > > From: Sean Christopherson <[email protected]> > > Add and use kvm_arch_has_gmem_convert() to guard guest_memfd's invocation > of arch hooks related to converting memory between private and shared, as > only one half of the x86 CoCo duo needs the runtime hooks (any pre-work is > pure overhead for TDX). At this exact moment, the overhead is negligible, > but that will change when in-place conversion comes along, at which point > to-shared conversions will "need" to find all affected folios prior to > calling into arch code. In quotes because very technically that work could > be pushed to arch code, but that would bleed guest_memfd details into arch > code and would be far worse than adding yet another kvm_arch_has... hook. > > Opportunistically provide the kvm_arch_gmem_make_private() declaration, and > rely on dead-code elimination to eliminate the call to non-existent code > when CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT=n. > > Reported-by: Binbin Wu <[email protected]> > Closes: > https://lore.kernel.org/all/[email protected] > Suggested-by: Ackerley Tng <[email protected]> > Signed-off-by: Sean Christopherson <[email protected]> > Signed-off-by: Ackerley Tng <[email protected]>
Reviewed-by: Fuad Tabba <[email protected]> Cheers, /fuad > --- > arch/x86/include/asm/kvm_host.h | 3 +++ > include/linux/kvm_host.h | 3 ++- > virt/kvm/guest_memfd.c | 5 ++--- > 3 files changed, 7 insertions(+), 4 deletions(-) > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index 683bb8bf43a94..6beddd8a0c749 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -1854,6 +1854,9 @@ enum kvm_intr_type { > #ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES > #define kvm_arch_has_private_mem(kvm) ((kvm)->arch.has_private_mem) > #endif > +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT > +#define kvm_arch_has_gmem_convert() (!!kvm_x86_ops.gmem_make_private) > +#endif > > #define kvm_arch_has_readonly_mem(kvm) (!(kvm)->arch.has_protected_state) > > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > index 502465119ca0c..b7516e19ef419 100644 > --- a/include/linux/kvm_host.h > +++ b/include/linux/kvm_host.h > @@ -2597,9 +2597,10 @@ static inline int kvm_gmem_get_pfn(struct kvm *kvm, > } > #endif /* CONFIG_KVM_GUEST_MEMFD */ > > -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT > int kvm_arch_gmem_make_private(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, > kvm_pfn_t nr_pages); > +#ifndef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT > +#define kvm_arch_has_gmem_convert() false > #endif > > #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_POPULATE > diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c > index 798d91df69537..2190e4d6b6bea 100644 > --- a/virt/kvm/guest_memfd.c > +++ b/virt/kvm/guest_memfd.c > @@ -772,11 +772,10 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct > kvm_memory_slot *slot, > folio_mark_uptodate(folio); > } > > -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT > - if (kvm_gmem_is_private_mem(file_inode(file), index)) > + if (kvm_arch_has_gmem_convert() && > + kvm_gmem_is_private_mem(file_inode(file), index)) > r = kvm_arch_gmem_make_private(kvm, gfn, *pfn, > (kvm_pfn_t)1 << *max_order); > -#endif > > folio_unlock(folio); > folio_put(folio); > > -- > 2.55.0.897.gb25b4bd76c-goog > >
