login
Login
/
Register
Search
Search this site:
Forums
News
Blogs
Features
Site
Home
»
Mailing list archives
»
linux-kernel
»
2011
»
January
»
4
Re: [KVM Clock Synchronization 2/4] Keep TSC synchronized across host suspend
view
thread
Previous message: [
thread
] [
date
] [
author
]
Next message: [thread] [
date
] [
author
]
[view in full thread]
From: Marcelo Tosatti
Subject:
Re: [KVM Clock Synchronization 2/4] Keep TSC synchronized across host suspend
Date: Tuesday, January 4, 2011 - 8:36 am
On Tue, Dec 28, 2010 at 07:38:18PM -1000, Zachary Amsden wrote:
quoted text
> During a host suspend, TSC may go backwards, which KVM interprets > as an unstable TSC. Technically, KVM should not be marking the > TSC unstable, which causes the TSC clocksource to go bad, but > should be adjusting the TSC offsets in such a case. > > Signed-off-by: Zachary Amsden <zamsden@redhat.com> > --- > arch/x86/include/asm/kvm_host.h | 1 + > arch/x86/kvm/x86.c | 66 +++++++++++++++++++++++++++++++++++--- > 2 files changed, 61 insertions(+), 6 deletions(-) > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index 9e6fe39..63a82b0 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -386,6 +386,7 @@ struct kvm_vcpu_arch { > u64 last_kernel_ns; > u64 last_tsc_nsec; > u64 last_tsc_write; > + u64 tsc_offset_adjustment; > bool tsc_catchup; > > bool nmi_pending; > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index b9118f4..b509c01 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -2042,12 +2042,20 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) > } > > kvm_x86_ops->vcpu_load(vcpu, cpu); > + > + /* Apply any externally detected TSC adjustments (due to suspend) */ > + if (unlikely(vcpu->arch.tsc_offset_adjustment)) { > + kvm_x86_ops->adjust_tsc_offset(vcpu, > + vcpu->arch.tsc_offset_adjustment); > + vcpu->arch.tsc_offset_adjustment = 0; > + kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu); > + } > 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; > if (tsc_delta < 0) > - mark_tsc_unstable("KVM discovered backwards TSC"); > + WARN_ON(!check_tsc_unstable()); > if (check_tsc_unstable()) { > kvm_x86_ops->adjust_tsc_offset(vcpu, -tsc_delta); > vcpu->arch.tsc_catchup = 1; > @@ -5778,14 +5786,60 @@ int kvm_arch_hardware_enable(void *garbage) > { > struct kvm *kvm; > struct kvm_vcpu *vcpu; > - int i; > + int i, ret; > + u64 local_tsc; > + u64 max_tsc = 0; > + bool stable, backwards_tsc = false; > > kvm_shared_msr_cpu_online(); > - list_for_each_entry(kvm, &vm_list, vm_list) > - kvm_for_each_vcpu(i, vcpu, kvm) > - if (vcpu->cpu == smp_processor_id()) > + local_tsc = native_read_tsc(); > + stable = !check_tsc_unstable(); > + ret = kvm_x86_ops->hardware_enable(garbage); > + if (ret) > + return ret; > + > + list_for_each_entry(kvm, &vm_list, vm_list) { > + kvm_for_each_vcpu(i, vcpu, kvm) { > + if (!stable && vcpu->cpu == smp_processor_id()) > kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu); > - return kvm_x86_ops->hardware_enable(garbage); > + if (stable && vcpu->arch.last_host_tsc > local_tsc) { > + backwards_tsc = true; > + if (vcpu->arch.last_host_tsc > max_tsc) > + max_tsc = vcpu->arch.last_host_tsc; > + } > + } > + } > + > + /* > + * Sometimes, reliable TSCs go backwards. This happens > + * on platforms that reset TSC during suspend or hibernate > + * actions, but maintain synchronization. We must compensate. > + * Unfortunately, we can't bring the TSCs fully up to date > + * with real time. The reason is that we aren't yet far > + * enough into CPU bringup that we know how much real time > + * has actually elapsed; our helper function, get_kernel_ns() > + * will be using boot variables that haven't been updated yet. > + * We simply find the maximum observed TSC above, then record > + * the adjustment to TSC in each VCPU. When the VCPU later > + * gets loaded, the adjustment will be applied. Note that we > + * accumulate adjustments, in case multiple suspend cycles > + * happen before the VCPU gets a chance to run again. > + * > + * Note that unreliable TSCs will be compensated already by > + * the logic in vcpu_load, which sets the TSC to catchup mode. > + * This will catchup all VCPUs to real time, but cannot > + * guarantee synchronization. > + */ > + if (backwards_tsc) { > + u64 delta_cyc = max_tsc - local_tsc; > + list_for_each_entry(kvm, &vm_list, vm_list) > + kvm_for_each_vcpu(i, vcpu, kvm) { > + vcpu->arch.tsc_offset_adjustment += delta_cyc; > + vcpu->arch.last_host_tsc = 0; > + } > + } > + > + return 0; > }
Wouldnt it be simpler to use cyc2ns_offset (or something equivalent)? In any case, you forgot to compare smp_processor_id. --
unsubscribe notice
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to
majordomo@vger.kernel.org
More majordomo info at
http://vger.kernel.org/majordomo-info.html
Please read the FAQ at
http://www.tux.org/lkml/
Previous message: [
thread
] [
date
] [
author
]
Next message: [thread] [
date
] [
author
]
Messages in current thread:
[KVM Clock Synchronization 2/4] Keep TSC synchronized acro ...
, Zachary Amsden
, (Tue Dec 28, 10:38 pm)
Re: [KVM Clock Synchronization 2/4] Keep TSC synchronized ...
, Marcelo Tosatti
, (Tue Jan 4, 8:36 am)
Navigation
Mailing list archives
Recent posts
Popular discussions
linux-kernel
:
Mel Gorman
Re: [PATCH 1/4] vmstat: remove zone->lock from walk_zones_in_node
Guenter Roeck
Re: [lm-sensors] Location for thermal drivers
David Woodhouse
Re: RFC: Moving firmware blobs out of the kernel.
Siddha, Suresh B
Re: [PATCH 2.6.21 review I] [11/25] x86: default to physical mode on hotplug CPU k...
Peter Zijlstra
Re: [patch 4/6] mm: merge populate and nopage into fault (fixes nonlinear)
git-commits-head
:
Linux Kernel Mailing List
[MIPS] Fix potential latency problem due to non-atomic cpu_wait.
Linux Kernel Mailing List
USB: rename USB_SPEED_VARIABLE to USB_SPEED_WIRELESS
Linux Kernel Mailing List
lib/vsprintf.c: fix bug omitting minus sign of numbers (module_param)
Linux Kernel Mailing List
[Bluetooth] Initiate authentication during connection establishment
Linux Kernel Mailing List
[POWERPC] 4xx: Add ppc40x_defconfig
linux-netdev
:
MERCEDES
Your mail id has won 950,000.00 in the MERCEDES Benz Online Promo.for claims send:
David Miller
Re: [PATCH] xen/netfront: do not mark packets of length < MSS as GSO
David Miller
Re: skb_segment() questions
Shan Wei
[RFC PATCH net-next 2/5]IPv6:netfilter: Send an ICMPv6 "Fragment Reassembly Timeou...
Stanislaw Gruszka
[PATCH 1/4] bnx2x: use smp_mb() to keep ordering of read write operations
git
:
Nicolas Sebrecht
git-svn died of signal 11 (was "3 failures on test t9100 (svn)")
Junio C Hamano
Re: [PATCH 2/2] Add url.<base>.pushInsteadOf: URL rewriting for push only
Martin Langhoff
Re: [PATCH] GIT commit statistics.
Alexandre Julliard
[PATCH] gitweb: Put back shortlog instead of graphiclog in the project list.
Josh Triplett
[PATCH 2/2] Add url.<base>.pushInsteadOf: URL rewriting for push only
openbsd-misc
:
Taisto Qvist XX
Re: AMD GEODE LX-800 just works with kernel from install42.iso and kernelpanics wi...
Nico Meijer
Re: gOS Develop Kit with VIA pc-1 Processor Platform VIA C7-D
Andreas Bihlmaier
Re: jetway board sensors (Fintek F71805F)
admin
Drive a 2009 car from R799p/m
Antti Harri
Re: how to create a sha256 hash
Colocation donated by:
Syndicate