On 2011-03-25 09:44, Joerg Roedel wrote:
> The calculation of the tsc_delta value to ensure a
> forward-going tsc for the guest is a function of the
> host-tsc. This works as long as the guests tsc_khz is equal
> to the hosts tsc_khz. With tsc-scaling hardware support this
> is not longer true and the tsc_delta needs to be calculated
> using guest_tsc values.
> 
> Signed-off-by: Joerg Roedel <joerg.roe...@amd.com>
> ---
>  arch/x86/kvm/x86.c |    9 +++++++--
>  1 files changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 1e7af86..47dd6ed 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -2126,8 +2126,13 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
>       kvm_x86_ops->vcpu_load(vcpu, cpu);
>       if (unlikely(vcpu->cpu != cpu) || check_tsc_unstable()) {
>               /* Make sure TSC doesn't go backwards */
> -             s64 tsc_delta = !vcpu->arch.last_host_tsc ? 0 :
> -                             native_read_tsc() - vcpu->arch.last_host_tsc;
> +             s64 tsc_delta;
> +             u64 tsc;
> +
> +             kvm_get_msr(vcpu, MSR_IA32_TSC, &tsc);
> +             tsc_delta = !vcpu->arch.last_guest_tsc ? 0 :
> +                          tsc - vcpu->arch.last_guest_tsc;
> +
>               if (tsc_delta < 0)
>                       mark_tsc_unstable("KVM discovered backwards TSC");
>               if (check_tsc_unstable()) {

This patch appears to cause troubles to Linux guests on TSC clocksource
and APIC highres timer. The first boot after qemu start is always fine,
but after a reboot the guest timer appears to fire incorrectly or even
not at all.

Was this patch tested with a guest reboot scenario as well? Does it
account for the TSC being reset to 0 on reboot?

I'm using a 2.6.38 host + kvm-kmod, but I don't see that this could be
the reason. Going back one kernel commit while keeping kvm-kmod
unchanged resolves the issue.

Jan

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to