From: Joerg R. <joe...@am...> - 2008-05-13 10:11:53
|
On Wed, May 07, 2008 at 05:01:02PM -0500, Ryan Harper wrote: > diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c > index 5528121..c919ddd 100644 > --- a/arch/x86/kvm/svm.c > +++ b/arch/x86/kvm/svm.c > @@ -685,8 +685,14 @@ static void svm_vcpu_load(struct kvm_vcpu *vcpu, int cpu) > * increasing TSC. > */ > rdtscll(tsc_this); > - delta = vcpu->arch.host_tsc - tsc_this; > - svm->vmcb->control.tsc_offset += delta; > + /* we only need to adjust this if the old tsc was ahead > + * also, we'll generate a massively large u64 value if > + * tsc_this is less than host_tsc because of unsigned math > + */ > + if (tsc_this < vcpu->arch.host_tsc) { > + delta = vcpu->arch.host_tsc - tsc_this; > + svm->vmcb->control.tsc_offset += delta; > + } > vcpu->cpu = cpu; > kvm_migrate_apic_timer(vcpu); > } Hmm, I think this can result in inaccurate guest time because it makes the tsc hopping. Does it fix the problem when you make delta an s64? Joerg -- | AMD Saxony Limited Liability Company & Co. KG Operating | Wilschdorfer Landstr. 101, 01109 Dresden, Germany System | Register Court Dresden: HRA 4896 Research | General Partner authorized to represent: Center | AMD Saxony LLC (Wilmington, Delaware, US) | General Manager of AMD Saxony LLC: Dr. Hans-R. Deppe, Thomas McCoy |