From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: KVM: x86: disable master clock if TSC is reset during suspend (v3) Date: Wed, 21 May 2014 12:01:24 +0200 Message-ID: <537C7974.8010705@redhat.com> 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> <537C6318.7050707@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm-devel To: Alexander Graf , Marcelo Tosatti Return-path: Received: from mx1.redhat.com ([209.132.183.28]:10710 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751011AbaEUKBc (ORCPT ); Wed, 21 May 2014 06:01:32 -0400 In-Reply-To: <537C6318.7050707@suse.de> Sender: kvm-owner@vger.kernel.org List-ID: Il 21/05/2014 10:26, Alexander Graf ha scritto: > > 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? Now I will. Paolo :)