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 <mtosatti@xxxxxxxxxx> > > 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); > > -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html