lkml.org 
[lkml]   [2015]   [Sep]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.19.y-ckt 050/102] KVM: x86: Use adjustment in guest cycles when handling MSR_IA32_TSC_ADJUST
    Date
    3.19.8-ckt7 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Haozhong Zhang <haozhong.zhang@intel.com>

    commit d7add05458084a5e3d65925764a02ca9c8202c1e upstream.

    When kvm_set_msr_common() handles a guest's write to
    MSR_IA32_TSC_ADJUST, it will calcuate an adjustment based on the data
    written by guest and then use it to adjust TSC offset by calling a
    call-back adjust_tsc_offset(). The 3rd parameter of adjust_tsc_offset()
    indicates whether the adjustment is in host TSC cycles or in guest TSC
    cycles. If SVM TSC scaling is enabled, adjust_tsc_offset()
    [i.e. svm_adjust_tsc_offset()] will first scale the adjustment;
    otherwise, it will just use the unscaled one. As the MSR write here
    comes from the guest, the adjustment is in guest TSC cycles. However,
    the current kvm_set_msr_common() uses it as a value in host TSC
    cycles (by using true as the 3rd parameter of adjust_tsc_offset()),
    which can result in an incorrect adjustment of TSC offset if SVM TSC
    scaling is enabled. This patch fixes this problem.

    Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    arch/x86/kvm/x86.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index a692f1c..57d5915 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -2143,7 +2143,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
    if (guest_cpuid_has_tsc_adjust(vcpu)) {
    if (!msr_info->host_initiated) {
    s64 adj = data - vcpu->arch.ia32_tsc_adjust_msr;
    - kvm_x86_ops->adjust_tsc_offset(vcpu, adj, true);
    + adjust_tsc_offset_guest(vcpu, adj);
    }
    vcpu->arch.ia32_tsc_adjust_msr = data;
    }
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-09-22 20:41    [W:4.682 / U:0.560 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site