lkml.org 
[lkml]   [2022]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6.0 176/862] KVM: nVMX: Dont propagate vmcs12s PERF_GLOBAL_CTRL settings to vmcs02
    Date
    From: Sean Christopherson <seanjc@google.com>

    commit def9d705c05eab3fdedeb10ad67907513b12038e upstream.

    Don't propagate vmcs12's VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL to vmcs02.
    KVM doesn't disallow L1 from using VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL
    even when KVM itself doesn't use the control, e.g. due to the various
    CPU errata that where the MSR can be corrupted on VM-Exit.

    Preserve KVM's (vmcs01) setting to hopefully avoid having to toggle the
    bit in vmcs02 at a later point. E.g. if KVM is loading PERF_GLOBAL_CTRL
    when running L1, then odds are good KVM will also load the MSR when
    running L2.

    Fixes: 8bf00a529967 ("KVM: VMX: add support for switching of PERF_GLOBAL_CTRL")
    Cc: stable@vger.kernel.org
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
    Link: https://lore.kernel.org/r/20220830133737.1539624-18-vkuznets@redhat.com
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/x86/kvm/vmx/nested.c | 7 ++++++-
    1 file changed, 6 insertions(+), 1 deletion(-)

    --- a/arch/x86/kvm/vmx/nested.c
    +++ b/arch/x86/kvm/vmx/nested.c
    @@ -2328,9 +2328,14 @@ static void prepare_vmcs02_early(struct
    * are emulated by vmx_set_efer() in prepare_vmcs02(), but speculate
    * on the related bits (if supported by the CPU) in the hope that
    * we can avoid VMWrites during vmx_set_efer().
    + *
    + * Similarly, take vmcs01's PERF_GLOBAL_CTRL in the hope that if KVM is
    + * loading PERF_GLOBAL_CTRL via the VMCS for L1, then KVM will want to
    + * do the same for L2.
    */
    exec_control = __vm_entry_controls_get(vmcs01);
    - exec_control |= vmcs12->vm_entry_controls;
    + exec_control |= (vmcs12->vm_entry_controls &
    + ~VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL);
    exec_control &= ~(VM_ENTRY_IA32E_MODE | VM_ENTRY_LOAD_IA32_EFER);
    if (cpu_has_load_ia32_efer()) {
    if (guest_efer & EFER_LMA)

    \
     
     \ /
      Last update: 2022-10-19 10:51    [W:2.579 / U:0.436 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site