Re: [PATCH 61/61] KVM: x86: Move VMX's host_efer to common x86 code

From: Vitaly Kuznetsov
Date: Tue Feb 25 2020 - 10:03:01 EST


Sean Christopherson <sean.j.christopherson@xxxxxxxxx> writes:

> Move host_efer to common x86 code and use it for CPUID's is_efer_nx() to
> avoid constantly re-reading the MSR.
>
> No functional change intended.
>
> Signed-off-by: Sean Christopherson <sean.j.christopherson@xxxxxxxxx>
> ---
> arch/x86/include/asm/kvm_host.h | 2 ++
> arch/x86/kvm/cpuid.c | 5 +----
> arch/x86/kvm/vmx/vmx.c | 3 ---
> arch/x86/kvm/vmx/vmx.h | 1 -
> arch/x86/kvm/x86.c | 5 +++++
> 5 files changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index 4165d3ef11e4..a2a091d328c6 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -1257,6 +1257,8 @@ struct kvm_arch_async_pf {
> bool direct_map;
> };
>
> +extern u64 __read_mostly host_efer;
> +

I'm surprised we don't actually cache MSR_EFER in some common x86 code
already.

> extern struct kvm_x86_ops *kvm_x86_ops;
> extern struct kmem_cache *x86_fpu_cache;
>
> diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
> index 3d287fc6eb6e..e8beb1e542a8 100644
> --- a/arch/x86/kvm/cpuid.c
> +++ b/arch/x86/kvm/cpuid.c
> @@ -134,10 +134,7 @@ int kvm_update_cpuid(struct kvm_vcpu *vcpu)
>
> static int is_efer_nx(void)
> {
> - unsigned long long efer = 0;
> -
> - rdmsrl_safe(MSR_EFER, &efer);
> - return efer & EFER_NX;
> + return host_efer & EFER_NX;
> }
>
> static void cpuid_fix_nx_cap(struct kvm_vcpu *vcpu)
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index e349689ac0cf..0009066e2009 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -433,7 +433,6 @@ static const struct kvm_vmx_segment_field {
> VMX_SEGMENT_FIELD(LDTR),
> };
>
> -u64 host_efer;
> static unsigned long host_idt_base;
>
> /*
> @@ -7577,8 +7576,6 @@ static __init int hardware_setup(void)
> struct desc_ptr dt;
> int r, i, ept_lpage_level;
>
> - rdmsrl_safe(MSR_EFER, &host_efer);
> -
> store_idt(&dt);
> host_idt_base = dt.address;
>
> diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h
> index 70eafa88876a..0e50fbcb8413 100644
> --- a/arch/x86/kvm/vmx/vmx.h
> +++ b/arch/x86/kvm/vmx/vmx.h
> @@ -12,7 +12,6 @@
> #include "vmcs.h"
>
> extern const u32 vmx_msr_index[];
> -extern u64 host_efer;
>
> extern u32 get_umwait_control_msr(void);
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index b40488fd2969..2103101eca78 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -185,6 +185,9 @@ static struct kvm_shared_msrs __percpu *shared_msrs;
> | XFEATURE_MASK_BNDCSR | XFEATURE_MASK_AVX512 \
> | XFEATURE_MASK_PKRU)
>
> +u64 __read_mostly host_efer;
> +EXPORT_SYMBOL_GPL(host_efer);
> +
> static u64 __read_mostly host_xss;
>
> struct kvm_stats_debugfs_item debugfs_entries[] = {
> @@ -9590,6 +9593,8 @@ int kvm_arch_hardware_setup(void)
> {
> int r;
>
> + rdmsrl_safe(MSR_EFER, &host_efer);
> +
> kvm_set_cpu_caps();
>
> r = kvm_x86_ops->hardware_setup();

Reviewed-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx>

--
Vitaly