Re: 2.6.35-rc1 regression with pvclock and smp guests

Marcelo Tosatti
2010-10-08T22:07:01Z

[-- Attachment #1: Type: text/plain, Size: 1306 bytes --]

On Thu, Oct 07, 2010 at 04:47:11PM -1000, Zachary Amsden wrote:
> On 10/07/2010 02:12 PM, Arjan Koers wrote:
> >On 2010-10-03 01:42, Zachary Amsden wrote:
> >...
> >>Umm... do you guys have this commit? This is supposed to address the
> >>issue where the guest keeps resetting the TSC. A guest which does that
> >>will break kvmclock. It only happens on SMP, and it's much worse on AMD
> >>CPUs...
> >>
> >>sound like your scenario.
> >>
> >>commit bd59fc8ff95126f27b7a0df1b6cc602aa428812d
> >>Author: Zachary Amsden<zamsden@redhat.com>
> >>Date: Thu Aug 19 22:07:26 2010 -1000
> >
> >This commit fixes the problem:
> >
> >commit aad07c4f92bae2edaa42bcef84c2afdd0d082458
> >Author: Zachary Amsden<zamsden@redhat.com>
> >Date: Thu Aug 19 22:07:19 2010 -1000
> >
> > KVM: x86: Move TSC reset out of vmcb_init
> >
> > The VMCB is reset whenever we receive a startup IPI, so Linux is setting
> > TSC back to zero happens very late in the boot process and destabilizing
> > the TSC. Instead, just set TSC to zero once at VCPU creation time.
> >
> > Why the separate patch? So git-bisect is your friend.
>
> Okay, apparently I need to go poke around 2.6.35 and see what
> patches made it there and what patches didn't.

Backports attached. Michael, Arjan, please give them a try.

[-- Attachment #2: 001-kvm-x86-fix-svm-reset --]
[-- Type: text/plain, Size: 867 bytes --]

commit 280372e494634d0a2cba3956721be16fc4f989bf
Author: Zachary Amsden <zamsden@redhat.com>
Date: Thu Aug 19 22:07:18 2010 -1000

KVM: x86: Fix SVM VMCB reset

On reset, VMCB TSC should be set to zero. Instead, code was setting
tsc_offset to zero, which passes through the underlying TSC.

Signed-off-by: Zachary Amsden <zamsden@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Index: kvm/arch/x86/kvm/svm.c
===================================================================
--- kvm.orig/arch/x86/kvm/svm.c
+++ kvm/arch/x86/kvm/svm.c
@@ -766,7 +766,7 @@ static void init_vmcb(struct vcpu_svm *s

control->iopm_base_pa = iopm_base;
control->msrpm_base_pa = __pa(svm->msrpm);
- control->tsc_offset = 0;
+ control->tsc_offset = 0-native_read_tsc();
control->int_ctl = V_INTR_MASKING_MASK;

init_seg(&save->es);

[-- Attachment #3: 002-kvm-x86-move-tsc-reset-out-of-vmcb-init --]
[-- Type: text/plain, Size: 1247 bytes --]

commit aad07c4f92bae2edaa42bcef84c2afdd0d082458
Author: Zachary Amsden <zamsden@redhat.com>
Date: Thu Aug 19 22:07:19 2010 -1000

KVM: x86: Move TSC reset out of vmcb_init

The VMCB is reset whenever we receive a startup IPI, so Linux is setting
TSC back to zero happens very late in the boot process and destabilizing
the TSC. Instead, just set TSC to zero once at VCPU creation time.

Why the separate patch? So git-bisect is your friend.

Signed-off-by: Zachary Amsden <zamsden@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Index: kvm/arch/x86/kvm/svm.c
===================================================================
--- kvm.orig/arch/x86/kvm/svm.c
+++ kvm/arch/x86/kvm/svm.c
@@ -766,7 +766,6 @@ static void init_vmcb(struct vcpu_svm *s

control->iopm_base_pa = iopm_base;
control->msrpm_base_pa = __pa(svm->msrpm);
- control->tsc_offset = 0-native_read_tsc();
control->int_ctl = V_INTR_MASKING_MASK;

init_seg(&save->es);
@@ -902,6 +901,7 @@ static struct kvm_vcpu *svm_create_vcpu(
svm->vmcb_pa = page_to_pfn(page) << PAGE_SHIFT;
svm->asid_generation = 0;
init_vmcb(svm);
+ svm->vmcb->control.tsc_offset = 0-native_read_tsc();

err = fx_init(&svm->vcpu);
if (err)