public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Marcelo Tosatti <mtosatti@redhat.com>
To: Ladi Prosek <lprosek@redhat.com>
Cc: kvm@vger.kernel.org
Subject: Re: [PATCH] KVM: x86: make backwards_tsc_observed a per-VM variable
Date: Thu, 29 Jun 2017 12:59:19 -0300	[thread overview]
Message-ID: <20170629155916.GA6897@amt.cnet> (raw)
In-Reply-To: <20170626075643.14443-1-lprosek@redhat.com>

Hi Ladi,

Can you disable masterclock if suspend-to-RAM is performed, in 
case backwards_tsc_observed was observed for any VM ? 
(which indicates its likely to happen again, backwards TSC). 

Because a backwards TSC event, with masterclock in place, is likely
to cause the guest to see time going backwards.

What masterclock requires is that TSCs are:

	1) In sync across CPUs and TSC clocksource is in use by the host.
	2) kvmclock regions updated on VM-entry, after a suspend from RAM (in case it 
	   goes backwards): kvm_gen_update_masterclock.

Is the first condition met?

On Mon, Jun 26, 2017 at 09:56:43AM +0200, Ladi Prosek wrote:
> The backwards_tsc_observed global introduced in commit 16a9602 is never
> reset to false. If a VM happens to be running while the host is suspended
> (a common source of the TSC jumping backwards), master clock will never
> be enabled again for any VM. In contrast, if no VM is running while the
> host is suspended, master clock is unaffected. This is inconsistent and
> unnecessarily strict. Let's track the backwards_tsc_observed variable
> separately and let each VM start with a clean slate.
> 
> Real world impact: My Windows VMs get slower after my laptop undergoes a
> suspend/resume cycle. The only way to get the perf back is unloading and
> reloading the kvm module.
> 
> Signed-off-by: Ladi Prosek <lprosek@redhat.com>
> ---
>  arch/x86/include/asm/kvm_host.h | 1 +
>  arch/x86/kvm/x86.c              | 6 ++----
>  2 files changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index 695605e..d8259c3 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -799,6 +799,7 @@ struct kvm_arch {
>  	int audit_point;
>  	#endif
>  
> +	bool backwards_tsc_observed;
>  	bool boot_vcpu_runs_old_kvmclock;
>  	u32 bsp_vcpu_id;
>  
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 87d3cb9..8586ec6 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -134,8 +134,6 @@ module_param(lapic_timer_advance_ns, uint, S_IRUGO | S_IWUSR);
>  static bool __read_mostly vector_hashing = true;
>  module_param(vector_hashing, bool, S_IRUGO);
>  
> -static bool __read_mostly backwards_tsc_observed = false;
> -
>  #define KVM_NR_SHARED_MSRS 16
>  
>  struct kvm_shared_msrs_global {
> @@ -1719,7 +1717,7 @@ static void pvclock_update_vm_gtod_copy(struct kvm *kvm)
>  					&ka->master_cycle_now);
>  
>  	ka->use_master_clock = host_tsc_clocksource && vcpus_matched
> -				&& !backwards_tsc_observed
> +				&& !ka->backwards_tsc_observed
>  				&& !ka->boot_vcpu_runs_old_kvmclock;
>  
>  	if (ka->use_master_clock)
> @@ -7827,8 +7825,8 @@ int kvm_arch_hardware_enable(void)
>  	 */
>  	if (backwards_tsc) {
>  		u64 delta_cyc = max_tsc - local_tsc;
> -		backwards_tsc_observed = true;
>  		list_for_each_entry(kvm, &vm_list, vm_list) {
> +			kvm->arch.backwards_tsc_observed = true;
>  			kvm_for_each_vcpu(i, vcpu, kvm) {
>  				vcpu->arch.tsc_offset_adjustment += delta_cyc;
>  				vcpu->arch.last_host_tsc = local_tsc;
> -- 
> 2.9.3

  reply	other threads:[~2017-06-29 15:59 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-26  7:56 [PATCH] KVM: x86: make backwards_tsc_observed a per-VM variable Ladi Prosek
2017-06-29 15:59 ` Marcelo Tosatti [this message]
2017-06-30  8:20   ` Ladi Prosek
2017-06-30 12:00     ` Marcelo Tosatti

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=20170629155916.GA6897@amt.cnet \
    --to=mtosatti@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=lprosek@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