From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexander Graf Subject: Re: KVM: x86: disable master clock if TSC is reset during suspend (v3) Date: Wed, 21 May 2014 10:26:00 +0200 Message-ID: <537C6318.7050707@suse.de> References: <20140514072638.GA9285@amt.cnet> <537332D0.1090505@redhat.com> <20140514100636.GB20451@amt.cnet> <537343A7.3030805@redhat.com> <20140514154324.GA29206@amt.cnet> <53739333.3040602@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm-devel To: Paolo Bonzini , Marcelo Tosatti Return-path: Received: from cantor2.suse.de ([195.135.220.15]:39475 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751073AbaEUI0B (ORCPT ); Wed, 21 May 2014 04:26:01 -0400 In-Reply-To: <53739333.3040602@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: 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 >> >> 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