[PATCH v6 51/51] x86/kvm: Get local APIC bus frequency from PV CPUID Timing Info
Sean Christopherson <[email protected]> Thu, 6 Aug 2026 16:36:08 -0700
| Newsgroups | org.kernel.vger.linux-hyperv,dev.linux.lists.linux-coco,dev.linux.lists.virtualization,org.kernel.vger.kvm,org.kernel.vger.linux-kernel,org.xenproject.lists.xen-devel |
|---|---|
| Message-ID | <[email protected]> |
When running as a KVM guest with PV timing info provided by the host, stuff the APIC timer period/frequency with the local APIC bus frequency reported in CPUID.0x40000010.EBX instead of trying to calibrate/guess the frequency. See Documentation/virt/kvm/x86/cpuid.rst for details. Reviewed-by: David Woodhouse <[email protected]> Signed-off-by: Sean Christopherson <[email protected]> --- arch/x86/kernel/kvm.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index b954238b09fc..edeff41c03c2 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -992,7 +992,7 @@ static void __init kvm_init_platform(void) .mask_lo = (u32)(~(SZ_4G - tolud - 1)) | MTRR_PHYSMASK_V, .mask_hi = (BIT_ULL(boot_cpu_data.x86_phys_bits) - 1) >> 32, }; - u32 timing_info_leaf; + u32 timing_info_leaf, apic_khz; bool tsc_is_reliable; if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT) && @@ -1054,6 +1054,11 @@ static void __init kvm_init_platform(void) x86_init.hyper.get_tsc_khz = kvm_get_tsc_khz; x86_init.hyper.get_cpu_khz = kvm_get_tsc_khz; } + + /* The leaf also includes the local APIC bus/timer frequency.*/ + apic_khz = cpuid_ebx(timing_info_leaf); + if (apic_khz) + apic_set_timer_frequency_khz(apic_khz, "KVM hypervisor"); } /* -- 2.55.0.679.g6767b8d81c-goog