KVM: Fix last_guest_tsc / tsc_offset semantics
authorZachary Amsden <zamsden@gmail.com>
Fri, 3 Feb 2012 17:43:53 +0000 (15:43 -0200)
committerAvi Kivity <avi@redhat.com>
Thu, 8 Mar 2012 12:10:05 +0000 (14:10 +0200)
commitb183aa580a3a09b5d79224a9022418508532c778
treedd06dc00d07484797db0bd6bc6955e28f4410fb5
parent4dd7980b21408624e9b6f3df05719c3c61db6e9f
KVM: Fix last_guest_tsc / tsc_offset semantics

The variable last_guest_tsc was being used as an ad-hoc indicator
that guest TSC has been initialized and recorded correctly.  However,
it may not have been, it could be that guest TSC has been set to some
large value, the back to a small value (by, say, a software reboot).

This defeats the logic and causes KVM to falsely assume that the
guest TSC has gone backwards, marking the host TSC unstable, which
is undesirable behavior.

In addition, rather than try to compute an offset adjustment for the
TSC on unstable platforms, just recompute the whole offset.  This
allows us to get rid of one callsite for adjust_tsc_offset, which
is problematic because the units it takes are in guest units, but
here, the computation was originally being done in host units.

Doing this, and also recording last_guest_tsc when the TSC is written
allow us to remove the tricky logic which depended on last_guest_tsc
being zero to indicate a reset of uninitialized value.

Instead, we now have the guarantee that the guest TSC offset is
always at least something which will get us last_guest_tsc.

Signed-off-by: Zachary Amsden <zamsden@gmail.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/x86/kvm/x86.c