Re: [PATCH 3/3] KVM: always make in-place conversion a compile-time constant when possible

From: Xiaoyao Li

Date: Wed Oct 21 2026 - 03:07:36 EST


On 10/20/2026 9:14 PM, Paolo Bonzini wrote:
> Remove the unnecessary static call indirection and make
> gmem_in_place_conversion a constant if CONFIG_KVM_PRIVATE_MEMATTR_VM
> is false.
>
> Require that CONFIG_KVM_PRIVATE_MEMATTR_VM is y only if
> kvm_arch_has_private_mem is also defined.

This reads like the patch is going to make such a requirement. However, it doesn't.

> This way, the three
> possible cases can be expressed without nested #ifs.
>
> Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>

Reviewed-by: Xiaoyao Li <xiaoyao.li@xxxxxxxxx>

> ---
> include/linux/kvm_host.h | 13 +++++--------
> virt/kvm/kvm_main.c | 13 +++++++------
> 2 files changed, 12 insertions(+), 14 deletions(-)
>
> diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
> index 09c57d31d153..e7fc94e2910a 100644
> --- a/include/linux/kvm_host.h
> +++ b/include/linux/kvm_host.h
> @@ -2585,15 +2585,7 @@ bool kvm_arch_post_set_vm_memory_attributes(struct kvm *kvm,
> #endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */
>
> #ifdef CONFIG_KVM_PRIVATE_MEMATTR_VM
> -static inline bool kvm_vm_is_private_gfn(struct kvm *kvm, gfn_t gfn)
> -{
> - return kvm_get_vm_memory_attributes(kvm, gfn) & KVM_MEMORY_ATTRIBUTE_PRIVATE;
> -}
> -#endif /* CONFIG_KVM_PRIVATE_MEMATTR_VM */
> -
> -#ifdef kvm_arch_has_private_mem
> extern bool gmem_in_place_conversion;
> -
> typedef bool (kvm_is_private_gfn_t)(struct kvm *kvm, gfn_t gfn);
> DECLARE_STATIC_CALL(__kvm_is_private_gfn, kvm_is_private_gfn_t);
>
> @@ -2601,6 +2593,11 @@ static inline bool kvm_is_private_gfn(struct kvm *kvm, gfn_t gfn)
> {
> return static_call(__kvm_is_private_gfn)(kvm, gfn);
> }
> +
> +#elif defined kvm_arch_has_private_mem
> +#define gmem_in_place_conversion true
> +#define kvm_is_private_gfn kvm_gmem_is_private_gfn
> +
> #else
> #define gmem_in_place_conversion false
>
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index 3e35766f5c7e..a356a29be985 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -104,11 +104,9 @@ EXPORT_SYMBOL_FOR_KVM_INTERNAL(halt_poll_ns_shrink);
> static bool __ro_after_init allow_unsafe_mappings;
> module_param(allow_unsafe_mappings, bool, 0444);
>
> -#ifdef kvm_arch_has_private_mem
> -bool __ro_after_init gmem_in_place_conversion = !IS_ENABLED(CONFIG_KVM_PRIVATE_MEMATTR_VM);
> #ifdef CONFIG_KVM_PRIVATE_MEMATTR_VM
> +bool __ro_after_init gmem_in_place_conversion = false;
> module_param(gmem_in_place_conversion, bool, 0444);
> -#endif
> EXPORT_SYMBOL_FOR_KVM_INTERNAL(gmem_in_place_conversion);
> #endif
>
> @@ -2705,18 +2703,21 @@ static int kvm_vm_ioctl_set_mem_attributes(struct kvm *kvm,
> }
> #endif /* CONFIG_KVM_VM_MEMORY_ATTRIBUTES */
>
> -#ifdef kvm_arch_has_private_mem
> +#ifdef CONFIG_KVM_PRIVATE_MEMATTR_VM
> DEFINE_STATIC_CALL_RET0(__kvm_is_private_gfn, kvm_is_private_gfn_t);
> EXPORT_STATIC_CALL_GPL(__kvm_is_private_gfn);
>
> +static bool kvm_vm_is_private_gfn(struct kvm *kvm, gfn_t gfn)
> +{
> + return kvm_get_vm_memory_attributes(kvm, gfn) & KVM_MEMORY_ATTRIBUTE_PRIVATE;
> +}
> +
> static void kvm_init_memory_attributes(void)
> {
> if (gmem_in_place_conversion)
> static_call_update(__kvm_is_private_gfn, kvm_gmem_is_private_gfn);
> -#ifdef CONFIG_KVM_PRIVATE_MEMATTR_VM
> else
> static_call_update(__kvm_is_private_gfn, kvm_vm_is_private_gfn);
> -#endif
> }
> #else
> static void kvm_init_memory_attributes(void) { }