From: Zachary Amsden <zamsden@redhat.com>
To: KVM <kvm@vger.kernel.org>, Avi Kivity <avi@redhat.com>,
Marcelo Tosatti <mtosatti@redhat.com>,
Glauber Costa <glommer@redhat.com>
Cc: Linux-kernel <linux-kernel@vger.kernel.org>,
Zachary Amsden <zamsden@redhat.com>
Subject: [PATCH 10/18] Keep SMP VMs more in sync on unstable TSC
Date: Mon, 12 Jul 2010 16:08:04 -1000 [thread overview]
Message-ID: <1278986892-11733-11-git-send-email-zamsden@redhat.com> (raw)
In-Reply-To: <1278986892-11733-1-git-send-email-zamsden@redhat.com>
SMP VMs on machines with unstable TSC have their TSC offset adjusted by the
local offset delta from last measurement. This does not take into account how
long it has been since the measurement, leading to drift. Minimize the drift
by accounting for any time difference the kernel has observed.
Signed-off-by: Zachary Amsden <zamsden@redhat.com>
---
arch/x86/include/asm/kvm_host.h | 1 +
arch/x86/kvm/x86.c | 8 +++++++-
2 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 324e892..d9e0aa0 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -339,6 +339,7 @@ struct kvm_vcpu_arch {
unsigned int time_offset;
struct page *time_page;
u64 last_host_tsc;
+ u64 last_host_ns;
bool nmi_pending;
bool nmi_injected;
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index ad58c77..dcaece4 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1887,8 +1887,13 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
native_read_tsc() - vcpu->arch.last_host_tsc;
if (tsc_delta < 0)
mark_tsc_unstable("KVM discovered backwards TSC");
- if (check_tsc_unstable())
+ if (check_tsc_unstable()) {
+ /* Subtract elapsed cycle time */
+ u64 ns = !vcpu->arch.last_host_ns ? 0 :
+ get_kernel_ns() - vcpu->arch.last_host_ns;
+ tsc_delta -= nsec_to_cycles(ns);
kvm_x86_ops->adjust_tsc_offset(vcpu, -tsc_delta);
+ }
kvm_migrate_timers(vcpu);
kvm_request_guest_time_update(vcpu);
vcpu->cpu = cpu;
@@ -1900,6 +1905,7 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
kvm_x86_ops->vcpu_put(vcpu);
kvm_put_guest_fpu(vcpu);
vcpu->arch.last_host_tsc = native_read_tsc();
+ vcpu->arch.last_host_ns = get_kernel_ns();
}
static int is_efer_nx(void)
--
1.7.1
next prev parent reply other threads:[~2010-07-13 2:09 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-13 2:07 KVM timekeeping fixes Zachary Amsden
2010-07-13 2:07 ` [PATCH 01/18] Make TSC offset writes non-preemptible Zachary Amsden
2010-07-13 2:07 ` [PATCH 02/18] Fix SVM VMCB reset Zachary Amsden
2010-07-13 2:07 ` [PATCH 03/18] TSC reset compensation Zachary Amsden
2010-07-13 2:07 ` [PATCH 04/18] Robust TSC compensation Zachary Amsden
2010-07-13 2:07 ` [PATCH 05/18] Make cpu_tsc_khz updates use local CPU Zachary Amsden
2010-07-13 2:08 ` [PATCH 06/18] Warn about unstable TSC Zachary Amsden
2010-07-13 2:08 ` [PATCH 07/18] Unify TSC logic Zachary Amsden
2010-07-13 2:08 ` [PATCH 08/18] Fix deep C-state TSC desynchronization Zachary Amsden
2010-07-13 2:08 ` [PATCH 09/18] Add helper functions for time computation Zachary Amsden
2010-07-13 2:08 ` Zachary Amsden [this message]
2010-07-13 2:08 ` [PATCH 11/18] Perform hardware_enable in CPU_STARTING callback Zachary Amsden
2010-07-13 2:08 ` [PATCH 12/18] Add clock sync request to hardware enable Zachary Amsden
2010-07-13 2:08 ` [PATCH 13/18] Move scale_delta into common header Zachary Amsden
2010-07-13 2:08 ` [PATCH 14/18] Fix a possible backwards warp of kvmclock Zachary Amsden
2010-07-13 2:08 ` [PATCH 15/18] Implement getnsboottime kernel API Zachary Amsden
2010-07-13 2:08 ` [PATCH 16/18] Use getnsboottime in KVM Zachary Amsden
2010-07-13 2:08 ` [PATCH 17/18] Indicate reliable TSC in kvmclock Zachary Amsden
2010-07-13 2:08 ` [PATCH 18/18] Add timekeeping documentation Zachary Amsden
-- strict thread matches above, loose matches on Subject: below --
2010-07-13 2:25 KVM timekeeping fixes, V2 Zachary Amsden
2010-07-13 2:25 ` [PATCH 10/18] Keep SMP VMs more in sync on unstable TSC Zachary Amsden
2010-07-15 2:13 ` Rik van Riel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1278986892-11733-11-git-send-email-zamsden@redhat.com \
--to=zamsden@redhat.com \
--cc=avi@redhat.com \
--cc=glommer@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mtosatti@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).