From nobody Tue Aug 25 15:45:50 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1782934385; cv=none; d=zohomail.com; s=zohoarc; b=QtHqNSY5uPcSLVao8pQ3ozjmcwq427ygzDEqHfSTOvShj82rAyY1CA+9jSnR2yK/3492S7deSy5vjWtv+Iwia36zKQxDXPV3wexqb+w1P0m8vrKGDDSuJDHetSqx4p3yDRCxZVOcdiZd+w29rPNd7QQbivVikj/ZyGyWAuqJnI8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782934385; h=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=ITMoYQtDH7A346RlpjwfIOo+apTMWXSUo7by9rtr/s0=; b=jCmaOuE6BgOlApJss2i/GytEzkOU59Ebo5L+7npuEKqtThoeG0nyYCq4ouAAWFzcRBT8Hkv2SynMQhu9COK5jZ+uH0mGJT3zjOfTrMiEgDd/MJKOiEE3rrHmP2GbAMTl3K/ZgutfXvqZ/bO63DE8Y1Hh0B/z0NdVPBGyim8A78o= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1782934385164919.6672466533084; Wed, 1 Jul 2026 12:33:05 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1350377.1607903 (Exim 4.92) (envelope-from ) id 1wf0fs-0001jc-F9; Wed, 01 Jul 2026 19:32:44 +0000 Received: by outflank-mailman (output) from mailman id 1350377.1607903; Wed, 01 Jul 2026 19:32:44 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wf0fs-0001iD-1e; Wed, 01 Jul 2026 19:32:44 +0000 Received: by outflank-mailman (input) for mailman id 1350377; Wed, 01 Jul 2026 19:32:42 +0000 Received: from mx.expurgate.net ([194.145.224.20]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from <3V2tFagYKCZwOA6JF8CKKCHA.8KITAJ-9ARAHHEOPO.TAJLNKFA8P.KNC@flex--seanjc.bounces.google.com>) id 1wf0fq-0001Fn-9L for xen-devel@lists.xenproject.org; Wed, 01 Jul 2026 19:32:42 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1wf0fp-009wqs-M6 for xen-devel@lists.xenproject.org; Wed, 01 Jul 2026 21:32:41 +0200 Received: from [10.42.69.4] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from <3V2tFagYKCZwOA6JF8CKKCHA.8KITAJ-9ARAHHEOPO.TAJLNKFA8P.KNC@flex--seanjc.bounces.google.com>) id 6a456b4a-e002-0a2a0a5209dd-0a2a45049d7c-42 for ; Wed, 01 Jul 2026 21:32:41 +0200 Received: from [209.85.210.201] (helo=mail-pf1-f201.google.com) by tlsNG-ebf023.mxtls.expurgate.net with ESMTPS (eXpurgate 4.57.1) (envelope-from <3V2tFagYKCZwOA6JF8CKKCHA.8KITAJ-9ARAHHEOPO.TAJLNKFA8P.KNC@flex--seanjc.bounces.google.com>) id 6a456b58-a01d-0a2a45040019-d155d2c9d57f-3 for ; Wed, 01 Jul 2026 21:32:41 +0200 Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-847b8d76e3dso1507200b3a.1 for ; Wed, 01 Jul 2026 12:32:41 -0700 (PDT) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=20251104 header.d=google.com header.i="@google.com" header.h="Cc:To:From:Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1782934359; x=1783539159; darn=lists.xenproject.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=ITMoYQtDH7A346RlpjwfIOo+apTMWXSUo7by9rtr/s0=; b=elMQXmi/uZp73fGpzW1TvkyH6kOqmlf7TCafzSjAm4JoN7qEuRomA/ALPOVha7FivA JsIN0xqEuUA1LqYUwh429soCyPcVvGAPC+GPUkgTzVvtlFD+eS+wgdQHk74xyZeeRUnv Uz9pgnslWMazLKZbD00CHcZbpQ9rXrHRdMKAjdcfA+wbzdlm/jnRrnkkDCXylHu+PX+4 +RkWXRswmof2EUpJMd1sx2EC7WUGLS1JZIB+RE2ODO67z8IOw70Abyb0N3GT+vHbFFua L4iw89U2QfYDYVgiKE/E88+U1Qwiq05VLdCrN+0oXpjyEgACCRTHM9e1IyD69mk80udt S3Ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782934359; x=1783539159; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ITMoYQtDH7A346RlpjwfIOo+apTMWXSUo7by9rtr/s0=; b=d/jwqXO8DyMyCQF+uA5I9KfepmlOCqRre3GVVAsvpMiXgtvvbarf0IMzWlNxUsblb4 S1Ebx7JcYft6DWY3ZrO3jmWcKKMuK6dkhlDF+qz34bpesDAz5d53SPD6Ut1QtLxywXRs uqa7b3uB/A+KbfZ8Ys9YIKZK0BbBBQlmg82Fxb7mFmT41LiivAOdT8SLDu8GXF1uv1qW FbXk/68Oo91BEKXGP+mafu37QnXSls8876dFJh8AwF7xo9qZHV1JNB9FnsyMB+slIAE3 J65FsE/0ECVn1X+00udYLfRsN4oPIYOAzvUFRRjy1iqNs6x65qutCkTPmdoruxc0+bvq thXA== X-Forwarded-Encrypted: i=1; AFNElJ8LFuPXt2tuHrV6Af7KsAj4kVx9gGJw467ZPpFvhweNnLs5m9xTh4HzgDnKwHZlaXzIcF+5uwwU+i8=@lists.xenproject.org X-Gm-Message-State: AOJu0YxNEOYDV5KVaPJqk5RJr9y3sGcxpxm2gZu2Hy5tKG9HMmNUjU3M JkRcBQINOeuqgcRtRAT/PvLnn8faiLrcrD4nqSSadtOLVJHLy+3IZHCmH5iu9YAIAAyytuyKLwg OjHKheA== X-Received: from pgaf14.prod.google.com ([2002:a63:380e:0:b0:c98:2639:852e]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:b93:b0:842:57e8:1bdb with SMTP id d2e1a72fcca58-847c07be445mr3013550b3a.20.1782934359203; Wed, 01 Jul 2026 12:32:39 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 1 Jul 2026 12:31:32 -0700 In-Reply-To: <20260701193212.749551-1-seanjc@google.com> Mime-Version: 1.0 References: <20260701193212.749551-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.rc0.799.gd6f94ed593-goog Message-ID: <20260701193212.749551-12-seanjc@google.com> Subject: [PATCH v5 11/51] x86/tsc: Add dedicated hypervisor hooks for getting known TSC/CPU frequencies From: Sean Christopherson To: Jonathan Corbet , Paolo Bonzini , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, Kiryl Shutsemau , Rick Edgecombe , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , John Stultz Cc: Shuah Khan , "H. Peter Anvin" , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , linux-doc@vger.kernel.org, kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, xen-devel@lists.xenproject.org, Tom Lendacky , Nikunj A Dadhania , David Woodhouse , David Woodhouse , Michael Kelley , Thomas Gleixner X-purgate-ID: tlsNG-ebf023/1782934361-2E1A71CC-4FA4A416/0/0 X-purgate-type: clean X-purgate-size: 12591 X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1782934386265158500 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add dedicated hypervisor hooks for getting known TSC/CPU frequencies instead of overriding seemingly generic platform hooks, and explicitly priotize hypervisor-provided frequencies over native methods, but do NOT clobber the frequency obtained from trusted firmware. While shuffling the hooks around is arguably "six of one, half dozen of the other", scoping them to x86_hyper_init makes their purpose more obvious, and allows for explicitly defining the priority of sources (as is done here). As is already done when trusted firmware provides the TSC frequency, ignore ignore tsc_early_khz if the exact TSC frequency was obtained from the hypervisor, as attempting to refine the TSC frequency when running in a VM is all but guaranteed to cause problems sooner or later due to the calibration sources being emulated devices in the vast majority of setups. Cc: David Woodhouse Signed-off-by: Sean Christopherson Reviewed-by: Michael Kelley =20 --- .../admin-guide/kernel-parameters.txt | 3 +- arch/x86/include/asm/acrn.h | 5 ---- arch/x86/include/asm/x86_init.h | 4 +++ arch/x86/kernel/cpu/acrn.c | 10 +++++-- arch/x86/kernel/cpu/mshyperv.c | 6 ++-- arch/x86/kernel/cpu/vmware.c | 8 ++--- arch/x86/kernel/jailhouse.c | 6 ++-- arch/x86/kernel/kvmclock.c | 6 ++-- arch/x86/kernel/tsc.c | 29 ++++++++++++++----- arch/x86/xen/time.c | 4 +-- 10 files changed, 50 insertions(+), 31 deletions(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentatio= n/admin-guide/kernel-parameters.txt index 490e6aa72fc2..a387bb2c47e2 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -7948,7 +7948,8 @@ Kernel parameters =20 Note, tsc_early_khz is ignored if the TSC frequency is provided by trusted firmware when running as an SNP or - TDX guest. + TDX guest, or when the hypervisor provides the exact + frequency via a paravirtual interface. =20 tsx=3D [X86] Control Transactional Synchronization Extensions (TSX) feature in Intel processors that diff --git a/arch/x86/include/asm/acrn.h b/arch/x86/include/asm/acrn.h index db42b477c41d..a892179c61c6 100644 --- a/arch/x86/include/asm/acrn.h +++ b/arch/x86/include/asm/acrn.h @@ -32,11 +32,6 @@ static inline u32 acrn_cpuid_base(void) return 0; } =20 -static inline unsigned long acrn_get_tsc_khz(void) -{ - return cpuid_eax(ACRN_CPUID_TIMING_INFO); -} - /* * Hypercalls for ACRN * diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_ini= t.h index 953d3199408a..0c89bf40f507 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h @@ -123,6 +123,8 @@ struct x86_init_pci { * @msi_ext_dest_id: MSI supports 15-bit APIC IDs * @init_mem_mapping: setup early mappings during init_mem_mapping() * @init_after_bootmem: guest init after boot allocator is finished + * @get_tsc_khz: get the TSC frequency (returns 0 if frequency is unknown) + * @get_cpu_khz: get the CPU frequency (returns 0 if frequency is unknown) */ struct x86_hyper_init { void (*init_platform)(void); @@ -131,6 +133,8 @@ struct x86_hyper_init { bool (*msi_ext_dest_id)(void); void (*init_mem_mapping)(void); void (*init_after_bootmem)(void); + unsigned int (*get_tsc_khz)(void); + unsigned int (*get_cpu_khz)(void); }; =20 /** diff --git a/arch/x86/kernel/cpu/acrn.c b/arch/x86/kernel/cpu/acrn.c index dc119af83524..ad8f2da8003b 100644 --- a/arch/x86/kernel/cpu/acrn.c +++ b/arch/x86/kernel/cpu/acrn.c @@ -24,13 +24,15 @@ static u32 __init acrn_detect(void) return acrn_cpuid_base(); } =20 +static unsigned int __init acrn_get_tsc_khz(void) +{ + return cpuid_eax(ACRN_CPUID_TIMING_INFO); +} + static void __init acrn_init_platform(void) { /* Install system interrupt handler for ACRN hypervisor callback */ sysvec_install(HYPERVISOR_CALLBACK_VECTOR, sysvec_acrn_hv_callback); - - x86_platform.calibrate_tsc =3D acrn_get_tsc_khz; - x86_platform.calibrate_cpu =3D acrn_get_tsc_khz; } =20 static bool acrn_x2apic_available(void) @@ -78,4 +80,6 @@ const __initconst struct hypervisor_x86 x86_hyper_acrn = =3D { .type =3D X86_HYPER_ACRN, .init.init_platform =3D acrn_init_platform, .init.x2apic_available =3D acrn_x2apic_available, + .init.get_tsc_khz =3D acrn_get_tsc_khz, + .init.get_cpu_khz =3D acrn_get_tsc_khz, }; diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index 87beecec76f0..f9bc1c2d8c93 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c @@ -395,7 +395,7 @@ static int hv_nmi_unknown(unsigned int val, struct pt_r= egs *regs) } #endif =20 -static unsigned long hv_get_tsc_khz(void) +static unsigned int __init hv_get_tsc_khz(void) { unsigned long freq; =20 @@ -573,8 +573,8 @@ static void __init ms_hyperv_init_platform(void) =20 if (ms_hyperv.features & HV_ACCESS_FREQUENCY_MSRS && ms_hyperv.misc_features & HV_FEATURE_FREQUENCY_MSRS_AVAILABLE) { - x86_platform.calibrate_tsc =3D hv_get_tsc_khz; - x86_platform.calibrate_cpu =3D hv_get_tsc_khz; + x86_init.hyper.get_tsc_khz =3D hv_get_tsc_khz; + x86_init.hyper.get_cpu_khz =3D hv_get_tsc_khz; setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); } =20 diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c index 13b97265c535..3cb473cae462 100644 --- a/arch/x86/kernel/cpu/vmware.c +++ b/arch/x86/kernel/cpu/vmware.c @@ -64,7 +64,7 @@ struct vmware_steal_time { u64 reserved[7]; }; =20 -static unsigned long vmware_tsc_khz __ro_after_init; +static unsigned long vmware_tsc_khz __initdata; static u8 vmware_hypercall_mode __ro_after_init; =20 unsigned long vmware_hypercall_slow(unsigned long cmd, @@ -137,7 +137,7 @@ static inline int __vmware_platform(void) return eax !=3D UINT_MAX && ebx =3D=3D VMWARE_HYPERVISOR_MAGIC; } =20 -static unsigned long vmware_get_tsc_khz(void) +static unsigned int __init vmware_get_tsc_khz(void) { return vmware_tsc_khz; } @@ -419,8 +419,8 @@ static void __init vmware_platform_setup(void) } =20 vmware_tsc_khz =3D tsc_khz; - x86_platform.calibrate_tsc =3D vmware_get_tsc_khz; - x86_platform.calibrate_cpu =3D vmware_get_tsc_khz; + x86_init.hyper.get_tsc_khz =3D vmware_get_tsc_khz; + x86_init.hyper.get_cpu_khz =3D vmware_get_tsc_khz; =20 /* Skip lapic calibration since we know the bus frequency. */ apic_set_timer_period_hz(ecx, "VMware hypervisor"); diff --git a/arch/x86/kernel/jailhouse.c b/arch/x86/kernel/jailhouse.c index f2d4ef89c085..e24c05ab4fae 100644 --- a/arch/x86/kernel/jailhouse.c +++ b/arch/x86/kernel/jailhouse.c @@ -68,7 +68,7 @@ static void __init jailhouse_timer_init(void) apic_set_timer_period_khz(setup_data.v1.apic_khz, "Jailhouse hypervisor"); } =20 -static unsigned long jailhouse_get_tsc(void) +static unsigned int __init jailhouse_get_tsc(void) { return precalibrated_tsc_khz; } @@ -210,8 +210,6 @@ static void __init jailhouse_init_platform(void) x86_init.mpparse.parse_smp_cfg =3D jailhouse_parse_smp_config; x86_init.pci.arch_init =3D jailhouse_pci_arch_init; =20 - x86_platform.calibrate_cpu =3D jailhouse_get_tsc; - x86_platform.calibrate_tsc =3D jailhouse_get_tsc; x86_platform.get_wallclock =3D jailhouse_get_wallclock; x86_platform.legacy.rtc =3D 0; x86_platform.legacy.warm_reset =3D 0; @@ -293,5 +291,7 @@ const struct hypervisor_x86 x86_hyper_jailhouse __refco= nst =3D { .detect =3D jailhouse_detect, .init.init_platform =3D jailhouse_init_platform, .init.x2apic_available =3D jailhouse_x2apic_available, + .init.get_tsc_khz =3D jailhouse_get_tsc, + .init.get_cpu_khz =3D jailhouse_get_tsc, .ignore_nopv =3D true, }; diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index cb3d0ca1fa22..4f8299303a19 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -136,7 +136,7 @@ static inline void kvm_sched_clock_init(bool stable) * poll of guests can be running and trouble each other. So we preset * lpj here */ -static unsigned long kvm_get_tsc_khz(void) +static unsigned int __init kvm_get_tsc_khz(void) { setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); return pvclock_tsc_khz(this_cpu_pvti()); @@ -343,8 +343,8 @@ void __init kvmclock_init(void) flags =3D pvclock_read_flags(&hv_clock_boot[0].pvti); kvm_sched_clock_init(flags & PVCLOCK_TSC_STABLE_BIT); =20 - x86_platform.calibrate_tsc =3D kvm_get_tsc_khz; - x86_platform.calibrate_cpu =3D kvm_get_tsc_khz; + x86_init.hyper.get_tsc_khz =3D kvm_get_tsc_khz; + x86_init.hyper.get_cpu_khz =3D kvm_get_tsc_khz; x86_platform.get_wallclock =3D kvm_get_wallclock; x86_platform.set_wallclock =3D kvm_set_wallclock; #ifdef CONFIG_X86_LOCAL_APIC diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 86384a83a5f6..1dca9464b41c 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -1451,13 +1451,17 @@ static int __init init_tsc_clocksource(void) device_initcall(init_tsc_clocksource); =20 static bool __init determine_cpu_tsc_frequencies(bool early, + unsigned int known_cpu_khz, unsigned int known_tsc_khz) { /* Make sure that cpu and tsc are not already calibrated */ WARN_ON(cpu_khz || tsc_khz); =20 if (early) { - cpu_khz =3D x86_platform.calibrate_cpu(); + if (known_cpu_khz) + cpu_khz =3D known_cpu_khz; + else + cpu_khz =3D x86_platform.calibrate_cpu(); if (known_tsc_khz) tsc_khz =3D known_tsc_khz; else @@ -1514,7 +1518,7 @@ static void __init tsc_enable_sched_clock(void) =20 void __init tsc_early_init(void) { - unsigned int known_tsc_khz =3D 0; + unsigned int known_cpu_khz =3D 0, known_tsc_khz =3D 0; =20 if (!boot_cpu_has(X86_FEATURE_TSC)) return; @@ -1522,22 +1526,33 @@ void __init tsc_early_init(void) if (is_early_uv_system()) return; =20 + if (x86_init.hyper.get_cpu_khz) + known_cpu_khz =3D x86_init.hyper.get_cpu_khz(); + if (cc_platform_has(CC_ATTR_GUEST_SNP_SECURE_TSC)) known_tsc_khz =3D snp_secure_tsc_init(); else if (boot_cpu_has(X86_FEATURE_TDX_GUEST)) known_tsc_khz =3D tdx_tsc_init(); =20 + /* + * If the TSC frequency wasn't provided by trusted firmware, try to get + * it from the hypervisor (which is untrusted when running as a CoCo gues= t). + */ + if (!known_tsc_khz && x86_init.hyper.get_tsc_khz) + known_tsc_khz =3D x86_init.hyper.get_tsc_khz(); + /* * Ignore the user-provided TSC frequency if the exact frequency was - * obtained from trusted firmware, as the user-provided frequency is - * intended as a "starting point", not a known, guaranteed frequency. + * obtained from trusted firmware or the hypervisor, as the user- + * provided frequency is intended as a "starting point", not a known, + * guaranteed frequency. */ if (!known_tsc_khz) known_tsc_khz =3D tsc_early_khz; else if (tsc_early_khz) - pr_err("Ignoring 'tsc_early_khz' in favor of trusted firmware.\n"); + pr_err("Ignoring 'tsc_early_khz' in favor of firmware/hypervisor.\n"); =20 - if (!determine_cpu_tsc_frequencies(true, known_tsc_khz)) + if (!determine_cpu_tsc_frequencies(true, known_cpu_khz, known_tsc_khz)) return; tsc_enable_sched_clock(); } @@ -1558,7 +1573,7 @@ void __init tsc_init(void) =20 if (!tsc_khz) { /* We failed to determine frequencies earlier, try again */ - if (!determine_cpu_tsc_frequencies(false, 0)) { + if (!determine_cpu_tsc_frequencies(false, 0, 0)) { mark_tsc_unstable("could not calculate TSC khz"); setup_clear_cpu_cap(X86_FEATURE_TSC_DEADLINE_TIMER); return; diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index d62c14334b35..1adb44fdddb2 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c @@ -38,7 +38,7 @@ static u64 xen_sched_clock_offset __read_mostly; =20 /* Get the TSC speed from Xen */ -static unsigned long xen_tsc_khz(void) +static unsigned int __init xen_tsc_khz(void) { struct pvclock_vcpu_time_info *info =3D &HYPERVISOR_shared_info->vcpu_info[0].time; @@ -569,7 +569,7 @@ static void __init xen_init_time_common(void) static_call_update(pv_steal_clock, xen_steal_clock); paravirt_set_sched_clock(xen_sched_clock); =20 - x86_platform.calibrate_tsc =3D xen_tsc_khz; + x86_init.hyper.get_tsc_khz =3D xen_tsc_khz; x86_platform.get_wallclock =3D xen_get_wallclock; } =20 --=20 2.55.0.rc0.799.gd6f94ed593-goog