Re: KVM: x86: disable master clock if TSC is reset during suspend (v3)

Alexander Graf
2014-05-21T08:26:01Z

On 14.05.14 18:00, Paolo Bonzini wrote:
> Il 14/05/2014 17:43, Marcelo Tosatti ha scritto:
>>
>> Updating system_time from the kernel clock once master clock
>> has been enabled can result in time backwards event, in case
>> kernel clock frequency is lower than TSC frequency.
>>
>> Disable master clock in case its necessary to update it
>> from the resume path.
>>
>> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
>>
>> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
>> index de0931c..c098728 100644
>> --- a/arch/x86/kvm/x86.c
>> +++ b/arch/x86/kvm/x86.c
>> @@ -106,6 +106,8 @@ EXPORT_SYMBOL_GPL(kvm_max_guest_tsc_khz);
>> static u32 tsc_tolerance_ppm = 250;
>> module_param(tsc_tolerance_ppm, uint, S_IRUGO | S_IWUSR);
>>
>> +static bool backwards_tsc_observed = false;
>> +
>> #define KVM_NR_SHARED_MSRS 16
>>
>> struct kvm_shared_msrs_global {
>> @@ -1471,7 +1473,8 @@ static void pvclock_update_vm_gtod_copy(struct
>> kvm *kvm)
>> &ka->master_kernel_ns,
>> &ka->master_cycle_now);
>>
>> - ka->use_master_clock = host_tsc_clocksource & vcpus_matched;
>> + ka->use_master_clock = host_tsc_clocksource && vcpus_matched
>> + && !backwards_tsc_observed;
>>
>> if (ka->use_master_clock)
>> atomic_set(&kvm_guest_has_master_clock, 1);
>> @@ -6939,6 +6942,7 @@ int kvm_arch_hardware_enable(void *garbage)
>> */
>> if (backwards_tsc) {
>> u64 delta_cyc = max_tsc - local_tsc;
>> + backwards_tsc_observed = true;
>> list_for_each_entry(kvm, &vm_list, vm_list) {
>> kvm_for_each_vcpu(i, vcpu, kvm) {
>> vcpu->arch.tsc_offset_adjustment += delta_cyc;
>>
>
> Applying to kvm/master, thanks.

Thanks. Can you please make sure to CC qemu-stable when sending a pull
request?

Alex