From: Marcelo Tosatti <mtosatti@redhat.com>
To: Philipp Hahn <hahn@univention.de>
Cc: "Zachary Amsden" <zamsden@redhat.com>, 编码人 <flypen@gmail.com>,
"Xiao Guangrong" <xiaoguangrong@cn.fujitsu.com>,
"Nikola Ciprich" <nikola.ciprich@linuxbox.cz>,
"Michael Tokarev" <mjt@tls.msk.ru>,
kvm@vger.kernel.org, "Avi Kivity" <avi@redhat.com>,
"Glauber Costa" <glommer@redhat.com>,
"Thomas Gleixner" <tglx@linutronix.de>,
"John Stultz" <johnstul@us.ibm.com>
Subject: Re: [BUG, PATCH-2.6.32] Fix a possible backwards warp of kvmclock
Date: Mon, 12 Sep 2011 08:32:22 -0300 [thread overview]
Message-ID: <20110912113222.GA12907@amt.cnet> (raw)
In-Reply-To: <201109051607.02349.hahn@univention.de>
Philipp,
Thanks for debugging this issue. We'll be fowarding the fix
for inclusion in the official 2.6.32 tree.
On Mon, Sep 05, 2011 at 04:06:57PM +0200, Philipp Hahn wrote:
> Hello,
>
> (cc:-ing lost of people who reported similar bugs on kvm-devel)
> > Changing clock in KVM host may cause VM to hang
> > 2.6.32 guest with paravirt clock enabled hangs on 2.6.37.6 host (w
> qemu-kvm-0.13.0)
>
> I found a bug regarding PV-clock in the KVM-kernel module. The attached patch
> solves the problem of the guest being very slow after a reboot. Can you
> please have a look and give it a try to see if it solves your problem as
> well.
>
> Since the fix is only relevant for the stable 2.6.32 tree, where the code is
> quiet different, please have a look and forward to stable@ as appropriate.
>
> Sincerely
> Philipp
>
> PS: This bug is tracked in our German Bugzilla at
> <https://forge.univention.org/bugzilla/show_bug.cgi?id=23258>
> --
> Philipp Hahn Open Source Software Engineer hahn@univention.de
> Univention GmbH Linux for Your Business fon: +49 421 22 232- 0
> Mary-Somerville-Str.1 D-28359 Bremen fax: +49 421 22 232-99
> http://www.univention.de/
> ----------------------------------------------------------------------------
> Treffen Sie Univention auf der IT&Business vom 20. bis 22. September 2011
> auf dem Gemeinschaftsstand der Open Source Business Alliance in Stuttgart in
> Halle 3 Stand 3D27-7.
> Bug #23257: Reset tsc_timestamp on TSC writes
>
> vcpu->last_guest_tsc is updated in vcpu_enter_guest() and kvm_arch_vcpu_put()
> by getting the last value of the TSC from the guest.
> On reset, the SeaBIOS resets the TSC to 0, which triggers a bug on the next
> call to kvm_write_guest_time(): Since vcpu->hw_clock.tsc_timestamp still
> contains the old value before the reset, "max_kernel_ns = vcpu->last_guest_tsc
> - vcpu->hw_clock.tsc_timestamp" gets negative. Since the variable is u64, it
> gets translated to a large positive value.
>
> [9333.197080]
> vcpu->last_guest_tsc =209_328_760_015 ←
> vcpu->hv_clock.tsc_timestamp=209_328_708_109
> vcpu->last_kernel_ns =9_333_179_830_643
> kernel_ns =9_333_197_073_429
> max_kernel_ns =9_333_179_847_943 ←
>
> [9336.910995]
> vcpu->last_guest_tsc =9_438_510_584 ←
> vcpu->hv_clock.tsc_timestamp=211_080_593_143
> vcpu->last_kernel_ns =9_333_763_732_907
> kernel_ns =9_336_910_990_771
> max_kernel_ns =6_148_296_831_006_663_830 ←
>
> For completeness, here are the values for my 3 GHz CPU:
> vcpu->hv_clock.tsc_shift =-1
> vcpu->hv_clock.tsc_to_system_mul =2_863_019_502
>
> This makes the guest kernel crawl very slowly when clocksource=kvmclock is
> used: sleeps take way longer than expected and don't match wall clock any more.
> The times printed with printk() don't match real time and the reboot often
> stalls for long times.
>
> In linux-git this isn't a problem, since on every MSR_IA32_TSC write
> vcpu->arch.hv_clock.tsc_timestamp is reset to 0, which disables above logic.
> The code there is only in arch/x86/kvm/x86.c, since much of the kvm-clock
> related code has been refactured for 2.6.37:
> 99e3e30a arch/x86/kvm/x86.c (Zachary Amsden 2010-08-19 22:07:17 -1000 1084) vcpu->arch.hv_clock.tsc_timestamp = 0;
> Since 1d5f066e0b63271b67eac6d3752f8aa96adcbddb from 2.6.37 was back-ported to
> 2.6.32.40 as ad2088cabe0fd7f633f38ba106025d33ed9a2105, the following patch is
> needed to add the needed reset logic to 2.6.32 as well.
>
> Signed-off-by: Philipp Hahn <hahn@univention.de>
> --- a/arch/x86/kvm/vmx.c 2011-09-05 14:17:54.000000000 +0200
> +++ b/arch/x86/kvm/vmx.c 2011-09-05 14:18:03.000000000 +0200
> @@ -1067,6 +1067,7 @@ static int vmx_set_msr(struct kvm_vcpu *
> case MSR_IA32_TSC:
> rdtscll(host_tsc);
> guest_write_tsc(data, host_tsc);
> + vcpu->arch.hv_clock.tsc_timestamp = 0;
> break;
> case MSR_IA32_CR_PAT:
> if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) {
> --- a/arch/x86/kvm/svm.c 2011-09-05 14:17:57.000000000 +0200
> +++ b/arch/x86/kvm/svm.c 2011-09-05 14:18:00.000000000 +0200
> @@ -2256,6 +2256,7 @@ static int svm_set_msr(struct kvm_vcpu *
> }
>
> svm->vmcb->control.tsc_offset = tsc_offset + g_tsc_offset;
> + vcpu->arch.hv_clock.tsc_timestamp = 0;
>
> break;
> }
next prev parent reply other threads:[~2011-09-12 12:20 UTC|newest]
Thread overview: 107+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-20 8:07 KVM timekeeping and TSC virtualization Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 01/35] Drop vm_init_tsc Zachary Amsden
2010-08-20 16:54 ` Glauber Costa
2010-08-20 8:07 ` [KVM timekeeping 02/35] Convert TSC writes to TSC offset writes Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 03/35] Move TSC offset writes to common code Zachary Amsden
2010-08-20 17:06 ` Glauber Costa
2010-08-24 0:51 ` Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 04/35] Fix SVM VMCB reset Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 05/35] Move TSC reset out of vmcb_init Zachary Amsden
2010-08-20 17:08 ` Glauber Costa
2010-08-24 0:52 ` Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 06/35] TSC reset compensation Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 07/35] Make cpu_tsc_khz updates use local CPU Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 08/35] Warn about unstable TSC Zachary Amsden
2010-08-20 17:28 ` Glauber Costa
2010-08-24 0:56 ` Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 09/35] Unify TSC logic Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 10/35] Fix deep C-state TSC desynchronization Zachary Amsden
2010-08-20 17:30 ` Glauber Costa
2010-09-14 9:10 ` Jan Kiszka
2010-09-14 9:27 ` Avi Kivity
2010-09-14 10:40 ` Jan Kiszka
2010-09-14 10:47 ` Avi Kivity
2010-09-14 19:32 ` Zachary Amsden
2010-09-14 22:26 ` Jan Kiszka
2010-09-14 23:40 ` Zachary Amsden
2010-09-15 5:34 ` Jan Kiszka
2010-09-15 7:55 ` Avi Kivity
2010-09-15 8:04 ` Jan Kiszka
2010-09-15 12:29 ` Glauber Costa
2010-09-15 4:07 ` Zachary Amsden
2010-09-15 8:09 ` Jan Kiszka
2010-09-15 12:32 ` Glauber Costa
2010-09-15 18:27 ` Jan Kiszka
2010-09-17 22:09 ` Zachary Amsden
2010-09-17 22:31 ` Zachary Amsden
2010-09-18 23:53 ` Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 11/35] Add helper functions for time computation Zachary Amsden
2010-08-20 17:34 ` Glauber Costa
2010-08-24 0:58 ` Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 12/35] Robust TSC compensation Zachary Amsden
2010-08-20 17:40 ` Glauber Costa
2010-08-24 1:01 ` Zachary Amsden
2010-08-24 21:33 ` Daniel Verkamp
2010-08-20 8:07 ` [KVM timekeeping 13/35] Perform hardware_enable in CPU_STARTING callback Zachary Amsden
2010-08-27 16:32 ` Jan Kiszka
2010-08-27 23:43 ` Zachary Amsden
2010-08-30 9:10 ` Jan Kiszka
2010-08-20 8:07 ` [KVM timekeeping 14/35] Add clock sync request to hardware enable Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 15/35] Move scale_delta into common header Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 16/35] Fix a possible backwards warp of kvmclock Zachary Amsden
2011-09-02 18:34 ` Philipp Hahn
2011-09-05 14:06 ` [BUG, PATCH-2.6.32] " Philipp Hahn
2011-09-12 11:32 ` Marcelo Tosatti [this message]
2010-08-20 8:07 ` [KVM timekeeping 17/35] Implement getnsboottime kernel API Zachary Amsden
2010-08-20 18:39 ` john stultz
2010-08-20 23:37 ` Zachary Amsden
2010-08-21 0:02 ` john stultz
2010-08-21 0:52 ` Zachary Amsden
2010-08-21 1:04 ` john stultz
2010-08-21 1:22 ` Zachary Amsden
2010-08-27 18:05 ` Jan Kiszka
2010-08-27 23:48 ` Zachary Amsden
2010-08-30 18:07 ` Jan Kiszka
2010-08-20 8:07 ` [KVM timekeeping 18/35] Use getnsboottime in KVM Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 19/35] Add timekeeping documentation Zachary Amsden
2010-08-20 17:50 ` Glauber Costa
2010-08-20 8:07 ` [KVM timekeeping 20/35] Make math work for other scales Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 21/35] Track max tsc_khz Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 22/35] Track tsc last write in vcpu Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 23/35] Set initial TSC rate conversion factors Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 24/35] Timer request function renaming Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 25/35] Add clock catchup mode Zachary Amsden
2010-08-25 17:27 ` Marcelo Tosatti
2010-08-25 20:48 ` Zachary Amsden
2010-08-25 22:01 ` Marcelo Tosatti
2010-08-25 23:38 ` Glauber Costa
2010-08-26 0:17 ` Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 26/35] Catchup slower TSC to guest rate Zachary Amsden
2010-09-07 3:44 ` Dong, Eddie
2010-09-07 3:44 ` Dong, Eddie
2010-09-07 22:14 ` Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 27/35] Add TSC trapping Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 28/35] Unstable TSC write compensation Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 29/35] TSC overrun protection Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 30/35] IOCTL for setting TSC rate Zachary Amsden
2010-08-20 17:56 ` Glauber Costa
2010-08-21 16:11 ` Arnd Bergmann
2010-08-20 8:07 ` [KVM timekeeping 31/35] Exit conditions for TSC trapping Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 32/35] Entry " Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 33/35] Indicate reliable TSC in kvmclock Zachary Amsden
2010-08-20 17:45 ` Glauber Costa
2010-08-24 1:14 ` Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 34/35] Remove dead code Zachary Amsden
2010-08-20 8:07 ` [KVM timekeeping 35/35] Add some debug stuff Zachary Amsden
2010-08-20 13:26 ` KVM timekeeping and TSC virtualization David S. Ahern
2010-08-20 23:24 ` Zachary Amsden
2010-08-22 1:32 ` David S. Ahern
2010-08-24 1:44 ` Zachary Amsden
2010-08-24 3:04 ` David S. Ahern
2010-08-24 5:47 ` Zachary Amsden
2010-08-24 13:32 ` David S. Ahern
2010-08-24 23:01 ` Zachary Amsden
2010-08-25 16:55 ` Marcelo Tosatti
2010-08-25 20:32 ` Zachary Amsden
2010-08-24 22:13 ` Marcelo Tosatti
2010-08-25 4:04 ` Zachary Amsden
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=20110912113222.GA12907@amt.cnet \
--to=mtosatti@redhat.com \
--cc=avi@redhat.com \
--cc=flypen@gmail.com \
--cc=glommer@redhat.com \
--cc=hahn@univention.de \
--cc=johnstul@us.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=mjt@tls.msk.ru \
--cc=nikola.ciprich@linuxbox.cz \
--cc=tglx@linutronix.de \
--cc=xiaoguangrong@cn.fujitsu.com \
--cc=zamsden@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.