• Philipp Hahn's avatar
    KVM: x86: Reset tsc_timestamp on TSC writes · f8723d91
    Philipp Hahn authored
    There is no upstream commit ID for this patch since it is not a straight
    backport from upstream. It is a fix only relevant to 2.6.32.y.
    
    Since 1d5f066e from 2.6.37 was
    back-ported to 2.6.32.40 as ad2088ca,
    the following patch is needed to add the needed reset logic to 2.6.32 as
    well.
    
    
    Bug #23257: Reset tsc_timestamp on TSC writes
    
    vcpu->last_guest_tsc is updated in vcpu_enter_guest() and kvm_arch_vcpu_put()
    by getting the last value of the TSC from the guest.
    On reset, the SeaBIOS resets the TSC to 0, which triggers a bug on the next
    call to kvm_write_guest_time(): Since vcpu->hw_clock.tsc_timestamp still
    contains the old value before the reset, "max_kernel_ns = vcpu->last_guest_tsc
    - vcpu->hw_clock.tsc_timestamp" gets negative. Since the variable is u64, it
     gets translated to a large positive value.
    
    [9333.197080]
    vcpu->last_guest_tsc        =209_328_760_015           ←
    vcpu->hv_clock.tsc_timestamp=209_328_708_109
    vcpu->last_kernel_ns        =9_333_179_830_643
    kernel_ns                   =9_333_197_073_429
    max_kernel_ns               =9_333_179_847_943         ←
    
    [9336.910995]
    vcpu->last_guest_tsc        =9_438_510_584             ←
    vcpu->hv_clock.tsc_timestamp=211_080_593_143
    vcpu->last_kernel_ns        =9_333_763_732_907
    kernel_ns                   =9_336_910_990_771
    max_kernel_ns               =6_148_296_831_006_663_830 ←
    
    For completeness, here are the values for my 3 GHz CPU:
    vcpu->hv_clock.tsc_shift         =-1
    vcpu->hv_clock.tsc_to_system_mul =2_863_019_502
    
    This makes the guest kernel crawl very slowly when clocksource=kvmclock is
    used: sleeps take way longer than expected and don't match wall clock any more.
    The times printed with printk() don't match real time and the reboot often
    stalls for long times.
    
    In linux-git this isn't a problem, since on every MSR_IA32_TSC write
    vcpu->arch.hv_clock.tsc_timestamp is reset to 0, which disables above logic.
    The code there is only in arch/x86/kvm/x86.c, since much of the kvm-clock
    related code has been refactured for 2.6.37:
    	99e3e30a arch/x86/kvm/x86.c 
            (Zachary Amsden            2010-08-19 22:07:17 -1000 1084)
            vcpu->arch.hv_clock.tsc_timestamp = 0;                                                      
    Signed-off-by: default avatarPhilipp Hahn <hahn@univention.de>
    Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    f8723d91
svm.c 77.2 KB