2010-08-20 08:08:18

by Zachary Amsden

[permalink] [raw]
Subject: [KVM timekeeping 05/35] 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 <[email protected]>
---
arch/x86/kvm/svm.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 74e4522..e8bfe8e 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -781,7 +781,6 @@ static void init_vmcb(struct vcpu_svm *svm)

control->iopm_base_pa = iopm_base;
control->msrpm_base_pa = __pa(svm->msrpm);
- kvm_write_tsc(&svm->vcpu, 0);
control->int_ctl = V_INTR_MASKING_MASK;

init_seg(&save->es);
@@ -917,6 +916,7 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id)
svm->vmcb_pa = page_to_pfn(page) << PAGE_SHIFT;
svm->asid_generation = 0;
init_vmcb(svm);
+ kvm_write_tsc(&svm->vcpu, 0);

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


2010-08-20 17:09:00

by Glauber Costa

[permalink] [raw]
Subject: Re: [KVM timekeeping 05/35] Move TSC reset out of vmcb_init

On Thu, Aug 19, 2010 at 10:07:19PM -1000, Zachary Amsden wrote:
> 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 <[email protected]>
Shouldn't we set for whatever value the BSP already has, and then the BSP to
zero? Since vcpus are initialized at different times, this pretty much
guarantees that the guest will have desynchronized tsc at all cases
(not that if it was better before...)

2010-08-24 00:52:52

by Zachary Amsden

[permalink] [raw]
Subject: Re: [KVM timekeeping 05/35] Move TSC reset out of vmcb_init

On 08/20/2010 07:08 AM, Glauber Costa wrote:
> On Thu, Aug 19, 2010 at 10:07:19PM -1000, Zachary Amsden wrote:
>
>> 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<[email protected]>
>>
> Shouldn't we set for whatever value the BSP already has, and then the BSP to
> zero? Since vcpus are initialized at different times, this pretty much
> guarantees that the guest will have desynchronized tsc at all cases
> (not that if it was better before...)
>

Yes, we should - but it takes a lot more machinery to do that, and so it
happens later in the series. You have to match the offsets for the BSP
and other vcpus...