]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
KVM: x86: Fix kvmclock bug
authorZachary Amsden <zamsden@redhat.com>
Wed, 4 May 2011 12:31:29 +0000 (09:31 -0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 9 May 2011 22:55:42 +0000 (15:55 -0700)
(backported from commit 28e4639adf0c9f26f6bb56149b7ab547bf33bb95)

If preempted after kvmclock values are updated, but before hardware
virtualization is entered, the last tsc time as read by the guest is
never set.  It underflows the next time kvmclock is updated if there
has not yet been a successful entry / exit into hardware virt.

Fix this by simply setting last_tsc to the newly read tsc value so
that any computed nsec advance of kvmclock is nulled.

Signed-off-by: Zachary Amsden <zamsden@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
BugLink: http://bugs.launchpad.net/bugs/714335
Signed-off-by: Serge E. Hallyn <serge.hallyn@canonical.com>
Reviewed-by: Stefan Bader <stefan.bader@canonical.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
arch/x86/kvm/x86.c

index 8a10f27233af46d03f814449b703de3f2929c7ed..df1cefb9457d74658782a420408cdb25f102545c 100644 (file)
@@ -694,6 +694,7 @@ static void kvm_write_guest_time(struct kvm_vcpu *v)
        vcpu->hv_clock.tsc_timestamp = tsc_timestamp;
        vcpu->hv_clock.system_time = kernel_ns + v->kvm->arch.kvmclock_offset;
        vcpu->last_kernel_ns = kernel_ns;
+       vcpu->last_guest_tsc = tsc_timestamp;
 
        /*
         * The interface expects us to write an even number signaling that the