lkml.org 
[lkml]   [2010]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 04/18] Robust TSC compensation
    Date
    Make the match of TSC find TSC writes that are close to each other
    instead of perfectly identical; this allows the compensator to also
    work in migration / suspend scenarios.

    Signed-off-by: Zachary Amsden <zamsden@redhat.com>
    ---
    arch/x86/kvm/x86.c | 17 +++++++++++++----
    1 files changed, 13 insertions(+), 4 deletions(-)

    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index bb7451b..1c737b2 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -897,7 +897,11 @@ void guest_write_tsc(struct kvm_vcpu *vcpu, u64 data)
    {
    struct kvm *kvm = vcpu->kvm;
    u64 offset, ns, elapsed;
    +<<<<<<< HEAD
    struct timespec ts;
    +=======
    + s64 sdiff;
    +>>>>>>> db4c819... oops

    spin_lock(&kvm->arch.tsc_write_lock);
    offset = data - native_read_tsc();
    @@ -905,16 +909,21 @@ void guest_write_tsc(struct kvm_vcpu *vcpu, u64 data)
    monotonic_to_bootbased(&ts);
    ns = timespec_to_ns(&ts);
    elapsed = ns - kvm->arch.last_tsc_nsec;
    + sdiff = data - kvm->arch.last_tsc_write;
    + if (sdiff < 0)
    + sdiff = -sdiff;

    /*
    - * Special case: identical write to TSC within 5 seconds of
    + * Special case: close write to TSC within 5 seconds of
    * another CPU is interpreted as an attempt to synchronize
    - * (the 5 seconds is to accomodate host load / swapping).
    + * The 5 seconds is to accomodate host load / swapping as
    + * well as any reset of TSC during the boot process.
    *
    * In that case, for a reliable TSC, we can match TSC offsets,
    - * or make a best guest using kernel_ns value.
    + * or make a best guest using elapsed value.
    */
    - if (data == kvm->arch.last_tsc_write && elapsed < 5ULL * NSEC_PER_SEC) {
    + if (sdiff < nsec_to_cycles(5ULL * NSEC_PER_SEC) &&
    + elapsed < 5ULL * NSEC_PER_SEC) {
    if (!check_tsc_unstable()) {
    offset = kvm->arch.last_tsc_offset;
    pr_debug("kvm: matched tsc offset for %llu\n", data);
    --
    1.7.1


    \
     
     \ /
      Last update: 2010-07-13 04:11    [W:0.028 / U:30.720 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site