• Leonid Shatz's avatar
    KVM: nVMX/nSVM: Fix bug which sets vcpu->arch.tsc_offset to L1 tsc_offset · 326e7425
    Leonid Shatz authored
    Since commit e79f245d ("X86/KVM: Properly update 'tsc_offset' to
    represent the running guest"), vcpu->arch.tsc_offset meaning was
    changed to always reflect the tsc_offset value set on active VMCS.
    Regardless if vCPU is currently running L1 or L2.
    
    However, above mentioned commit failed to also change
    kvm_vcpu_write_tsc_offset() to set vcpu->arch.tsc_offset correctly.
    This is because vmx_write_tsc_offset() could set the tsc_offset value
    in active VMCS to given offset parameter *plus vmcs12->tsc_offset*.
    However, kvm_vcpu_write_tsc_offset() just sets vcpu->arch.tsc_offset
    to given offset parameter. Without taking into account the possible
    addition of vmcs12->tsc_offset. (Same is true for SVM case).
    
    Fix this issue by changing kvm_x86_ops->write_tsc_offset() to return
    actually set tsc_offset in active VMCS and modify
    kvm_vcpu_write_tsc_offset() to set returned value in
    vcpu->arch.tsc_offset.
    In addition, rename write_tsc_offset() callback to write_l1_tsc_offset()
    to make it clear that it is meant to set L1 TSC offset.
    
    Fixes: e79f245d ("X86/KVM: Properly update 'tsc_offset' to represent the running guest")
    Reviewed-by: default avatarLiran Alon <liran.alon@oracle.com>
    Reviewed-by: default avatarMihai Carabas <mihai.carabas@oracle.com>
    Reviewed-by: default avatarKrish Sadhukhan <krish.sadhukhan@oracle.com>
    Signed-off-by: default avatarLeonid Shatz <leonid.shatz@oracle.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    326e7425
vmx.c 435 KB