On Tue, Aug 27, 2013 at 11:55:29PM -0300, Marcelo Tosatti wrote: > > The offset to add to the hosts monotonic time, kvmclock_offset, is > calculated against the monotonic time at KVM_SET_CLOCK ioctl time. > > Request a master clock update at this time, to reduce a potentially > unbounded difference between the values of the masterclock and > the clock value used to calculate kvmclock_offset. > > Signed-off-by: Marcelo Tosatti <mtosatti@xxxxxxxxxx> > Applied, thanks. > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index d21bce5..0a93354 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -1457,6 +1457,29 @@ static void pvclock_update_vm_gtod_copy(struct kvm *kvm) > #endif > } > > +static void kvm_gen_update_masterclock(struct kvm *kvm) > +{ > +#ifdef CONFIG_X86_64 > + int i; > + struct kvm_vcpu *vcpu; > + struct kvm_arch *ka = &kvm->arch; > + > + spin_lock(&ka->pvclock_gtod_sync_lock); > + kvm_make_mclock_inprogress_request(kvm); > + /* no guest entries from this point */ > + pvclock_update_vm_gtod_copy(kvm); > + > + kvm_for_each_vcpu(i, vcpu, kvm) > + set_bit(KVM_REQ_CLOCK_UPDATE, &vcpu->requests); > + > + /* guest entries allowed */ > + kvm_for_each_vcpu(i, vcpu, kvm) > + clear_bit(KVM_REQ_MCLOCK_INPROGRESS, &vcpu->requests); > + > + spin_unlock(&ka->pvclock_gtod_sync_lock); > +#endif > +} > + > static int kvm_guest_time_update(struct kvm_vcpu *v) > { > unsigned long flags, this_tsc_khz; > @@ -3806,6 +3829,7 @@ long kvm_arch_vm_ioctl(struct file *filp, > delta = user_ns.clock - now_ns; > local_irq_enable(); > kvm->arch.kvmclock_offset = delta; > + kvm_gen_update_masterclock(kvm); > break; > } > case KVM_GET_CLOCK: { > @@ -5689,29 +5713,6 @@ static void process_nmi(struct kvm_vcpu *vcpu) > kvm_make_request(KVM_REQ_EVENT, vcpu); > } > > -static void kvm_gen_update_masterclock(struct kvm *kvm) > -{ > -#ifdef CONFIG_X86_64 > - int i; > - struct kvm_vcpu *vcpu; > - struct kvm_arch *ka = &kvm->arch; > - > - spin_lock(&ka->pvclock_gtod_sync_lock); > - kvm_make_mclock_inprogress_request(kvm); > - /* no guest entries from this point */ > - pvclock_update_vm_gtod_copy(kvm); > - > - kvm_for_each_vcpu(i, vcpu, kvm) > - set_bit(KVM_REQ_CLOCK_UPDATE, &vcpu->requests); > - > - /* guest entries allowed */ > - kvm_for_each_vcpu(i, vcpu, kvm) > - clear_bit(KVM_REQ_MCLOCK_INPROGRESS, &vcpu->requests); > - > - spin_unlock(&ka->pvclock_gtod_sync_lock); > -#endif > -} > - > static void vcpu_scan_ioapic(struct kvm_vcpu *vcpu) > { > u64 eoi_exit_bitmap[4]; > -- Gleb. -- 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