Re: [PATCH v9 02/21] KVM: x86: Improve accuracy of KVM clock when TSC scaling is in force

Sean Christopherson <[email protected]>
Newsgroups org.kernel.vger.kvm,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On Mon, Aug 10, 2026, Sean Christopherson wrote:
> From: David Woodhouse <[email protected]>
> 
> The kvm_guest_time_update() function scales the host TSC frequency to
> the guest's using kvm_scale_tsc() and the v->arch.l1_tsc_scaling_ratio
> scaling ratio previously calculated for that vCPU. Then calculates the
> scaling factors for the KVM clock itself based on that guest TSC
> frequency.
> 
> However, it uses kHz as the unit when scaling, and then multiplies by
> 1000 only at the end.
> 
> With a host TSC frequency of 3000MHz and a guest set to 2500MHz, the
> result of kvm_scale_tsc() will actually come out at 2,499,999kHz. So
> the KVM clock advertised to the guest is based on a frequency of
> 2,499,999,000 Hz.
> 
> By using Hz as the unit from the beginning, the KVM clock would be based
> on a more accurate frequency of 2,499,999,999 Hz in this example.
> 
> Use u64 for the hw_tsc_hz field since an unsigned int would overflow for
> TSC frequencies above 4GHz. Use div_u64() for the Xen CPUID leaf to
> play nice with 32-bit kernels.
> 
> Fixes: 78db6a503796 ("KVM: x86: rewrite handling of scaled TSC for kvmclock")
> Reviewed-by: Paul Durrant <[email protected]>
> Signed-off-by: David Woodhouse <[email protected]>
> Tested-by: Dongli Zhang <[email protected]>
> Signed-off-by: Sean Christopherson <[email protected]>
> ---
>  arch/x86/include/asm/kvm_host.h |  2 +-
>  arch/x86/kvm/cpuid.c            |  1 +
>  arch/x86/kvm/x86.c              | 18 ++++++++++--------
>  3 files changed, 12 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index 283847619ff8..6ddc988576d0 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -864,7 +864,7 @@ struct kvm_vcpu_arch {
>  	gpa_t time;
>  	s8  pvclock_tsc_shift;
>  	u32 pvclock_tsc_mul;
> -	unsigned int hw_tsc_khz;
> +	u64 hw_tsc_hz;

From https://sashiko.dev/#/patchset/20260810225500.869288-1-seanjc%40google.com:

 : > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
 : > index b517257a63153..099c3da20547d 100644
 : > --- a/arch/x86/include/asm/kvm_host.h
 : > +++ b/arch/x86/include/asm/kvm_host.h
 : > @@ -1004,7 +1004,7 @@ struct kvm_vcpu_arch {
 : >  	gpa_t time;
 : >  	s8  pvclock_tsc_shift;
 : >  	u32 pvclock_tsc_mul;
 : > -	unsigned int hw_tsc_khz;
 : > +	u64 hw_tsc_hz;
 : >  	struct gfn_to_pfn_cache pv_time;
 : >  	/* set guest stopped flag in pvclock flags field */
 : >  	bool pvclock_set_guest_stopped_request;
 : 
 : The commit message mentions using div_u64() for the Xen CPUID leaf, but is
 : the actual update to kvm_cpuid() missing here?
 : 
 : It appears kvm_cpuid() still references the old field name:
 : 
 : arch/x86/kvm/cpuid.c:kvm_cpuid() {
 :     ...
 :     *eax = vcpu->arch.hw_tsc_khz;
 :     ...
 : }
 : 
 : Since the field was renamed to hw_tsc_hz in struct kvm_vcpu_arch, will this
 : cause a build failure when compiling for x86?

The changelog is stale.  This will be applied on top of commit 7d3bd21e457b
("KVM: x86: Remove runtime Xen TSC frequency CPUID update") that's sitting in
kvm-x86/clocks.  I'll drop the stale sentence from the changelog when applying.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.