Re: [PATCH] KVM: x86: make backwards_tsc_observed a per-VM variable

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
> ---
>  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



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux