All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] KVM: x86: allow TSC to differ by NTP correction bounds without TSC scaling
@ 2020-06-15 11:59 Marcelo Tosatti
  2020-06-15 12:20 ` Paolo Bonzini
  0 siblings, 1 reply; 4+ messages in thread
From: Marcelo Tosatti @ 2020-06-15 11:59 UTC (permalink / raw)
  To: kvm-devel; +Cc: Paolo Bonzini, Vitaly Kuznetsov

The Linux TSC calibration procedure is subject to small variations
(its common to see +-1 kHz difference between reboots on a given CPU, for example).

So migrating a guest between two hosts with identical processor can fail, in case
of a small variation in calibrated TSC between them.

Allow a conservative 250ppm error between host TSC and VM TSC frequencies,
rather than requiring an exact match. NTP daemon in the guest can
correct this difference.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 3156e25..39a6664 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1772,6 +1772,8 @@ static int set_tsc_khz(struct kvm_vcpu *vcpu, u32 user_tsc_khz, bool scale)
 
 	/* TSC scaling supported? */
 	if (!kvm_has_tsc_control) {
+		if (!scale)
+			return 0;
 		if (user_tsc_khz > tsc_khz) {
 			vcpu->arch.tsc_catchup = 1;
 			vcpu->arch.tsc_always_catchup = 1;
@@ -4473,7 +4475,8 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
 		r = -EINVAL;
 		user_tsc_khz = (u32)arg;
 
-		if (user_tsc_khz >= kvm_max_guest_tsc_khz)
+		if (kvm_has_tsc_control &&
+		    user_tsc_khz >= kvm_max_guest_tsc_khz)
 			goto out;
 
 		if (user_tsc_khz == 0)


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] KVM: x86: allow TSC to differ by NTP correction bounds without TSC scaling
  2020-06-15 11:59 [PATCH] KVM: x86: allow TSC to differ by NTP correction bounds without TSC scaling Marcelo Tosatti
@ 2020-06-15 12:20 ` Paolo Bonzini
  2020-06-16 11:47   ` [PATCH v2] " Marcelo Tosatti
  0 siblings, 1 reply; 4+ messages in thread
From: Paolo Bonzini @ 2020-06-15 12:20 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm-devel; +Cc: Vitaly Kuznetsov

On 15/06/20 13:59, Marcelo Tosatti wrote:
> The Linux TSC calibration procedure is subject to small variations
> (its common to see +-1 kHz difference between reboots on a given CPU, for example).
> 
> So migrating a guest between two hosts with identical processor can fail, in case
> of a small variation in calibrated TSC between them.
> 
> Allow a conservative 250ppm error between host TSC and VM TSC frequencies,
> rather than requiring an exact match. NTP daemon in the guest can
> correct this difference.
> 
> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

This is the userspace commit message.  Can you resend with a better
commit message that actually matches what the patch does and explains
why the userspace patch is not enough?

Also you should explain what happens with new userspace and old kernel.

Thanks,

Paolo

> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 3156e25..39a6664 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -1772,6 +1772,8 @@ static int set_tsc_khz(struct kvm_vcpu *vcpu, u32 user_tsc_khz, bool scale)
>  
>  	/* TSC scaling supported? */
>  	if (!kvm_has_tsc_control) {
> +		if (!scale)
> +			return 0;
>  		if (user_tsc_khz > tsc_khz) {
>  			vcpu->arch.tsc_catchup = 1;
>  			vcpu->arch.tsc_always_catchup = 1;
> @@ -4473,7 +4475,8 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
>  		r = -EINVAL;
>  		user_tsc_khz = (u32)arg;
>  
> -		if (user_tsc_khz >= kvm_max_guest_tsc_khz)
> +		if (kvm_has_tsc_control &&
> +		    user_tsc_khz >= kvm_max_guest_tsc_khz)
>  			goto out;
>  
>  		if (user_tsc_khz == 0)
> 


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v2] KVM: x86: allow TSC to differ by NTP correction bounds without TSC scaling
  2020-06-15 12:20 ` Paolo Bonzini
@ 2020-06-16 11:47   ` Marcelo Tosatti
  2020-06-23  9:56     ` Paolo Bonzini
  0 siblings, 1 reply; 4+ messages in thread
From: Marcelo Tosatti @ 2020-06-16 11:47 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: kvm-devel, Vitaly Kuznetsov


The Linux TSC calibration procedure is subject to small variations
(its common to see +-1 kHz difference between reboots on a given CPU, for example).

So migrating a guest between two hosts with identical processor can fail, in case
of a small variation in calibrated TSC between them.

Without TSC scaling, the current kernel interface will either return an error
(if user_tsc_khz <= tsc_khz) or enable TSC catchup mode.

This change enables the following TSC tolerance check to
accept KVM_SET_TSC_KHZ within tsc_tolerance_ppm (which is 250ppm by default).

        /*
         * Compute the variation in TSC rate which is acceptable
         * within the range of tolerance and decide if the
         * rate being applied is within that bounds of the hardware
         * rate.  If so, no scaling or compensation need be done.
         */
        thresh_lo = adjust_tsc_khz(tsc_khz, -tsc_tolerance_ppm);
        thresh_hi = adjust_tsc_khz(tsc_khz, tsc_tolerance_ppm);
        if (user_tsc_khz < thresh_lo || user_tsc_khz > thresh_hi) {
                pr_debug("kvm: requested TSC rate %u falls outside tolerance [%u,%u]\n", user_tsc_khz, thresh_lo, thresh_hi);
                use_scaling = 1;
        }

NTP daemon in the guest can correct this difference (NTP can correct upto 500ppm).

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

---

v2: improve changelog (Paolo Bonzini)

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 3156e25..39a6664 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1772,6 +1772,8 @@ static int set_tsc_khz(struct kvm_vcpu *vcpu, u32 user_tsc_khz, bool scale)
 
 	/* TSC scaling supported? */
 	if (!kvm_has_tsc_control) {
+		if (!scale)
+			return 0;
 		if (user_tsc_khz > tsc_khz) {
 			vcpu->arch.tsc_catchup = 1;
 			vcpu->arch.tsc_always_catchup = 1;
@@ -4473,7 +4475,8 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
 		r = -EINVAL;
 		user_tsc_khz = (u32)arg;
 
-		if (user_tsc_khz >= kvm_max_guest_tsc_khz)
+		if (kvm_has_tsc_control &&
+		    user_tsc_khz >= kvm_max_guest_tsc_khz)
 			goto out;
 
 		if (user_tsc_khz == 0)


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] KVM: x86: allow TSC to differ by NTP correction bounds without TSC scaling
  2020-06-16 11:47   ` [PATCH v2] " Marcelo Tosatti
@ 2020-06-23  9:56     ` Paolo Bonzini
  0 siblings, 0 replies; 4+ messages in thread
From: Paolo Bonzini @ 2020-06-23  9:56 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: kvm-devel, Vitaly Kuznetsov

On 16/06/20 13:47, Marcelo Tosatti wrote:
> v2: improve changelog (Paolo Bonzini)
> 
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 3156e25..39a6664 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -1772,6 +1772,8 @@ static int set_tsc_khz(struct kvm_vcpu *vcpu, u32 user_tsc_khz, bool scale)
>  
>  	/* TSC scaling supported? */
>  	if (!kvm_has_tsc_control) {
> +		if (!scale)
> +			return 0;

This cannot happen, there is an "if (!scale) right above.

>  		if (user_tsc_khz > tsc_khz) {
>  			vcpu->arch.tsc_catchup = 1;
>  			vcpu->arch.tsc_always_catchup = 1;
> @@ -4473,7 +4475,8 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
>  		r = -EINVAL;
>  		user_tsc_khz = (u32)arg;
>  
> -		if (user_tsc_khz >= kvm_max_guest_tsc_khz)
> +		if (kvm_has_tsc_control &&
> +		    user_tsc_khz >= kvm_max_guest_tsc_khz)
>  			goto out;
>  
>  		if (user_tsc_khz == 0)
> 

Queued this second hunk.

Paolo


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-06-23  9:56 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-15 11:59 [PATCH] KVM: x86: allow TSC to differ by NTP correction bounds without TSC scaling Marcelo Tosatti
2020-06-15 12:20 ` Paolo Bonzini
2020-06-16 11:47   ` [PATCH v2] " Marcelo Tosatti
2020-06-23  9:56     ` Paolo Bonzini

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.