From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: KVM: x86: workaround SuSE's 2.6.16 pvclock vs masterclock issue Date: Tue, 20 Jan 2015 20:40:22 +0100 Message-ID: <54BEAF26.8070303@redhat.com> References: <20150120175452.GA32680@amt.cnet> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit To: Marcelo Tosatti , kvm-devel Return-path: Received: from mx1.redhat.com ([209.132.183.28]:41274 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751557AbbATTk1 (ORCPT ); Tue, 20 Jan 2015 14:40:27 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t0KJeQCP004002 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 20 Jan 2015 14:40:26 -0500 In-Reply-To: <20150120175452.GA32680@amt.cnet> Sender: kvm-owner@vger.kernel.org List-ID: On 20/01/2015 18:54, Marcelo Tosatti wrote: > > SuSE's 2.6.16 kernel fails to boot if the delta between tsc_timestamp > and rdtsc is larger than a given threshold: > > * If we get more than the below threshold into the future, we rerequest > * the real time from the host again which has only little offset then > * that we need to adjust using the TSC. > * > * For now that threshold is 1/5th of a jiffie. That should be good > * enough accuracy for completely broken systems, but also give us swing > * to not call out to the host all the time. > */ > #define PVCLOCK_DELTA_MAX ((1000000000ULL / HZ) / 5) > > Disable masterclock support (which increases said delta) in case the > boot vcpu does not use MSR_KVM_SYSTEM_TIME_NEW. Makes sense. Applied to queue, thanks. Paolo > Upstreams kernels which support pvclock vsyscalls (and therefore make > use of PVCLOCK_STABLE_BIT) use MSR_KVM_SYSTEM_TIME_NEW. > > Signed-off-by: Marcelo Tosatti > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index 7c492ed..9a099f6 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -613,6 +613,8 @@ struct kvm_arch { > #ifdef CONFIG_KVM_MMU_AUDIT > int audit_point; > #endif > + > + bool boot_vcpu_runs_old_kvmclock; > }; > > struct kvm_vm_stat { > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index 8f1e22d..1d8a4f6 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -1494,7 +1494,8 @@ static void pvclock_update_vm_gtod_copy(struct kvm *kvm) > &ka->master_cycle_now); > > ka->use_master_clock = host_tsc_clocksource && vcpus_matched > - && !backwards_tsc_observed; > + && !backwards_tsc_observed > + && !ka->boot_vcpu_runs_old_kvmclock; > > if (ka->use_master_clock) > atomic_set(&kvm_guest_has_master_clock, 1); > @@ -2106,8 +2107,20 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) > case MSR_KVM_SYSTEM_TIME_NEW: > case MSR_KVM_SYSTEM_TIME: { > u64 gpa_offset; > + struct kvm_arch *ka = &vcpu->kvm->arch; > + > kvmclock_reset(vcpu); > > + if (vcpu->vcpu_id == 0 && !msr_info->host_initiated) { > + bool tmp = (msr == MSR_KVM_SYSTEM_TIME); > + > + if (ka->boot_vcpu_runs_old_kvmclock != tmp) > + set_bit(KVM_REQ_MASTERCLOCK_UPDATE, > + &vcpu->requests); > + > + ka->boot_vcpu_runs_old_kvmclock = tmp; > + } > + > vcpu->arch.time = data; > kvm_make_request(KVM_REQ_GLOBAL_CLOCK_UPDATE, vcpu); > >