From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E8B643469EE for ; Fri, 15 May 2026 19:20:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872811; cv=none; b=A5el+k53v0eVgJ1t/xQReX0sLvoFu9Q/eXElKCcTZYe3KWr+kltIdQ4cDzhOEjjK37C7bOCD4zg41badbSkbosWZ6L/6eleM2/fnaZP4Kowzm+CcJR3Xirw1oBgTR0rq01ZXTVkBAaS84rLlMcrvUBXrMXWqkhlJEZ/eEjL1ScU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872811; c=relaxed/simple; bh=0ICEAogrRng9j6ucJ2Nqpe68+xsxzYI5Dnfjq30YBzY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=PfTLmczGMf/ALFxvzJnFyts+IT1ZrV6XkXNEkgpg6Os0iazmZZqLOmeKc6xffsDcDMTxj1laqDh2d8ghRd16f/9qVTOuHYA6mPWKM/mIs7qpXL+NFr5z/FbcWJYc7CJgCr9W1Q9G7UE7w+6ouljCZqb74JHaDgshjDILTM3tGAE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=ZTIhCUsl; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="ZTIhCUsl" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82f9f49e4beso88988b3a.0 for ; Fri, 15 May 2026 12:20:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872809; x=1779477609; darn=vger.kernel.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=jST9oUAeGChZmjVu7tMLxKyDKtrkhYcd1woip2cswJk=; b=ZTIhCUsl5+euV2CFmLiWUYh72POhw6x4DYPcl529comsJ3xjXQbHiky4mzRhaASqqt JwYyFyn6hzlRxu0oM2Tf+ziYAhfdXIA3K9mOoB7RN1TODekbz18Qr6x/ANX00bK0U4Vf 3PDKT4aTwRRwPPnM3uGubU8s+5oDuZg+0bNExnQMBbLhfXgurcqhJre99v0JQtjz+0+q 5lXr6jQwn8bpRBcBON+OfqI4bIrvoa/kdORR9OSQThL7e4HGVGU7wSyH/vj3Q4coXtSs VJOBR+C+t9gFYd+JLV2+m3qmApBxoWl89y9xRstbbFCIYhL0BerYht4P/a9KUzCWn8Nj HP4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872809; x=1779477609; 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=jST9oUAeGChZmjVu7tMLxKyDKtrkhYcd1woip2cswJk=; b=cDDnnKyK2a3NgY6JXGEUJYXWfwT2k0HwIB9d3PK5dEwl/yeI9bBSBoQF0JIgXUHotr d0Pd9lx94zQASwuWKkR2DY846HzPokbggJnXYBpNmszD79bUYa8G0MPIspTd76h/ZOlK 5pcJ78Ck0Lb35VPUm+7YDzII1F6yFyA/OeYU6fwXfzyAmdynxUGha1f2hHlTceHDCEp1 KoOdrUQ6pgLePwu9b2HBHan095kDSz/mvGqwOOnIouJxGRTUQUOb1L5CVBGEYVLuMima /51ukBYR8so8f3YsNa9cv9NZLFWJAfz7S/gmBlYQNStqIWQLhy4hIhwltTuCXDteLUOU maHA== X-Forwarded-Encrypted: i=1; AFNElJ/OZywGBM98eqRkvkaSrtefL2ZeU+8Hc7h/ElYt1g2NY5MgWBmQvhR8rWMlIUQB8UbQtfxjnOWUJmo1PnQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxdaWFe8sRxy87GczSByvMQU919q68KEss1cFlzwyCCFRmlQo2V 6iNucLkVB7ZT1nBaSft+zMEIGKpqQNIgsoDr0bZ/hRUYLzznohLGXPtEQ9epqmuLgAMPOx5OoFI XV/Yy/w== X-Received: from pfbfc32.prod.google.com ([2002:a05:6a00:2e20:b0:82f:96ee:b9ab]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3004:b0:838:a932:de26 with SMTP id d2e1a72fcca58-83f33bca63emr5607513b3a.1.1778872808989; Fri, 15 May 2026 12:20:08 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:02 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-2-seanjc@google.com> Subject: [PATCH v3 01/41] x86/tsc: Add a standalone helpers for getting TSC info from CPUID.0x15 From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Extract retrieval of TSC frequency information from CPUID into standalone helpers so that TDX guest support can reuse the logic. Provide a version that includes the multiplier math as TDX does NOT want to use native_calibrate_tsc()'s fallback logic that derives the TSC frequency based on CPUID.0x16, when the core crystal frequency isn't known. Opportunsitically drop native_calibrate_tsc()'s "=3D=3D 0" and "!=3D 0" che= cks in favor of the kernel's preferred style. No functional change intended. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/include/asm/tsc.h | 9 +++++ arch/x86/kernel/tsc.c | 67 +++++++++++++++++++++++++------------- 2 files changed, 53 insertions(+), 23 deletions(-) diff --git a/arch/x86/include/asm/tsc.h b/arch/x86/include/asm/tsc.h index 4f7f09f50552..0c57fadc4a39 100644 --- a/arch/x86/include/asm/tsc.h +++ b/arch/x86/include/asm/tsc.h @@ -83,6 +83,15 @@ static inline cycles_t get_cycles(void) } #define get_cycles get_cycles =20 +struct cpuid_tsc_info { + unsigned int denominator; + unsigned int numerator; + unsigned int crystal_khz; + unsigned int tsc_khz; +}; +extern int cpuid_get_tsc_info(struct cpuid_tsc_info *info); +extern int cpuid_get_tsc_freq(struct cpuid_tsc_info *info); + extern void tsc_early_init(void); extern void tsc_init(void); extern void mark_tsc_unstable(char *reason); diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index c5110eb554bc..f92236f40cbc 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -658,46 +658,67 @@ static unsigned long quick_pit_calibrate(void) return delta; } =20 +int cpuid_get_tsc_info(struct cpuid_tsc_info *info) +{ + unsigned int ecx_hz, edx; + + memset(info, 0, sizeof(*info)); + + if (boot_cpu_data.cpuid_level < CPUID_LEAF_TSC) + return -ENOENT; + + /* CPUID 15H TSC/Crystal ratio, plus optionally Crystal Hz */ + cpuid(CPUID_LEAF_TSC, &info->denominator, &info->numerator, &ecx_hz, &edx= ); + + if (!info->denominator || !info->numerator) + return -ENOENT; + + /* + * Note, some CPUs provide the multiplier information, but not the core + * crystal frequency. The multiplier information is still useful for + * such CPUs, as the crystal frequency can be gleaned from CPUID.0x16. + */ + info->crystal_khz =3D ecx_hz / 1000; + return 0; +} + +int cpuid_get_tsc_freq(struct cpuid_tsc_info *info) +{ + if (cpuid_get_tsc_info(info) || !info->crystal_khz) + return -ENOENT; + + info->tsc_khz =3D info->crystal_khz * info->numerator / info->denominator; + return 0; +} + /** * native_calibrate_tsc - determine TSC frequency * Determine TSC frequency via CPUID, else return 0. */ unsigned long native_calibrate_tsc(void) { - unsigned int eax_denominator, ebx_numerator, ecx_hz, edx; - unsigned int crystal_khz; + struct cpuid_tsc_info info; =20 if (boot_cpu_data.x86_vendor !=3D X86_VENDOR_INTEL) return 0; =20 - if (boot_cpu_data.cpuid_level < CPUID_LEAF_TSC) + if (cpuid_get_tsc_info(&info)) return 0; =20 - eax_denominator =3D ebx_numerator =3D ecx_hz =3D edx =3D 0; - - /* CPUID 15H TSC/Crystal ratio, plus optionally Crystal Hz */ - cpuid(CPUID_LEAF_TSC, &eax_denominator, &ebx_numerator, &ecx_hz, &edx); - - if (ebx_numerator =3D=3D 0 || eax_denominator =3D=3D 0) - return 0; - - crystal_khz =3D ecx_hz / 1000; - /* * Denverton SoCs don't report crystal clock, and also don't support * CPUID_LEAF_FREQ for the calculation below, so hardcode the 25MHz * crystal clock. */ - if (crystal_khz =3D=3D 0 && - boot_cpu_data.x86_vfm =3D=3D INTEL_ATOM_GOLDMONT_D) - crystal_khz =3D 25000; + if (!info.crystal_khz && boot_cpu_data.x86_vfm =3D=3D INTEL_ATOM_GOLDMONT= _D) + info.crystal_khz =3D 25000; =20 /* * TSC frequency reported directly by CPUID is a "hardware reported" * frequency and is the most accurate one so far we have. This * is considered a known frequency. */ - if (crystal_khz !=3D 0) + if (info.crystal_khz) setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); =20 /* @@ -705,15 +726,15 @@ unsigned long native_calibrate_tsc(void) * clock, but we can easily calculate it to a high degree of accuracy * by considering the crystal ratio and the CPU speed. */ - if (crystal_khz =3D=3D 0 && boot_cpu_data.cpuid_level >=3D CPUID_LEAF_FRE= Q) { + if (!info.crystal_khz && boot_cpu_data.cpuid_level >=3D CPUID_LEAF_FREQ) { unsigned int eax_base_mhz, ebx, ecx, edx; =20 cpuid(CPUID_LEAF_FREQ, &eax_base_mhz, &ebx, &ecx, &edx); - crystal_khz =3D eax_base_mhz * 1000 * - eax_denominator / ebx_numerator; + info.crystal_khz =3D eax_base_mhz * 1000 * + info.denominator / info.numerator; } =20 - if (crystal_khz =3D=3D 0) + if (!info.crystal_khz) return 0; =20 /* @@ -730,10 +751,10 @@ unsigned long native_calibrate_tsc(void) * lapic_timer_period here to avoid having to calibrate the APIC * timer later. */ - lapic_timer_period =3D crystal_khz * 1000 / HZ; + lapic_timer_period =3D info.crystal_khz * 1000 / HZ; #endif =20 - return crystal_khz * ebx_numerator / eax_denominator; + return info.crystal_khz * info.numerator / info.denominator; } =20 static unsigned long cpu_khz_from_cpuid(void) --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3D13F372B3C for ; Fri, 15 May 2026 19:20:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872829; cv=none; b=MS8CswgtVn2JFPD6YzZ5fjtJBLCB7dvuk2nUaMYr644clut0gR+IRF3Rh2yasrj84E0qA3TvaPp+pKLOFSnu3dcXzfailIchJC1FOHm5XQYBXzHfIZ/AMHzA3ALEoF1P8M+hZAMWSuZU2Kx1RcuY4kwFQr6YL1hMvvlesDc/TnU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872829; c=relaxed/simple; bh=t6/pbTUbmip8SEjdYzshXakw7OlEqETJaOfJu557UMo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=NoxT+U3AXHKhBk+sYz7vzH06LWFwJ+PnnVPCrYFBvmzz/UT/ECC0E42p6muJfDo3nx0tzoqGhiuhvWZhm2J4UPQ6Tz9KcMmdkSLfgAzzoLdaXLIKCMkKXzN0JU7qYopX0VjEBHkPEarUZh5wdDXUrlNauGIbKj0zkTFd1MUzjP4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=SCU8xqOk; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="SCU8xqOk" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-368b15eeb3bso324111a91.2 for ; Fri, 15 May 2026 12:20:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872826; x=1779477626; darn=vger.kernel.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=4uXjPuEkhteosgn8xfkxRem+kth4PBQNYWCq/GT/iNY=; b=SCU8xqOkhpgm32xDP67rV5Xqp/yhtpMCLs3EedQ+/79fs59dRZrJM1XS7YY3a672NU ctXoyF0Not9zLs65ugCps9a1G8yainjjE0c1TDOpabCt7wb8lVtPbRjbCnUDKwy0EW6I 5nJuZ/hn2RpBe/mfMQkBCnlNJ3WQphvQGc25BoLTjtXdNCbxO75sG/XzJvXFp2ZcEdYj sT7NAYvB4mjsLM/sfUa0n3zVCO4sxgOa6euEDifM8maFT6N68TFetZHQlslML+PHCQt1 f7IsNwmTmztmQ5bci5OxancG5pAsw6KbML7XKj8JXiKg3MZlSr6nKxjQoM5SsW3F7EfU CT5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872826; x=1779477626; 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=4uXjPuEkhteosgn8xfkxRem+kth4PBQNYWCq/GT/iNY=; b=PSQkg2pBluCrCmwOXBFmdwt1lRAEHdLKXNfcWx0b3TS6tLg66K2D7oO4ZJS4GHaHgc 0apkqt69LYn/Zd9ML2r9mnbf3vZtkvXdrM83SnepHL/AqDGCioQF0ObKHsbzf6/Guo+f EkQ3icv+RDwBAxVzAR0E9zmVuacVpH/pvj+ajjVILOGprdKY5PQiC6sntZkjW810uQLJ 6iTuXnTwZkqdiPeijXeCLQGdzeDpwu17YOVZ+/QWSOWVQ+Yx2GCdYOjZsxd+083pZT2E n0T3iLNU3vpJ7WuCcP5Fvaa6UI7ml26fxw14Ds33kGxFJoi+Of8P0CR5lapPEivaBY4e IC+g== X-Forwarded-Encrypted: i=1; AFNElJ9d8LRYkmL29RxmV00jlqoQ+tby5xt7yHhA1BP0XZpXSjBUq0hVvtEjfJFR7b97OthxSyAmOt4FKg/J7bk=@vger.kernel.org X-Gm-Message-State: AOJu0YxYEi4JIwOvkIxI0LTkHOUwFaZB9/TBW3aVsehT5GMmM35qttrk toqRTN79I/GzTVJr37kcuEIdpQLjleGQhA59tI+ec5yytiHGNX8cvos+mCba+JGXo3GxX91p4Gc DgrxvQQ== X-Received: from pgno7.prod.google.com ([2002:a63:7e47:0:b0:c79:788d:5b72]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:e097:b0:39f:8c23:34c6 with SMTP id adf61e73a8af0-3b22ecedb15mr6528440637.35.1778872826182; Fri, 15 May 2026 12:20:26 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:03 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-3-seanjc@google.com> Subject: [PATCH v3 02/41] x86/tsc: Add helper to register CPU and TSC freq calibration routines From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a helper to register non-native, i.e. PV and CoCo, CPU and TSC frequency calibration routines. This will allow consolidating handling of common TSC properties that are forced by hypervisor (PV routines), and will also allow adding sanity checks to guard against overriding a TSC calibration routine with a routine that is less robust/trusted. Make the CPU calibration routine optional, as Xen (very sanely) doesn't assume the CPU runs as the same frequency as the TSC. Wrap the helper in an #ifdef to document that the kernel overrides the native routines when running as a VM, and to guard against unwanted usage. Add a TODO to call out that AMD_MEM_ENCRYPT is a mess and doesn't depend on HYPERVISOR_GUEST because it gates both guest and host code. No functional change intended. Reviewed-by: Michael Kelley Tested-by: Michael Kelley Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/coco/sev/core.c | 4 ++-- arch/x86/include/asm/tsc.h | 4 ++++ arch/x86/kernel/cpu/acrn.c | 4 ++-- arch/x86/kernel/cpu/mshyperv.c | 3 +-- arch/x86/kernel/cpu/vmware.c | 4 ++-- arch/x86/kernel/jailhouse.c | 4 ++-- arch/x86/kernel/kvmclock.c | 4 ++-- arch/x86/kernel/tsc.c | 17 +++++++++++++++++ arch/x86/xen/time.c | 2 +- 9 files changed, 33 insertions(+), 13 deletions(-) diff --git a/arch/x86/coco/sev/core.c b/arch/x86/coco/sev/core.c index 7ed3da998489..d27cf8f8b025 100644 --- a/arch/x86/coco/sev/core.c +++ b/arch/x86/coco/sev/core.c @@ -2048,8 +2048,8 @@ void __init snp_secure_tsc_init(void) =20 snp_tsc_freq_khz =3D SNP_SCALE_TSC_FREQ(tsc_freq_mhz * 1000, secrets->tsc= _factor); =20 - x86_platform.calibrate_cpu =3D securetsc_get_tsc_khz; - x86_platform.calibrate_tsc =3D securetsc_get_tsc_khz; + tsc_register_calibration_routines(securetsc_get_tsc_khz, + securetsc_get_tsc_khz); =20 early_memunmap(mem, PAGE_SIZE); } diff --git a/arch/x86/include/asm/tsc.h b/arch/x86/include/asm/tsc.h index 0c57fadc4a39..bae709f5f44d 100644 --- a/arch/x86/include/asm/tsc.h +++ b/arch/x86/include/asm/tsc.h @@ -94,6 +94,10 @@ extern int cpuid_get_tsc_freq(struct cpuid_tsc_info *inf= o); =20 extern void tsc_early_init(void); extern void tsc_init(void); +#if defined(CONFIG_HYPERVISOR_GUEST) || defined(CONFIG_AMD_MEM_ENCRYPT) +extern void tsc_register_calibration_routines(unsigned long (*calibrate_ts= c)(void), + unsigned long (*calibrate_cpu)(void)); +#endif extern void mark_tsc_unstable(char *reason); extern int unsynchronized_tsc(void); extern int check_tsc_unstable(void); diff --git a/arch/x86/kernel/cpu/acrn.c b/arch/x86/kernel/cpu/acrn.c index 2c5b51aad91a..c1506cb87d8c 100644 --- a/arch/x86/kernel/cpu/acrn.c +++ b/arch/x86/kernel/cpu/acrn.c @@ -29,8 +29,8 @@ static void __init acrn_init_platform(void) /* Install system interrupt handler for ACRN hypervisor callback */ sysvec_install(HYPERVISOR_CALLBACK_VECTOR, sysvec_acrn_hv_callback); =20 - x86_platform.calibrate_tsc =3D acrn_get_tsc_khz; - x86_platform.calibrate_cpu =3D acrn_get_tsc_khz; + tsc_register_calibration_routines(acrn_get_tsc_khz, + acrn_get_tsc_khz); } =20 static bool acrn_x2apic_available(void) diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index 640e6b223c2d..8d2401be420c 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c @@ -573,8 +573,7 @@ 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; + tsc_register_calibration_routines(hv_get_tsc_khz, 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 34b73573b108..b88d9ca01202 100644 --- a/arch/x86/kernel/cpu/vmware.c +++ b/arch/x86/kernel/cpu/vmware.c @@ -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; + tsc_register_calibration_routines(vmware_get_tsc_khz, + vmware_get_tsc_khz); =20 #ifdef CONFIG_X86_LOCAL_APIC /* Skip lapic calibration since we know the bus frequency. */ diff --git a/arch/x86/kernel/jailhouse.c b/arch/x86/kernel/jailhouse.c index f58ce9220e0f..db8f31fdb480 100644 --- a/arch/x86/kernel/jailhouse.c +++ b/arch/x86/kernel/jailhouse.c @@ -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; @@ -221,6 +219,8 @@ static void __init jailhouse_init_platform(void) =20 machine_ops.emergency_restart =3D jailhouse_no_restart; =20 + tsc_register_calibration_routines(jailhouse_get_tsc, jailhouse_get_tsc); + while (pa_data) { mapping =3D early_memremap(pa_data, sizeof(header)); memcpy(&header, mapping, sizeof(header)); diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index b5991d53fc0e..e9e7394140dd 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -321,8 +321,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; + tsc_register_calibration_routines(kvm_get_tsc_khz, 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 f92236f40cbc..7e639c0a94a2 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -1281,6 +1281,23 @@ static void __init check_system_tsc_reliable(void) tsc_disable_clocksource_watchdog(); } =20 +/* + * TODO: Disentangle AMD_MEM_ENCRYPT and make SEV guest support depend on + * HYPERVISOR_GUEST. + */ +#if defined(CONFIG_HYPERVISOR_GUEST) || defined(CONFIG_AMD_MEM_ENCRYPT) +void tsc_register_calibration_routines(unsigned long (*calibrate_tsc)(void= ), + unsigned long (*calibrate_cpu)(void)) +{ + if (WARN_ON_ONCE(!calibrate_tsc)) + return; + + x86_platform.calibrate_tsc =3D calibrate_tsc; + if (calibrate_cpu) + x86_platform.calibrate_cpu =3D calibrate_cpu; +} +#endif + /* * Make an educated guess if the TSC is trustworthy and synchronized * over all CPUs. diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index d62c14334b35..3d3165eef821 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c @@ -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; + tsc_register_calibration_routines(xen_tsc_khz, NULL); x86_platform.get_wallclock =3D xen_get_wallclock; } =20 --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7B32137F8B5 for ; Fri, 15 May 2026 19:20:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872829; cv=none; b=mgjeqoX39r2DmXJxgzfaACZiUIjhNao7Cefz35SNEf69WQ7TWtnnPPfY4m+dt3RY7o4zni7McHvEog5vWOxsQx7df8wHKQmY5C9i8STMPFyUceasVCoyxDpg74/PbAcqeHqHNlItlCeTe4UDT8WKfwew24EDEdpRGlMW75AVkyU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872829; c=relaxed/simple; bh=EM4Aa/jhLL0HBAZa7II73CeQqmh6W0AY88xO0q2PZyY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=WHo6hlEcH2YhoMBQNNe5YxHLYe0m64QigIgIP8to7H6prN6IqIvtl3p8U8HpnbLOdxw0IbaTWL0H6al9vSQyAYMBgYya56qhW1oMIrRef1Q5GZewJ8HjPY3IkHx58eoy10r1dMJc1gOog7Pw2JWvEWT4jtbCW1kMpxYtseHy18k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=NzRMwtA4; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="NzRMwtA4" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-83ef22f8e8bso176737b3a.0 for ; Fri, 15 May 2026 12:20:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872828; x=1779477628; darn=vger.kernel.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=f8J88NcF7oH9XUSV/4XAna5n7NY6XY4d9JdR9Rumg2w=; b=NzRMwtA4Tniis8rxkcEs6qVkGAvzl9NWGVcXMRgCa0EcI3XiS38MhzkrGFXzbHy67Q ik3Qje66pE8efCtE7WCN0fC2NINgptBuFd3z1A1ZnRHAtObQYjJa4W94RsdGVClkC+sf txj3OTy4q5lLZyCsh63BlDTIORDRF69SLJB5CiuI0z3zmFKZmoYPXEKMENL65bzFN479 Zdud5VozFzXo3ZNXtIiTSnyL5TqeHA/GxB1euXSEKJhITweAGQhiXqMKEAzQK7Y0+2B7 tSZNJ/QkKTycOHD50xOW9+YmkNspCXASAOiPkszZbhPvyaZ+Y0aq9vMDvS1ADrZFtTM8 GQew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872828; x=1779477628; 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=f8J88NcF7oH9XUSV/4XAna5n7NY6XY4d9JdR9Rumg2w=; b=nWeCJAkfWP3PeRqERGN9/4uysZPp8QyrGPibBdKZ37u7c54wLzM7p14yIUeTgommJu yNF8RJqX7Xt1PvNVVXopSkqZJpUH5BlhDQfvtw8hOsF1lQmZkkfvUOek9Ic6B89y+Ub4 Aro6b9fjg2FTkWISEpOmjGf9cCWR5M5TG+rNwstFBeKVVW7kD2vyiEfEJNNHmAyC3Jup D9299r6wTGWFBIfSWfFOqrE2Pg9FgZQc7/7b9ezmMm4n9mSxrYgfku480OhPGtwJLLqa wN8ASfRHpwlAs+v6/CbM2qu6ss1eeIACe0jHyBcwpLpeWz+70CRP2rThe5J4CGOFhTlt NP9w== X-Forwarded-Encrypted: i=1; AFNElJ8rhm4WXv9uS7o2ivMbF9eQ47eWaRBrAS9somJE1JVyQ1b07R+/m36NdGnxgUeiYcRY+Q5AoblfqP9vVYs=@vger.kernel.org X-Gm-Message-State: AOJu0Yz6ELUxDh06YR16ct1lRSjy24tTkJRMQhsPYYX/LSPhA3JX1l25 LMtKJ41r6+c3v4L2rII5dz7pjGHU5Lk/ZkZQHETfRsHBUc0SDABOMhfZGFt1xW89BlfBd3GOi0J I43av3A== X-Received: from pfch22.prod.google.com ([2002:a05:6a00:1716:b0:82f:6a26:5f78]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:12e4:b0:835:405a:7e68 with SMTP id d2e1a72fcca58-83f33d9dd83mr5936320b3a.32.1778872827310; Fri, 15 May 2026 12:20:27 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:04 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-4-seanjc@google.com> Subject: [PATCH v3 03/41] x86/sev: Mark TSC as reliable when configuring Secure TSC From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the code to mark the TSC as reliable from sme_early_init() to snp_secure_tsc_init(). The only reader of TSC_RELIABLE is the aptly named check_system_tsc_reliable(), which runs in tsc_init(), i.e. after snp_secure_tsc_init(). This will allow consolidating the handling of TSC_KNOWN_FREQ and TSC_RELIABLE when overriding the TSC calibration routine. Cc: Tom Lendacky Reviewed-by: Nikunj A Dadhania Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/coco/sev/core.c | 2 ++ arch/x86/mm/mem_encrypt_amd.c | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/arch/x86/coco/sev/core.c b/arch/x86/coco/sev/core.c index d27cf8f8b025..14ced854cd83 100644 --- a/arch/x86/coco/sev/core.c +++ b/arch/x86/coco/sev/core.c @@ -2041,6 +2041,8 @@ void __init snp_secure_tsc_init(void) secrets =3D (__force struct snp_secrets_page *)mem; =20 setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); + setup_force_cpu_cap(X86_FEATURE_TSC_RELIABLE); + rdmsrq(MSR_AMD64_GUEST_TSC_FREQ, tsc_freq_mhz); =20 /* Extract the GUEST TSC MHZ from BIT[17:0], rest is reserved space */ diff --git a/arch/x86/mm/mem_encrypt_amd.c b/arch/x86/mm/mem_encrypt_amd.c index 2f8c32173972..6c3af974c7c2 100644 --- a/arch/x86/mm/mem_encrypt_amd.c +++ b/arch/x86/mm/mem_encrypt_amd.c @@ -535,9 +535,6 @@ void __init sme_early_init(void) */ x86_init.resources.dmi_setup =3D snp_dmi_setup; } - - if (sev_status & MSR_AMD64_SNP_SECURE_TSC) - setup_force_cpu_cap(X86_FEATURE_TSC_RELIABLE); } =20 void __init mem_encrypt_free_decrypted_mem(void) --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9153C3803EF for ; Fri, 15 May 2026 19:20:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872831; cv=none; b=W8022ChchL949vvV7HDEK3MynMfSAgzL7y8RNcJ1WyCmn17HUqVfC/t+wa7qw+xNUeYYSSnSwv9/+7hsLAD6xq9ul2Uhclt/ObIu4tini0lXHozbJnCTx8cZLveVppin0HTJrlPpiWzgL/sGPotdtrW0OUk3njxClXLbHbIZuvU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872831; c=relaxed/simple; bh=nvaTcMbyfjZXZc1w2lrIIDutznVhYZokau/9P9cewsQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=WzHhmZHDoGSRDWmtNVvFLdksibRznJv9qbo8T6rTiICffCpFiSI52DPY0Yhfhp1PW9ptPAetNFSSvtkEHsWWsyPZDbKVZyboCcvFzsGbD0++GwemPzitoIis/rNoj9tv429qv7pK17XyHTddPNt5RN+yWhOoe4AHI/cL0ShVkCE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=kfgp8CQR; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="kfgp8CQR" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-8230d6d54a5so1056908b3a.1 for ; Fri, 15 May 2026 12:20:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872829; x=1779477629; darn=vger.kernel.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=ikDY1x359wvY/+q3wacNdXpEm487YvEWh2udCoEd+NA=; b=kfgp8CQR7JRLTbwDImSid2uKUCmOzBOWL7J4D4kHATIvk3dQwHMNomvqowes2SAAn3 huZsR7HXAnuRe/mGMxW/w8wExK4WOguceJSl5iiQ/PNhv2tcNp/28h+vjmYUQkKMQF7L qAinNlaICcKNac7SyF3yrnodyGPavPfaCSs1gKzrozXsusb4E3wOjG3eVKacEfJOnVPT FSxs1x0nOT896eSej2u4cmPwJ87Z5Op8O34sTspBjIDtg5zoo1IHXrZmu5NwSoaekZuE JrF6yZyxRX9dAjvUP+PsbnmeGkvLWuxrTZHRgaRaJSCSirIb7PCgRsW9mq9f4UohS8OD rXjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872829; x=1779477629; 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=ikDY1x359wvY/+q3wacNdXpEm487YvEWh2udCoEd+NA=; b=LnV3HOujxZ1nGZ1tuJ0VRTvYiLTICkeUaC/DcVUSjh2+5SNhCFOPPCCde67x7tq72J OwAUP91Jzu0XuAZhki+Kg7VZpxWpx7usVec/rL+zVLMFl1qeEeewk0dpUC6w+03uopz8 Da8HbIXamocFr0wPQWGr+a4Nc9Iclamzr8D3+d36QG+a282LkotoUbWgOqFESfxbfe3T 0xF/kLYyr68b1m+a3ACQ4HNZXmTOwMdqih8NyCNKKaF+maflhpkvV5kjUsRtNJQihvWj XZg73tJGqLY7uXwxmdssoNVWFV5yHzwVIC+srzF50ZN+FLqyRQfdhsgRpdSUWVgN5JCn 4o0w== X-Forwarded-Encrypted: i=1; AFNElJ9q0cJqVOHp58A9Z8ziDoJax4JforSQfD98Xwp0Up9XzQHsRsqSP5+DPnBj/kssw71zOP9KDCkBB516jwQ=@vger.kernel.org X-Gm-Message-State: AOJu0YyGLuJCOoqoHiLaqt0XMW1w0Wa3+rWtZH6dmSOjupu2bRYhFjoL m30QX9NEm2znbnN1xJUDrdPyNXr0b0iqqxRsbSr4lkNhjLeOcg7rkwHlzzMqdi41Y7PQsROicEW 3xQbHKw== X-Received: from pfbgg10.prod.google.com ([2002:a05:6a00:630a:b0:83a:d498:99fb]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:a907:b0:835:447b:a2ac with SMTP id d2e1a72fcca58-83f18d5b8f5mr8777489b3a.5.1778872828431; Fri, 15 May 2026 12:20:28 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:05 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-5-seanjc@google.com> Subject: [PATCH v3 04/41] x86/sev: Move check for SNP Secure TSC support to tsc_early_init() From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the check on having a Secure TSC to the common tsc_early_init() so that it's obvious that having a Secure TSC is conditional, and to prepare for adding TDX to the mix (blindly initializing *both* SNP and TDX TSC logic looks especially weird). No functional change intended. Cc: Tom Lendacky Reviewed-by: Nikunj A Dadhania Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/coco/sev/core.c | 3 --- arch/x86/kernel/tsc.c | 3 ++- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/arch/x86/coco/sev/core.c b/arch/x86/coco/sev/core.c index 14ced854cd83..39fb50697542 100644 --- a/arch/x86/coco/sev/core.c +++ b/arch/x86/coco/sev/core.c @@ -2029,9 +2029,6 @@ void __init snp_secure_tsc_init(void) unsigned long tsc_freq_mhz; void *mem; =20 - if (!cc_platform_has(CC_ATTR_GUEST_SNP_SECURE_TSC)) - return; - mem =3D early_memremap_encrypted(sev_secrets_pa, PAGE_SIZE); if (!mem) { pr_err("Unable to get TSC_FACTOR: failed to map the SNP secrets page.\n"= ); diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 7e639c0a94a2..243999692aea 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -1559,7 +1559,8 @@ void __init tsc_early_init(void) if (is_early_uv_system()) return; =20 - snp_secure_tsc_init(); + if (cc_platform_has(CC_ATTR_GUEST_SNP_SECURE_TSC)) + snp_secure_tsc_init(); =20 if (!determine_cpu_tsc_frequencies(true)) return; --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A4399389441 for ; Fri, 15 May 2026 19:20:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872832; cv=none; b=XKlArVgyWNSDzYXUvz25fDV5aeHzmLXXNiQbS/nP9oOf4upVjj67H7g27ZWDo2wZ5VQYNoMmdttpYKDIYGLawoB8M6JHfGngIshHb6WQncXDjZTF/o9A7MFS+pIgOY2w6PK/sen7Hf9fz/ITqO/aEyAMX3p00Cxm9kp/eOU5mz0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872832; c=relaxed/simple; bh=a/C0vtyL90QijKFqEXuRoJ0Idw3MprCujvV9iw9j0eQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=bYKIEz+VLZ+25Lu463aaLLRuYAqUkqWaJ+yPHjNfeDoW8d0PDU5S2F/r/V8gdhxfH5IPzNJL2H2I5h25nbZ7+4hAxff88muatq9KJCw+u3gwFVcH6WkurCuxqrCI7ilt68xPoKphPy89H+u2pM3yGK7/w2MyU83ZwpDTJZvbNo0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=qUNBfaUF; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="qUNBfaUF" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2bd00a65673so529565ad.1 for ; Fri, 15 May 2026 12:20:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872830; x=1779477630; darn=vger.kernel.org; h=content-transfer-encoding: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=uYn60803QiVrZ6qwk1MLFZ7C4I/KRQoL9rhTP31HXeM=; b=qUNBfaUFBLy01At/mUS2IuuY0gC46ykaeHerlZHtMOa2zpyVD/cBBROYKAkiCfNtvA kX4VF5wBTQaeD6CPEb0Abqbx5mSCSC+1DXue1wsBt0IHmvu6wSvzLCHEZeux3ol17JAj X3elnEXnBglwocuVQ+DOlX0FAcE4BNUd8K6/MA/SR4lY0WYYVRfkNgnOEu11XqtiRtYp +cUonqlLlD7I+yWq4wXl8k7Xf74Z/Q/EfXQ6rzxP/UDLb+xqK+oPaCmTkavSYJ2aRPTS yJmFovltkNEsA9U5JuVyszX02JeckqqUzXhjY6eJnoH4IEkOCLlQbo+pTs6gSNEje+MK 5mZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872830; x=1779477630; h=content-transfer-encoding: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=uYn60803QiVrZ6qwk1MLFZ7C4I/KRQoL9rhTP31HXeM=; b=gtfttIPVV2hPy+wNRyp/NmC5iyFcfoQRGqWYxSZoTTj31rXZBoBqUNwYx1ZwI6RNB7 vgJ2N1gkG/3+9aptYaigF34V5YNxHWglmN86CY0pzwCYnfLSbFyS1SxiTm7dF3pGtMSm 3lAQKZfXVJ/UFP/n4rI8LH4Vaae46iWD7IBf2WYlkeMUbJ4RTBtiKWhHxnCzhoNBI5vF nwTuwiyPf9ZEMO/312AisIUlgWIvv7220ZOSKYWoWn9rZUuYwUOGtt/xJnInXtntF57l uI7EYWVesbAnF+GuA82uaejg3BtUczGyyYQhoMbAUJXyY0lkI9G/E6UibskLQ/zmQKVu ZfMg== X-Forwarded-Encrypted: i=1; AFNElJ/Qj6BOi2VZWx4GK2dXHnUIvezcFKjWej0WB31BhcggOy2JD48ZPQFcB1vxef9DNfrMaFaRMFqVhcTKkmk=@vger.kernel.org X-Gm-Message-State: AOJu0Yxt+r5oE9vwkD8KO9PvIb3xhUC8ufWpIwmhY9izhS9fLDZjx/bk xeLkkjd6pE10ZOlY7G13NpYK0Ibl9janfnQRhs8ySLBugVhW+bEm6YkLnMdAyn1YbiGvFN/E6lN IF/hLxA== X-Received: from plkj6.prod.google.com ([2002:a17:902:6906:b0:2bd:a0e6:1a81]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:3843:b0:2b0:6068:4c5f with SMTP id d9443c01a7336-2bd526ed865mr87328355ad.8.1778872829653; Fri, 15 May 2026 12:20:29 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:06 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-6-seanjc@google.com> Subject: [PATCH v3 05/41] x86/tdx: Override PV calibration routines with CPUID-based calibration From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When running as a TDX guest, explicitly override the TSC frequency calibration routine with CPUID-based calibration instead of potentially relying on a hypervisor-controlled PV routine. For TDX guests, CPUID.0x15 is always emulated by the TDX-Module, i.e. the information from CPUID is more trustworthy than the information provided by the hypervisor. To maintain backwards compatibility with TDX guest kernels that use native calibration, and because it's the least awful option, retain native_calibrate_tsc()'s stuffing of the local APIC bus period using the core crystal frequency. While it's entirely possible for the hypervisor to emulate the APIC timer at a different frequency than the core crystal frequency, the commonly accepted interpretation of Intel's SDM is that APIC timer runs at the core crystal frequency when that latter is enumerated via CPUID: The APIC timer frequency will be the processor=E2=80=99s bus clock or core crystal clock frequency (when TSC/core crystal clock ratio is enumerated in CPUID leaf 0x15). If the hypervisor is malicious and deliberately runs the APIC timer at the wrong frequency, nothing would stop the hypervisor from modifying the frequency at any time, i.e. attempting to manually calibrate the frequency out of paranoia would be futile. Deliberately leave the CPU frequency calibration routine as is, since the TDX-Module doesn't provide any guarantees with respect to CPUID.0x16. Opportunistically add a comment explaining that CoCo TSC initialization needs to come after hypervisor specific initialization. Cc: Kirill A. Shutemov Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/coco/tdx/tdx.c | 30 +++++++++++++++++++++++++++--- arch/x86/include/asm/tdx.h | 2 ++ arch/x86/kernel/tsc.c | 8 ++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/arch/x86/coco/tdx/tdx.c b/arch/x86/coco/tdx/tdx.c index 29b6f1ed59ec..26890cea790b 100644 --- a/arch/x86/coco/tdx/tdx.c +++ b/arch/x86/coco/tdx/tdx.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -1123,9 +1124,6 @@ void __init tdx_early_init(void) =20 setup_force_cpu_cap(X86_FEATURE_TDX_GUEST); =20 - /* TSC is the only reliable clock in TDX guest */ - setup_force_cpu_cap(X86_FEATURE_TSC_RELIABLE); - cc_vendor =3D CC_VENDOR_INTEL; =20 /* Configure the TD */ @@ -1195,3 +1193,29 @@ void __init tdx_early_init(void) =20 tdx_announce(); } + +static unsigned long tdx_get_tsc_khz(void) +{ + struct cpuid_tsc_info info; + + if (WARN_ON_ONCE(cpuid_get_tsc_freq(&info))) + return 0; + + lapic_timer_period =3D info.crystal_khz * 1000 / HZ; + + return info.tsc_khz; +} + +void __init tdx_tsc_init(void) +{ + /* TSC is the only reliable clock in TDX guest */ + setup_force_cpu_cap(X86_FEATURE_TSC_RELIABLE); + setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); + + /* + * Override the PV calibration routines (if set) with more trustworthy + * CPUID-based calibration. The TDX module emulates CPUID, whereas any + * PV information is provided by the hypervisor. + */ + tsc_register_calibration_routines(tdx_get_tsc_khz, NULL); +} diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h index 15eac89b0afb..60deab0ed979 100644 --- a/arch/x86/include/asm/tdx.h +++ b/arch/x86/include/asm/tdx.h @@ -57,6 +57,7 @@ struct ve_info { #ifdef CONFIG_INTEL_TDX_GUEST =20 void __init tdx_early_init(void); +void __init tdx_tsc_init(void); =20 void tdx_get_ve_info(struct ve_info *ve); =20 @@ -78,6 +79,7 @@ void __init tdx_dump_td_ctls(u64 td_ctls); #else =20 static inline void tdx_early_init(void) { }; +static inline void tdx_tsc_init(void) { } static inline void tdx_halt(void) { }; =20 static inline bool tdx_early_handle_ve(struct pt_regs *regs) { return fals= e; } diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 243999692aea..e00f53e3dd8d 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -34,6 +34,7 @@ #include #include #include +#include =20 unsigned int __read_mostly cpu_khz; /* TSC clocks / usec, not used here */ EXPORT_SYMBOL(cpu_khz); @@ -1559,8 +1560,15 @@ void __init tsc_early_init(void) if (is_early_uv_system()) return; =20 + /* + * Do CoCo specific "secure" TSC initialization *after* hypervisor + * platform initialization so that the secure variant can override the + * hypervisor's PV calibration routine with a more trusted method. + */ if (cc_platform_has(CC_ATTR_GUEST_SNP_SECURE_TSC)) snp_secure_tsc_init(); + else if (boot_cpu_has(X86_FEATURE_TDX_GUEST)) + tdx_tsc_init(); =20 if (!determine_cpu_tsc_frequencies(true)) return; --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B4D6738D6B8 for ; Fri, 15 May 2026 19:20:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872833; cv=none; b=fhw84O9II8Sy/PPQ3RKMK6AsIhOZnYYTMG3RiEZcODcYrjVCmHupo1tL4fEOJuXpaXB0Sf3CYYMJ6gv6f+y9hU72bM8mTXxzWmSswI9QvPNU5uISuVoMuWXBBCvMayJRzD+CY1y8JNc3RVHQhQ/IgVHk9Vo21N9PBYBz+z0Qic8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872833; c=relaxed/simple; bh=IfVwAYhwhIxzw01+s7FehLy05itlzurZzA6D640hoDk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=rhB1K64C/Xw6RLWgWarf2mMuEdoUhSbdxja9EvhqZ9HMEICq9010Bb9evRzojpKh6Tii663uN2ErwPTuTrzd0w/ckbr6hoAsxIYEyJzyD19nrhKH89OMydYvrIbUPZ37xaCO+kmzwLpzbaXpFtKpZYFFpDf/mt8PXSKdRgE8V6w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=U8YlEJ6H; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="U8YlEJ6H" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-369166fe5e3so82230a91.3 for ; Fri, 15 May 2026 12:20:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872831; x=1779477631; darn=vger.kernel.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=SQlmIR1hnrcjkd+R45vwU7fSi2OSjNiqFudElplFZs0=; b=U8YlEJ6HoUh6A3rfbMaIEGAWKIKPo9Cqf3U9VjLgbA9gTesU0m1V6n0Z0/EFksMpwG 50q39fdTt/uOr8EWix+h3ZZEc+7UuNI5r2hfGqAiDP9UVZENlziy+RGmNvAOxWztKcEU uIONtnG8sodHjaEBrG8ZGIRtkOnmzbimc9BAb41bnLD8soUc1zoU+Ir8eBLN+aZLq3FO 6914PtcUZRRkK2SD++Ddsfyf/FLq0wPk/2pC0C5o14L2vCV7Dw4qfk5EXEswwJhzk2gD VPl/9JQNjc/+dtjtSvJ3WjkdqtjyXY0pv7boLFHHKQGBIcmiuSYzi3Iwmydrp1V4GyIV y15g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872831; x=1779477631; 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=SQlmIR1hnrcjkd+R45vwU7fSi2OSjNiqFudElplFZs0=; b=ZhxL2PCdEPZwVJ5+wu/s5SVGIfx3KihlSUdSZbP2Oiald8EbKvGRJfk6JcSqWZhFhm IzBldpyfcJCQ8y0ZZiBPKKv62Uh4zQljkQQUttPJk/3AzKiBah1SK7JAcMUfv4hBujpQ 86c9pKRVFaomPiO5n7JlKuIef1L9gqRVzmxxcxTV9IiQzFmywWz2D9pkUYhduBkbGsPg nhx2FJkqDD83Kw23oerIM/dWtUy+NlvBwBUFCRHrGl9Dfmo80m/4EMqvBtmcSDhDRazl T6GY+Up05KsjG8QJ0q0FsJ0j0FBKMZE4QhSz71wliZjUakV2TsYfsn1hx9sjN7xXDe5V DOOw== X-Forwarded-Encrypted: i=1; AFNElJ/oE9S0XsaaUG+047K5MOvm75J3dTFXoYm7u4HtevIPhCJMTWqsvWdlSSDcophx39QYfmJvuixPRfbF5dc=@vger.kernel.org X-Gm-Message-State: AOJu0YxfZF2/KGlhfLdu77Xjel4KffTCWRzSkICezPm3v9ySyxl/HSNT Z48iONRsdFs5oc9CPdXAGFRTWF9sYPyzAia4KKIXwujtCN78qTeyafVA1uvRn0UgMGIei4xwMxP KzTJDFw== X-Received: from pgmt14.prod.google.com ([2002:a63:224e:0:b0:c80:2399:151]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2fc4:b0:368:85fb:7b8b with SMTP id 98e67ed59e1d1-36951cb936amr5644652a91.22.1778872830766; Fri, 15 May 2026 12:20:30 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:07 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-7-seanjc@google.com> Subject: [PATCH v3 06/41] x86/acrn: Mark TSC frequency as known when using ACRN for calibration From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Mark the TSC frequency as known when using ACRN's PV CPUID information. Per commit 81a71f51b89e ("x86/acrn: Set up timekeeping") and common sense, the TSC freq is explicitly provided by the hypervisor. Signed-off-by: Sean Christopherson --- arch/x86/kernel/cpu/acrn.c | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/x86/kernel/cpu/acrn.c b/arch/x86/kernel/cpu/acrn.c index c1506cb87d8c..2da3de4d470e 100644 --- a/arch/x86/kernel/cpu/acrn.c +++ b/arch/x86/kernel/cpu/acrn.c @@ -29,6 +29,7 @@ static void __init acrn_init_platform(void) /* Install system interrupt handler for ACRN hypervisor callback */ sysvec_install(HYPERVISOR_CALLBACK_VECTOR, sysvec_acrn_hv_callback); =20 + setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); tsc_register_calibration_routines(acrn_get_tsc_khz, acrn_get_tsc_khz); } --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 10E4C3921D1 for ; Fri, 15 May 2026 19:20:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872835; cv=none; b=XP7uA5EBKcFNPimvIiBp/q32sCpInraf1xMNJy90wYa3LEJVY4Metn0WE4x1jG6sZv6FqhHQmTlumWiNCWcf2n4U/fznsBzmklNIsTcBZa01akd5zyU1iEkCd/WMJbJyqhX2Ihe+BFQ1LpO0YPP1MABmx1BMdsmNqln3UzPIDfI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872835; c=relaxed/simple; bh=JiniyiHqLkNeMouNxSmIKJrAhaDkGLDvcienLMupPPk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=E5hIV3qq4lJ1cSLTRxN2bZXAnj1gCpmijPGVGLfuCtOIk75HNnm6Un8LLZGiEGjEHlfqfzUxbcAI0VwEgliPXAqyzAH0ruyxWz8gf9VNMb0eYQJZxi/PPupgZvKskD5mxehnU5BAaAMb+Pd8/5KCNFmiP0oXabnUDCQvTn3CtCE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=WclADAn3; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="WclADAn3" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-836d0184333so238445b3a.0 for ; Fri, 15 May 2026 12:20:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872832; x=1779477632; darn=vger.kernel.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=a7rFpf+FBNzzfzzETx/AclsYanbj3gnBq18rs01MCT0=; b=WclADAn3klIiCYaM6+khF62UeH3TgVMoF1INvu5iEFrZf1wIjcbZqO01i1d2QTP0kQ x2maQnJYOjHdywOMsniYw4wRwpaGX01p5T/ow2/nPVCfNlBclc3M4Z2aqw4tbWcY6+k6 isWAQpzoTXZkXPHKw+QfSfOowJJAfA1QVuC5yg/mvASBBvvAb4YlttV1IebF61HUDgi3 IcRl49FujiK6RX0G8/ZIwrFNtkbYu9ieUP2WGNaYnmn9vJRIuhsk1b47OnLDVfAnVYpC iOM/pN1PoYkGZdxj3JWkwQymK6C1bnzhATFGe3nrWSY6ELj5dEJz1687iojusMtMhN6Y a2ow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872832; x=1779477632; 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=a7rFpf+FBNzzfzzETx/AclsYanbj3gnBq18rs01MCT0=; b=OP3kLmjfqDbuRjVn2Httv7xqVah9m9RkRpzBgjbtoH5kk/8vO99sJpcwrW2cZczRk8 E599jgjkUUZrs9paApiTTdU4VViHS4l7piGa+hmNwsPR8RfIQn8IUZlC4WIxf1Es7QuA BakORdQgFMm/poD2hx6G/MjcShRQKhFIeOJsnrb1hjS83Nllyk/whVNIUWyUYgX2tzAA qQb/JWH0JXC7WoXcxVDU8xgknn/JqVLPbvUykHr4pEQg2L/+RbcWMuPjfqSjXlZcLkBN IVRcS0PdyEYhDr1dQNVEVfYYl6C7/W6maqIAGnU8hbC4/aWSYW6N+a6zEwewztvaqJ23 ylkA== X-Forwarded-Encrypted: i=1; AFNElJ/DGNZIxzVggA5U/1o9k9qdBOFsRZ0CMTTAUAmWzOBoph1WStKlcPtoNPPAxNmAx7Bm0ikiTwB+LyZKnqc=@vger.kernel.org X-Gm-Message-State: AOJu0YzoSZV8tp3lbc77WP8XXriSlrX2fu8Idu5zAi4KDCmrUZX5mkAz 5MZDhVmyMVeHDYfbN53kXpq06lKB4qDStBJs5xLBeCnuABnkrZ6JQvbx4tVaSYP5i2HpNMeDBTr KwFtVxQ== X-Received: from pfbfk26.prod.google.com ([2002:a05:6a00:3a9a:b0:83e:fb05:9740]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3689:b0:837:7e7d:3c8 with SMTP id d2e1a72fcca58-83f33df5086mr5912339b3a.39.1778872831848; Fri, 15 May 2026 12:20:31 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:08 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-8-seanjc@google.com> Subject: [PATCH v3 07/41] clocksource: hyper-v: Register sched_clock save/restore iff it's necessary From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Register the Hyper-V reference counter (refcounter) callbacks for saving and restoring its PV sched_clock, if and only if the refcounter is actually being used for sched_clock. Currently, Hyper-V overrides the save/restore hooks if the reference TSC available, whereas the Hyper-V refcounter code only overrides sched_clock if the reference TSC is available *and* it's not invariant. The flaw is effectively papered over by invoking the "old" save/restore callbacks as part of save/restore, but that's unnecessary and fragile. To avoid introducing more complexity, and to allow for additional cleanups of the PV sched_clock code, move the save/restore hooks and logic into hyperv_timer.c and simply wire up the hooks when overriding sched_clock itself. Note, while the Hyper-V refcounter code is intended to be architecture neutral, CONFIG_PARAVIRT is firmly x86-only, i.e. adding a small amount of x86 specific code (which will be reduced in future cleanups) doesn't meaningfully pollute generic code. Reviewed-by: Michael Kelley Tested-by: Michael Kelley Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/kernel/cpu/mshyperv.c | 58 ------------------------------ drivers/clocksource/hyperv_timer.c | 50 ++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 58 deletions(-) diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index 8d2401be420c..5ca139ae50b4 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c @@ -275,63 +275,6 @@ static void hv_guest_crash_shutdown(struct pt_regs *re= gs) } #endif /* CONFIG_CRASH_DUMP */ =20 -static u64 hv_ref_counter_at_suspend; -static void (*old_save_sched_clock_state)(void); -static void (*old_restore_sched_clock_state)(void); - -/* - * Hyper-V clock counter resets during hibernation. Save and restore clock - * offset during suspend/resume, while also considering the time passed - * before suspend. This is to make sure that sched_clock using hv tsc page - * based clocksource, proceeds from where it left off during suspend and - * it shows correct time for the timestamps of kernel messages after resum= e. - */ -static void save_hv_clock_tsc_state(void) -{ - hv_ref_counter_at_suspend =3D hv_read_reference_counter(); -} - -static void restore_hv_clock_tsc_state(void) -{ - /* - * Adjust the offsets used by hv tsc clocksource to - * account for the time spent before hibernation. - * adjusted value =3D reference counter (time) at suspend - * - reference counter (time) now. - */ - hv_adj_sched_clock_offset(hv_ref_counter_at_suspend - hv_read_reference_c= ounter()); -} - -/* - * Functions to override save_sched_clock_state and restore_sched_clock_st= ate - * functions of x86_platform. The Hyper-V clock counter is reset during - * suspend-resume and the offset used to measure time needs to be - * corrected, post resume. - */ -static void hv_save_sched_clock_state(void) -{ - old_save_sched_clock_state(); - save_hv_clock_tsc_state(); -} - -static void hv_restore_sched_clock_state(void) -{ - restore_hv_clock_tsc_state(); - old_restore_sched_clock_state(); -} - -static void __init x86_setup_ops_for_tsc_pg_clock(void) -{ - if (!(ms_hyperv.features & HV_MSR_REFERENCE_TSC_AVAILABLE)) - return; - - old_save_sched_clock_state =3D x86_platform.save_sched_clock_state; - x86_platform.save_sched_clock_state =3D hv_save_sched_clock_state; - - old_restore_sched_clock_state =3D x86_platform.restore_sched_clock_state; - x86_platform.restore_sched_clock_state =3D hv_restore_sched_clock_state; -} - #ifdef CONFIG_X86_64 DEFINE_STATIC_CALL(hv_hypercall, hv_std_hypercall); EXPORT_STATIC_CALL_TRAMP_GPL(hv_hypercall); @@ -739,7 +682,6 @@ static void __init ms_hyperv_init_platform(void) =20 /* Register Hyper-V specific clocksource */ hv_init_clocksource(); - x86_setup_ops_for_tsc_pg_clock(); hv_vtl_init_platform(); #endif /* diff --git a/drivers/clocksource/hyperv_timer.c b/drivers/clocksource/hyper= v_timer.c index e9f5034a1bc8..72b966340a46 100644 --- a/drivers/clocksource/hyperv_timer.c +++ b/drivers/clocksource/hyperv_timer.c @@ -537,10 +537,60 @@ static __always_inline void hv_setup_sched_clock(void= *sched_clock) #elif defined CONFIG_PARAVIRT #include =20 +static u64 hv_ref_counter_at_suspend; +static void (*old_save_sched_clock_state)(void); +static void (*old_restore_sched_clock_state)(void); + +/* + * Hyper-V clock counter resets during hibernation. Save and restore clock + * offset during suspend/resume, while also considering the time passed + * before suspend. This is to make sure that sched_clock using hv tsc page + * based clocksource, proceeds from where it left off during suspend and + * it shows correct time for the timestamps of kernel messages after resum= e. + */ +static void save_hv_clock_tsc_state(void) +{ + hv_ref_counter_at_suspend =3D hv_read_reference_counter(); +} + +static void restore_hv_clock_tsc_state(void) +{ + /* + * Adjust the offsets used by hv tsc clocksource to + * account for the time spent before hibernation. + * adjusted value =3D reference counter (time) at suspend + * - reference counter (time) now. + */ + hv_adj_sched_clock_offset(hv_ref_counter_at_suspend - hv_read_reference_c= ounter()); +} +/* + * Functions to override save_sched_clock_state and restore_sched_clock_st= ate + * functions of x86_platform. The Hyper-V clock counter is reset during + * suspend-resume and the offset used to measure time needs to be + * corrected, post resume. + */ +static void hv_save_sched_clock_state(void) +{ + old_save_sched_clock_state(); + save_hv_clock_tsc_state(); +} + +static void hv_restore_sched_clock_state(void) +{ + restore_hv_clock_tsc_state(); + old_restore_sched_clock_state(); +} + static __always_inline void hv_setup_sched_clock(void *sched_clock) { /* We're on x86/x64 *and* using PV ops */ paravirt_set_sched_clock(sched_clock); + + old_save_sched_clock_state =3D x86_platform.save_sched_clock_state; + x86_platform.save_sched_clock_state =3D hv_save_sched_clock_state; + + old_restore_sched_clock_state =3D x86_platform.restore_sched_clock_state; + x86_platform.restore_sched_clock_state =3D hv_restore_sched_clock_state; } #else /* !CONFIG_GENERIC_SCHED_CLOCK && !CONFIG_PARAVIRT */ static __always_inline void hv_setup_sched_clock(void *sched_clock) {} --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB93D3A0E8A for ; Fri, 15 May 2026 19:20:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872836; cv=none; b=J0SeiDruOdqJvV8dOpgOMH4+NGh+YjUnXpj05DPYr/JUrU12PNmIbDbWiAYfeefkxaRgCyYYlsJEV6TqtQ2KvxWnbQUxga7CTAB1qDBpDOIlCpqdEWPoQVh7LZHhzw8QNG3yeeQfWXyavLeOwr7HWYc4trdoMh3IyqhsGxBYkDM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872836; c=relaxed/simple; bh=0OAy/73FzHT+UGKLaUEv1rdfbYM8J+GWTsfDYnT1B0g=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=OGuR4yczauZ7Hi38WVZaE4J0YSAmai0SsVDCYbmJZYCZEN8srhn6hZeKipUiwH6qo5lDDtAgEkOveIho6odlc7iHcLrKBXviaOiau9WppA4+r7U/n1XqmZd78weIecH5ETu7evLuDgYDOnyEsdOuvVFzV2z/xsXsg84C037kyQk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=KUukGhM4; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="KUukGhM4" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c8024fc7032so167450a12.1 for ; Fri, 15 May 2026 12:20:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872833; x=1779477633; darn=vger.kernel.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=VjouJF8LEnMo7j8C1cTkogOjB+phr08sb021HWXTXd8=; b=KUukGhM4G5fA+K1NZs4DtP2VP4d2naxAddvtElyP+B6tLgedHHjO14N2Gjw9MLQ04v 2CBrcThBNcd3qcGvJu42nI6rZGDxMB5Sl5pwqqU4KlRhQGqNLIdmx4ChpzWlyxnh6vFH T48457XIvQzM8GpfTDb4yaqdadBqJiMY9mecgIxXdw/b0K+JNc5uZUMmXvZXPVY4p5oD w1fusHmud6kRQ+8awKJ+yi6z2bhwmkZbQTB1Zdazb0OGF0jbUvXXhcMXnb71+8OTnOp4 JTzQHi5F8y+xyR1SmF88Fm/rD9LbEti/AcVFANnZ3b4oIyw2S+Fv+kSoOnMGUXKfDH8k XVsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872833; x=1779477633; 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=VjouJF8LEnMo7j8C1cTkogOjB+phr08sb021HWXTXd8=; b=IJMbWR58Ek8DkINAO480X2huhJ/LXYVTHepeN+H4sISGmIZPPp/4eLtRbIgkMQehUh 3BAHnMraTjR6QojYiZKoAsPYDbZBhdjJ4Iw4pd0KKSzBM1A2gJMwX5Sm/xRHm0e5OQ9s v3po0zDM7X5C5ZNNLmXfVJAP6IaS7mGb1XKK94pDCMlX9yDBc62hKl67pm8YjSKfbPyS W95MDVvWP4thTaZGzB4sMfdH/SnMjwdNszR5Q3NCQalEwFX1uS/ENzbGYAPA8DfANac0 hdTrQ9qMB1F54M3F7v15OVZHVlm1AJtewC8JA9g9RCXmoLLp8aY/ePlwwzDsspRjOGKG w/Gg== X-Forwarded-Encrypted: i=1; AFNElJ/oRb0oF6JwjRtE/WeAgvUCFCgEAiGA+5xHHJlCjkBQA0D9ucyG4H4sDQBWtDfIaqXXg6vhLGWW4qwXjc0=@vger.kernel.org X-Gm-Message-State: AOJu0Yy3aPnp1evie/PMFC5auONfInU9jGJ+GFgOoVRIXV5soWOlOdFL CSPL5OpTE5puhoSdh1ojjTrcvmYX08ZWk4bMMlCv6I5qRoOVEpaTdpis2qwj8+t4HEROjpHCYTG ZBraz9Q== X-Received: from pfbcg6.prod.google.com ([2002:a05:6a00:2906:b0:836:ed4a:203f]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:72ab:b0:3a0:d88:6d6b with SMTP id adf61e73a8af0-3b22ecf592fmr6792680637.49.1778872833039; Fri, 15 May 2026 12:20:33 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:09 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-9-seanjc@google.com> Subject: [PATCH v3 08/41] clocksource: hyper-v: Drop wrappers to sched_clock save/restore helpers From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now that all of the Hyper-V reference counter sched_clock code is located in a single file, drop the superfluous wrappers for the save/restore flows. No functional change intended. Reviewed-by: Michael Kelley Tested-by: Michael Kelley Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- drivers/clocksource/hyperv_timer.c | 34 +++++------------------------- include/clocksource/hyperv_timer.h | 2 -- 2 files changed, 5 insertions(+), 31 deletions(-) diff --git a/drivers/clocksource/hyperv_timer.c b/drivers/clocksource/hyper= v_timer.c index 72b966340a46..69c1c7264e5d 100644 --- a/drivers/clocksource/hyperv_timer.c +++ b/drivers/clocksource/hyperv_timer.c @@ -472,17 +472,6 @@ static void resume_hv_clock_tsc(struct clocksource *ar= g) hv_set_msr(HV_MSR_REFERENCE_TSC, tsc_msr.as_uint64); } =20 -/* - * Called during resume from hibernation, from overridden - * x86_platform.restore_sched_clock_state routine. This is to adjust offse= ts - * used to calculate time for hv tsc page based sched_clock, to account for - * time spent before hibernation. - */ -void hv_adj_sched_clock_offset(u64 offset) -{ - hv_sched_clock_offset -=3D offset; -} - #ifdef HAVE_VDSO_CLOCKMODE_HVCLOCK static int hv_cs_enable(struct clocksource *cs) { @@ -548,12 +537,14 @@ static void (*old_restore_sched_clock_state)(void); * based clocksource, proceeds from where it left off during suspend and * it shows correct time for the timestamps of kernel messages after resum= e. */ -static void save_hv_clock_tsc_state(void) +static void hv_save_sched_clock_state(void) { + old_save_sched_clock_state(); + hv_ref_counter_at_suspend =3D hv_read_reference_counter(); } =20 -static void restore_hv_clock_tsc_state(void) +static void hv_restore_sched_clock_state(void) { /* * Adjust the offsets used by hv tsc clocksource to @@ -561,23 +552,8 @@ static void restore_hv_clock_tsc_state(void) * adjusted value =3D reference counter (time) at suspend * - reference counter (time) now. */ - hv_adj_sched_clock_offset(hv_ref_counter_at_suspend - hv_read_reference_c= ounter()); -} -/* - * Functions to override save_sched_clock_state and restore_sched_clock_st= ate - * functions of x86_platform. The Hyper-V clock counter is reset during - * suspend-resume and the offset used to measure time needs to be - * corrected, post resume. - */ -static void hv_save_sched_clock_state(void) -{ - old_save_sched_clock_state(); - save_hv_clock_tsc_state(); -} + hv_sched_clock_offset -=3D (hv_ref_counter_at_suspend - hv_read_reference= _counter()); =20 -static void hv_restore_sched_clock_state(void) -{ - restore_hv_clock_tsc_state(); old_restore_sched_clock_state(); } =20 diff --git a/include/clocksource/hyperv_timer.h b/include/clocksource/hyper= v_timer.h index d48dd4176fd3..a4c81a60f53d 100644 --- a/include/clocksource/hyperv_timer.h +++ b/include/clocksource/hyperv_timer.h @@ -38,8 +38,6 @@ extern void hv_remap_tsc_clocksource(void); extern unsigned long hv_get_tsc_pfn(void); extern struct ms_hyperv_tsc_page *hv_get_tsc_page(void); =20 -extern void hv_adj_sched_clock_offset(u64 offset); - static __always_inline bool hv_read_tsc_page_tsc(const struct ms_hyperv_tsc_page *tsc_pg, u64 *cur_tsc, u64 *time) --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2F7633C7E15 for ; Fri, 15 May 2026 19:20:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872837; cv=none; b=mVpLWLG65krdBAg/s2SDK9XOvVvBFRMsO5sDBWQ+30PRs4EH4viJkU9B/XeAxEAT7mh66W0NfFm0nYEA72z9mSO/pfcY7aV/7oRUuLZc+GzH9207D7Y+Qj7KfgTxkz67B3G0ot+JaJYnwPe3QHDjUYZsiJnWn9G31AacyQxN3Mw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872837; c=relaxed/simple; bh=5ZroqPTAiGiCjkjdUwgIH01/p3JgUmk9yrzxGnD97ko=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ed+7beUsU8ageQs6Jy1/n2xrKVjw8/Bqlgv1QUAaBIElooLqODiY1MzR2arLdUQQrqOtax0ZpIHlK0NIu5TTBU3tVQU4AWkHY9FCrws2V2qyBPGylhXEG5/EL+Cet1X6LDGPYZf3vUX384DZhhhlGrlm4Pf5MEzGyggpYlI4I+Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=od1d0dtK; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="od1d0dtK" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-8386367b23cso110754b3a.3 for ; Fri, 15 May 2026 12:20:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872834; x=1779477634; darn=vger.kernel.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=2d2hriGBYHFIT1h3oi40HlX5TSRUyuLIgvVXFrgjGyA=; b=od1d0dtKQea4g5h2wx1nLXnMZRIIhCn+9dNb2pRFkiEzqmNX8pA1TCKLwn+WcxDxTe u6+XoPq1VctC901ntJUaGEw8uLAxQHSDwqXDp56kVMdeuGrPVa/2aF2nnI1asnX4w/I9 zN3owAP9c0X9zDr1Rdw+exaXB47aJlF/qJ+X5kN2N8Cnbpya018G6zCEVKb0s18bWyuL m2ktBsj69fIdzywngTquGhNjdu8z1WuTwOEuqzGDDaGbtv/y1yoKZlx/7MOPGdyUIBrA taCUGXi7iG5VWIyY1JGGHu4/kRiIUorDrhyyH62aMIveUQkRbkBBVp9zKzOY2ECSwknH VEXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872834; x=1779477634; 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=2d2hriGBYHFIT1h3oi40HlX5TSRUyuLIgvVXFrgjGyA=; b=WJMAMi8VUJHRSHiRzK46ePyAeilrZ1MpSaK3ICxpEKDSdHvqKWCXrHrMHP2Gg6MCx7 37C9GBr/Mdh2MEv95ozg0yv+DlbqQDgkPqEf8iFFTsR1IAkSV0NYsjqfM3x2Emzg8Apt Wdc9mn5RmxFoqG3/Sg46Ang4V2nY8TTuyFpvj1OdwLFgCBfy2NfNwZ5XvhW/gypp9xSo 4TewIubH8bgtBUdBUUvqvQvEmUA9d+D6kCCNEyITNiHVXYSVO7wMGukKZnItRnI2cj7K 9jhn9nQfb/cJM6ZGWUDI/1W9tqbzJKB1saFflJ8jdBAD6sp5JZ6x7FmdejOwNpSWcevF lQbw== X-Forwarded-Encrypted: i=1; AFNElJ/un3ZoFbmPardKu5x6UiP5+j/Jn44ANS1VoYPZSWS9BZ2LSCJ+SeK2VmAPwcTEV2PzI+eRu9s5orfy+V4=@vger.kernel.org X-Gm-Message-State: AOJu0Yyap/bq+oNLR+JwAAj4Du3vGUZqnzo5Y3B9mYKO0Tt53zXuGXJs fgxse6Wjm9XtD/IKf1n3ZuldwQazYV1lTbA1+eiE/pF3+rYGtk3/KDvt9/aw7jQb2GTQ3RFEYys vTnUh8w== X-Received: from pfblg3.prod.google.com ([2002:a05:6a00:7083:b0:82f:bf29:61aa]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1ca4:b0:82c:6b1b:7ad4 with SMTP id d2e1a72fcca58-83f33bc808emr5114483b3a.3.1778872834057; Fri, 15 May 2026 12:20:34 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:10 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-10-seanjc@google.com> Subject: [PATCH v3 09/41] clocksource: hyper-v: Don't save/restore TSC offset when using HV sched_clock From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now that Hyper-V overrides the sched_clock save/restore hooks if and only sched_clock itself is set to the Hyper-V reference counter, drop the invocation of the "old" save/restore callbacks. When the registration of the PV sched_clock was done separately from overriding the save/restore hooks, it was possible for Hyper-V to clobber the TSC save/restore callbacks without actually switching to the Hyper-V refcounter. Enabling a PV sched_clock is a one-way street, i.e. the kernel will never revert to using TSC for sched_clock, and so there is no need to invoke the TSC save/restore hooks (and if there was, it belongs in common PV code). Reviewed-by: Michael Kelley Tested-by: Michael Kelley Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- drivers/clocksource/hyperv_timer.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/drivers/clocksource/hyperv_timer.c b/drivers/clocksource/hyper= v_timer.c index 69c1c7264e5d..ac1d9f9c381c 100644 --- a/drivers/clocksource/hyperv_timer.c +++ b/drivers/clocksource/hyperv_timer.c @@ -527,9 +527,6 @@ static __always_inline void hv_setup_sched_clock(void *= sched_clock) #include =20 static u64 hv_ref_counter_at_suspend; -static void (*old_save_sched_clock_state)(void); -static void (*old_restore_sched_clock_state)(void); - /* * Hyper-V clock counter resets during hibernation. Save and restore clock * offset during suspend/resume, while also considering the time passed @@ -539,8 +536,6 @@ static void (*old_restore_sched_clock_state)(void); */ static void hv_save_sched_clock_state(void) { - old_save_sched_clock_state(); - hv_ref_counter_at_suspend =3D hv_read_reference_counter(); } =20 @@ -553,8 +548,6 @@ static void hv_restore_sched_clock_state(void) * - reference counter (time) now. */ hv_sched_clock_offset -=3D (hv_ref_counter_at_suspend - hv_read_reference= _counter()); - - old_restore_sched_clock_state(); } =20 static __always_inline void hv_setup_sched_clock(void *sched_clock) @@ -562,10 +555,7 @@ static __always_inline void hv_setup_sched_clock(void = *sched_clock) /* We're on x86/x64 *and* using PV ops */ paravirt_set_sched_clock(sched_clock); =20 - old_save_sched_clock_state =3D x86_platform.save_sched_clock_state; x86_platform.save_sched_clock_state =3D hv_save_sched_clock_state; - - old_restore_sched_clock_state =3D x86_platform.restore_sched_clock_state; x86_platform.restore_sched_clock_state =3D hv_restore_sched_clock_state; } #else /* !CONFIG_GENERIC_SCHED_CLOCK && !CONFIG_PARAVIRT */ --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 420E53806DC for ; Fri, 15 May 2026 19:20:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872838; cv=none; b=pSdlplhLkUCsNbvpz4j0jqChx74uEXjhNYzViz+wG4YM+rllt8EiSsaWPsA7nZRiEw6PB6ahEnca5pQo9tdSuZbwkGTFoQuVxsOrUEVr18/NL/Hejp1ijqJMZR0rLuyBXAOkiaUqxnRehykRceGLq93YXEGkyUALDtyQco4Pm/I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872838; c=relaxed/simple; bh=O7JO2spBMPL1ycg94DN7ybYVsLuLSpeqr0A1pVho4MY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=rJjQVedK1A3WwE/NCv06MYkCe0YF7GmH7Qac7f9BmYxCvWrSC704eHRm2Y9P3D46hwFo8FjTnLFTd1dDr22wlilm0yS5ACUHaAAWHbW6X7A9mfkw6Rc0l0cA7Em/LUqwIR+ypwmKdQNWIMqPBle2ReKToTPmTcxxto43f+N61IU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=W3gcTTs0; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="W3gcTTs0" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c8292a9605aso157013a12.0 for ; Fri, 15 May 2026 12:20:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872835; x=1779477635; darn=vger.kernel.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=rYtqxRsyPTn9zcEDwit0IKYSbyTf6XV6vC/bmJj4kzY=; b=W3gcTTs0xZ1pVOhZzekF5vSgiEXKKW0oAZRgTqtB2EUuOJ0AYaV8gAN6WqtVx7pLkK 2De53pTaLyqFe7CnUBGZADI4/iR5KHPpsDYf7qxdpkuW/HUcqTvtIKfYneL4Z+RCL9PY PP7T+jW+tW2Usyt0C6cKfKn/fdW0JQV7sXpLva2LuEPmmrrgDycAOh1N8JLfYeMxq0lW wmwhT12P0SYGQHk29nJhnlOQVD+ZEUq9vmb9zJRXzEb+VI38Hqe0By7Sq8kdQFj5sINB hNVJnK2UmTI0a0IGfw0Nv/noA0r4nrOuctFnPhTEgVdbxqsaf6N+OEtW1KG9JvsYWTjh CuiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872836; x=1779477636; 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=rYtqxRsyPTn9zcEDwit0IKYSbyTf6XV6vC/bmJj4kzY=; b=mZIG90Nsuq2/7u/xJ2sWZBNxMRI2EB0youWSdDPeXZbv3rCZHRWOX2Wx45JlwH9q0x 5+WJqbR+p5FdacMYih/dH5u5R5HPej9dPxsU+eEcA9sXNxAO/DElwWPWfGiVJLWzMLaR s1jysum+VY1GhMblRxSdpyGZrHxjAlprGVn0dYuq0AX038Xi1m0gzQNqkUjj+tpFtQJD hQU3AsrB5KX1Sq8vPKUOQCMAU/0dwdVeoT4xbG7hkOIdQOIeHJKa96nsX4SN3em8YYxG kcyZVnjnG5++2Z2aD/dNLfGZSRBdVQcbDDkMgo4hXkEowQpL1z1/alPCEkZedIjFwx9Z D6DQ== X-Forwarded-Encrypted: i=1; AFNElJ/59iGHiUvY03gh31wfIitWbVjIQl2BZKKU8ZaMrHRs2iRnd8p3UnTeAvCFpraUOMRPmfOAf6bFFIP8CTE=@vger.kernel.org X-Gm-Message-State: AOJu0YylxtEXYDD8meDd4rD6R9/FOqhIs4iMq/Zf6/WxtBL1QlUS4uxK MGRy9qg2dffq5/J9UgkkCe3UnRX0QBlEEBKvlBr5tlbdiJMIvpITtq+9cCxTo6qGXUyUXzSIwuh In4Rwtw== X-Received: from pgbgj3.prod.google.com ([2002:a05:6a02:4943:b0:c73:8741:7555]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:6a24:b0:39c:241:65a3 with SMTP id adf61e73a8af0-3b22e6668b2mr6600745637.1.1778872835218; Fri, 15 May 2026 12:20:35 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:11 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-11-seanjc@google.com> Subject: [PATCH v3 10/41] x86/kvmclock: Setup kvmclock for secondary CPUs iff CONFIG_SMP=y From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Gate kvmclock's secondary CPU code on CONFIG_SMP, not CONFIG_X86_LOCAL_APIC. Originally, kvmclock piggybacked PV APIC ops to setup secondary CPUs. When that wart was fixed by commit df156f90a0f9 ("x86: Introduce x86_cpuinit.early_percpu_clock_init hook"), the dependency on a local APIC got carried forward unnecessarily. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/kernel/kvmclock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index e9e7394140dd..df95516a9d89 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -187,7 +187,7 @@ static void kvm_restore_sched_clock_state(void) kvm_register_clock("primary cpu clock, resume"); } =20 -#ifdef CONFIG_X86_LOCAL_APIC +#ifdef CONFIG_SMP static void kvm_setup_secondary_clock(void) { kvm_register_clock("secondary cpu clock"); @@ -325,7 +325,7 @@ void __init kvmclock_init(void) =20 x86_platform.get_wallclock =3D kvm_get_wallclock; x86_platform.set_wallclock =3D kvm_set_wallclock; -#ifdef CONFIG_X86_LOCAL_APIC +#ifdef CONFIG_SMP x86_cpuinit.early_percpu_clock_init =3D kvm_setup_secondary_clock; #endif x86_platform.save_sched_clock_state =3D kvm_save_sched_clock_state; --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C90B638C437 for ; Fri, 15 May 2026 19:20:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872844; cv=none; b=MGka4K5eV3bSJ0T6/4V7LY+HkidchFHXGH3HQxmXufLcQ6Wn31D2CUorR4zGaJiKY6tyQ6dafi1ee2CZYG7927z7CD8Z+77UEnaDzojn+6cgiz2+v2yV3Uw5J+bKP5qyRrO9eu6H8JMVMCM2zG24EKjhJ9CZYkm33QP3t/5UhSQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872844; c=relaxed/simple; bh=kRIdSZAEhRDIy6thx1PxO41yunUq4X5taCThhob60Ug=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=CgVeYKr9U/gQD/qvE5zoWBFatrtyDdYY+B4QWTLt0iO/9bDQHBM47VHNKacnpSATjI04cfzOdY3D56GAje7FrXlyWnqPYxmO2Vk7Qageyg/TvVMmuqueYDyTBlZQFypVTwksix0pNvnk5PHfgsn08BJ5WXE9PBbfuz2w2tnvR0g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=frtXgtAB; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="frtXgtAB" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c8024fc7032so167518a12.1 for ; Fri, 15 May 2026 12:20:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872842; x=1779477642; darn=vger.kernel.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=b0rQrOpjJ+Fm4CzrD79jMnHA824Fta4drwfB/O0XH0s=; b=frtXgtAB+UhY+IbJUC8AH7eQq50Y8IfEHNs2pCgc7gSMUqES7Oel5XkYCj4ODo1KnD QByKQQVSLp0hnbW57QKvRRNMkKzn4tuulMwXb16JjDXnsVar2Xa96ewIUeP/lnbaqGAm 96NWyuy/o73aycuQH7PoVHOZ1zz3BbK51GOwOqzTBKpYNp/VwR9os1vQTqSnMOfdYeKN L96t12XUfnSw9AySaMvdtkz+UTCkMv1knMAc+nTAjKf6yHpYHDnrhr/osTA1kopDMEKC Ird9lMKj8QIoMOXoUZ9vrH3dMdhthxrdRS3Tm3sagRqYhko8Gv+1EHaLCQ4WzlHplm3M 9zfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872842; x=1779477642; 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=b0rQrOpjJ+Fm4CzrD79jMnHA824Fta4drwfB/O0XH0s=; b=OHJFLC0OWP9gs40nkYOp43TckX3JcSUsioPCIr98Oaz0AbFCkgMbJG/R0INsPQosQv +N+URYuGUwdrqQlpcTLje1S2gcgh2ZMyywH9Z4LQZWUfSYD7kqbUBq20vKQNoY3yu6jG /j6NzuRzVUlGJ3+v04qHYZK5vfPnD+e6hH/z+ym1Qnpapq5JMavTb2rMWbupx/L8/biq 4YDtNVUQ7RCwePGZ3nLw5W9dEByGjupQ4rVOn06klX1VWDDRzeWxTgvydH8N2Uhyp3Q9 jBw22QAsRidTwowYTOn84EDPJxz73AsT1S98UDybqbACWQmetBR3gSCr5DciANGm4dPb 3ktw== X-Forwarded-Encrypted: i=1; AFNElJ8wplaq7+KxA3vtCR3W9zfG7nVTHGLzd4uX+rL29HRt8Xh7PK9SHUWV42t9VI/nTS7aP2xRhV2yTOVUUeU=@vger.kernel.org X-Gm-Message-State: AOJu0Yxeyk+XCM68FqZ1Ru+z2mCweK9Pzby4aPcVdaFgqzC3bedk/wBh TZTTeoR5JCLEmBF370PU3vLrZrSS1Bg9uWDfhXwX1WwSqb8zSvJX2ZRYOtFyWRCov6LnOPiu3w1 wgCF3NQ== X-Received: from pgbcr5.prod.google.com ([2002:a05:6a02:4105:b0:c80:2656:4e70]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:3299:b0:3a3:f936:2de6 with SMTP id adf61e73a8af0-3b22ebdbb23mr6517200637.26.1778872841995; Fri, 15 May 2026 12:20:41 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:12 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-12-seanjc@google.com> Subject: [PATCH v3 11/41] x86/kvm: Don't disable kvmclock on BSP in syscore_suspend() From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Don't disable kvmclock on the BSP during syscore_suspend(), as the BSP's clock is NOT restored during syscore_resume(), but is instead restored earlier via the sched_clock restore callback. If suspend is aborted, e.g. due to a late wakeup, the BSP will run without its clock enabled, which "works" only because KVM-the-hypervisor is kind enough to not clobber the shared memory when the clock is disabled. But over time, the BSP's view of time will drift from APs. Plumb in an "action" to KVM-as-a-guest and kvmclock code in preparation for additional cleanups to kvmclock's suspend/resume logic. Fixes: c02027b5742b ("x86/kvm: Disable kvmclock on all CPUs on shutdown") Cc: stable@vger.kernel.org Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/include/asm/kvm_para.h | 8 +++++++- arch/x86/kernel/kvm.c | 15 ++++++++------- arch/x86/kernel/kvmclock.c | 31 +++++++++++++++++++++++++------ 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_par= a.h index 4a47c16e2df8..2adba2aff539 100644 --- a/arch/x86/include/asm/kvm_para.h +++ b/arch/x86/include/asm/kvm_para.h @@ -118,8 +118,14 @@ static inline long kvm_sev_hypercall3(unsigned int nr,= unsigned long p1, } =20 #ifdef CONFIG_KVM_GUEST +enum kvm_guest_cpu_action { + KVM_GUEST_BSP_SUSPEND, + KVM_GUEST_AP_OFFLINE, + KVM_GUEST_SHUTDOWN, +}; + void kvmclock_init(void); -void kvmclock_disable(void); +void kvmclock_cpu_action(enum kvm_guest_cpu_action action); bool kvm_para_available(void); unsigned int kvm_arch_para_features(void); unsigned int kvm_arch_para_hints(void); diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 06534e16cfb5..0131bc1cb459 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -457,7 +457,7 @@ static void __init sev_map_percpu_data(void) } } =20 -static void kvm_guest_cpu_offline(bool shutdown) +static void kvm_guest_cpu_offline(enum kvm_guest_cpu_action action) { kvm_disable_steal_time(); if (kvm_para_has_feature(KVM_FEATURE_PV_EOI)) @@ -465,9 +465,10 @@ static void kvm_guest_cpu_offline(bool shutdown) if (kvm_para_has_feature(KVM_FEATURE_MIGRATION_CONTROL)) wrmsrq(MSR_KVM_MIGRATION_CONTROL, 0); kvm_pv_disable_apf(); - if (!shutdown) + if (action !=3D KVM_GUEST_SHUTDOWN) apf_task_wake_all(); - kvmclock_disable(); + + kvmclock_cpu_action(action); } =20 static int kvm_cpu_online(unsigned int cpu) @@ -723,7 +724,7 @@ static int kvm_cpu_down_prepare(unsigned int cpu) unsigned long flags; =20 local_irq_save(flags); - kvm_guest_cpu_offline(false); + kvm_guest_cpu_offline(KVM_GUEST_AP_OFFLINE); local_irq_restore(flags); return 0; } @@ -734,7 +735,7 @@ static int kvm_suspend(void *data) { u64 val =3D 0; =20 - kvm_guest_cpu_offline(false); + kvm_guest_cpu_offline(KVM_GUEST_BSP_SUSPEND); =20 #ifdef CONFIG_ARCH_CPUIDLE_HALTPOLL if (kvm_para_has_feature(KVM_FEATURE_POLL_CONTROL)) @@ -765,7 +766,7 @@ static struct syscore kvm_syscore =3D { =20 static void kvm_pv_guest_cpu_reboot(void *unused) { - kvm_guest_cpu_offline(true); + kvm_guest_cpu_offline(KVM_GUEST_SHUTDOWN); } =20 static int kvm_pv_reboot_notify(struct notifier_block *nb, @@ -789,7 +790,7 @@ static struct notifier_block kvm_pv_reboot_nb =3D { #ifdef CONFIG_CRASH_DUMP static void kvm_crash_shutdown(struct pt_regs *regs) { - kvm_guest_cpu_offline(true); + kvm_guest_cpu_offline(KVM_GUEST_SHUTDOWN); native_machine_crash_shutdown(regs); } #endif diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index df95516a9d89..006e3a13500b 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -178,8 +178,22 @@ static void kvm_register_clock(char *txt) pr_debug("kvm-clock: cpu %d, msr %llx, %s", smp_processor_id(), pa, txt); } =20 +static void kvmclock_disable(void) +{ + if (msr_kvm_system_time) + native_write_msr(msr_kvm_system_time, 0); +} + static void kvm_save_sched_clock_state(void) { + /* + * Stop host writes to kvmclock immediately prior to suspend/hibernate. + * If the system is hibernating, then kvmclock will likely reside at a + * different physical address when the system awakens, and host writes + * to the old address prior to reconfiguring kvmclock would clobber + * random memory. + */ + kvmclock_disable(); } =20 static void kvm_restore_sched_clock_state(void) @@ -187,6 +201,17 @@ static void kvm_restore_sched_clock_state(void) kvm_register_clock("primary cpu clock, resume"); } =20 +void kvmclock_cpu_action(enum kvm_guest_cpu_action action) +{ + /* + * Don't disable kvmclock on the BSP during suspend. If kvmclock is + * being used for sched_clock, then it needs to be kept alive until the + * last minute, and restored as quickly as possible after resume. + */ + if (action !=3D KVM_GUEST_BSP_SUSPEND) + kvmclock_disable(); +} + #ifdef CONFIG_SMP static void kvm_setup_secondary_clock(void) { @@ -194,12 +219,6 @@ static void kvm_setup_secondary_clock(void) } #endif =20 -void kvmclock_disable(void) -{ - if (msr_kvm_system_time) - native_write_msr(msr_kvm_system_time, 0); -} - static void __init kvmclock_init_mem(void) { unsigned long ncpus; --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9C79438D3E4 for ; Fri, 15 May 2026 19:20:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872846; cv=none; b=CSO0Nx/0Hp2GXS9Oqzfv43dsPbrVQOJ3lQFe/1LMx5TCgboR/I3JuTNiWujrfO1QKsnNnt5dKyBd2tiwIFMYmkOxqFwRsTQaHcOuoVwInxT3SDK8yv12ihDkMhJ7TPnPE2TupedtYrkL1cHKlNBY431y24QMpLUxoU3ToR2jkmI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872846; c=relaxed/simple; bh=nZsHt/XZy1AiJmrHTvYkKp5dep2GnBIAqllpDPOkXUg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=N3DM/BHtrHrDvoo+WBn5Awdg5IqZkzwiblBJXetnbWzZ1iaIbP0YUXuRtB7guQ7PqtRekHF1lvK3RNtTjmQ888NZsEVkzCczb9xRblJwPrHXIv5qjGfkfWOBphLaPvBnisGNC48ZR16utaFVWB7aHARtAZGQ4ZD9ntHeVI2TyUM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=D94p4rHg; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="D94p4rHg" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c8276c91addso70133a12.2 for ; Fri, 15 May 2026 12:20:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872844; x=1779477644; darn=vger.kernel.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=62wrPM0lWE30yV9zyxGJWUHaw5WRQ2hiTxFnD7TdkoU=; b=D94p4rHgTU0yQZ4+STPjHxznCh01PRZ4ZKJRsUHmkOsJcbte49BjU39ZO6VnHgK0L0 MXwpYQAcTF4r8hwgU0fDRgnwwyjy+erRNlRok1Q6TFHpQaqP0uGZqTheQ+ARBDPUQcFv qdQtVTxplpdbUcio41GvTuaEpin8iecAkrS4I3wXpfWFeaNh45EMW251hQZqcFdzOT4p LmuwtwAB73KgnineP3ubWYqORUU8X1lwwLchS5mSaBEccLCl2f5XS/PeC06x5uHOit1F go+jP/4hb7B6KWVBBAvJ3Sh6pwQXfmAGaIST0dnf5oO+OubFW+VzyhFuJ+Dy2HkIsSVm odEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872844; x=1779477644; 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=62wrPM0lWE30yV9zyxGJWUHaw5WRQ2hiTxFnD7TdkoU=; b=VWwnxPRYVPnROsdeXrrz1bnO5nPamObQ6KxHiORbakwAU51yjv7+99BZDY3jL/QGKT qD6TZ1F7CuMmKs5dzdpN/xYO3kbn16HWsdkVkajMIo8ozCykAZx47TBhpNI4BpYFMsLv suXB93q/UdHfb4TVLom+HmDwD/GmepyVZ3aZ/8/HUsztI0t93qTKuaTuGfdxbzyUiM5q q9MIbqwtfrvuzAYQ5Kc3mB20lXEiJbdtrRmYTB/NTgpka8a3gn9jpm6pBo9RGwibDM9i dTCFQ/3EF+FNKKU3dyUmIxfqu1tvMdgC8ld2IH9seKZcEbjNmIVdA2yHrfull14rrJOr 2LqQ== X-Forwarded-Encrypted: i=1; AFNElJ8sUZchi8xg7nz35O7HnIUDpzK081QCbvqsw+wvJ/w+Ow3b/JvRG5HFpU70Vx/El7bYpGVqhxtOeq/p1uw=@vger.kernel.org X-Gm-Message-State: AOJu0YxL0qjhPH4pEleGo/9ugRRaB3pXpPHc34J4vnWXB2fUID/OOQ1W O55u5Ryf9lqKp4ccwfSYMX1WhSHb45Iht82e7NaqZTfFM9IfqkGvcbG4fUuzTZJY31eN2MhD/Hs FzjyEkQ== X-Received: from pfbg4.prod.google.com ([2002:a05:6a00:ae04:b0:82f:c34b:9799]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:4193:b0:83e:eeab:aff8 with SMTP id d2e1a72fcca58-83f33d24d7cmr6075416b3a.25.1778872843406; Fri, 15 May 2026 12:20:43 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:13 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-13-seanjc@google.com> Subject: [PATCH v3 12/41] x86/paravirt: Remove unnecessary PARAVIRT=n stub for paravirt_set_sched_clock() From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Remove the unnecessary paravirt_set_sched_clock() stub for PARAVIRT=3Dn, as all callers are gated by PARAVIRT=3Dy. Eliminating the stub will avoid a pile of pointless churn as the "real" implementation evolves. No functional change intended. Fixes: 39965afb1151 ("x86/paravirt: Move paravirt_sched_clock() related cod= e into tsc.c") Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/include/asm/timer.h | 3 +++ arch/x86/kernel/tsc.c | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/timer.h b/arch/x86/include/asm/timer.h index fda18bcb19b4..c71b466d6ace 100644 --- a/arch/x86/include/asm/timer.h +++ b/arch/x86/include/asm/timer.h @@ -12,7 +12,10 @@ extern void recalibrate_cpu_khz(void); extern int no_timer_check; =20 extern bool using_native_sched_clock(void); + +#ifdef CONFIG_PARAVIRT void paravirt_set_sched_clock(u64 (*func)(void)); +#endif =20 /* * We use the full linear equation: f(x) =3D a + b*x, in order to allow diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index e00f53e3dd8d..021612c22b84 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -288,7 +288,6 @@ void paravirt_set_sched_clock(u64 (*func)(void)) u64 sched_clock_noinstr(void) __attribute__((alias("native_sched_clock"))); =20 bool using_native_sched_clock(void) { return true; } -void paravirt_set_sched_clock(u64 (*func)(void)) { } #endif =20 notrace u64 sched_clock(void) --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8DCAD38E129 for ; Fri, 15 May 2026 19:20:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872847; cv=none; b=HNmjSjG0Si3O4GtyZVpSHqIx1daDNte8eIV7BEwAxRzKdbfhcG4Q8l/WGc4dQAQIgKll52RGa2Zb9CDgfDDpcV5gyxzPfJRt7zimA7vhR0EeLgZTm0Kf0bmVw5P75bCxc2jwQnZ8TrEiqPJDE6YconTi7kLMhH9PXtpo1ltBW7c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872847; c=relaxed/simple; bh=lEMsR3dKvKq215PZd6emceDFTwLDtk70c4kzuFxS2LU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=qcSfiBsUwnXHJelDJfev09okPCbwBDBQoZUMesz/CF1yJ0GTvznxCFHalM6IlVccfaa48kRtcu1OAADsbxwAe+tYBruvd3pAvf46AAYOLXxZxCWAh/wesGiZjX2P6cbcdrG1NIGSlYLyIkk0967/VTDqJE27VpYqIn1VvILRI68= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=DBczljoL; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="DBczljoL" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c70f19f0f37so46289a12.0 for ; Fri, 15 May 2026 12:20:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872845; x=1779477645; darn=vger.kernel.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=/y8QjMIN78jXY0C38vMz/eIP3YtBj5/Xygk6fhPK+NQ=; b=DBczljoLqDv0LbZhlQBZdzdEFQwDvDuQ81LuTIL7GVKIYx1FAk//ngUGWCmJM0c876 L3+Mdt2glacWhIDY3ZaGnnX7uwGh6TsSV1IEUVTeprruG2bAZSQwX3Mo4/C8B31pJ0b/ 1QgWCMfzwGmN5+R0XU9PPqvjfXmxusKUb0c4EdhQO6FbS6d2ALr2diOs1Cj0gNG8fKgN OK2KvlqHH7HkQv/5N5wjp2U97e8Ophz5AF9BjHsKHZ2MSlkd/WXw3/QFiv1WX23Ew75F iEOAWfDV3nQ7uD6WS2AxuXCYkbptM/BHDDiw9B/90QeVyFnDQHheF3lQJCzcUKnJwB3X xnFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872845; x=1779477645; 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=/y8QjMIN78jXY0C38vMz/eIP3YtBj5/Xygk6fhPK+NQ=; b=nB4/zSx4qI6wy+X1PYSQpyZQyycZJcv9HM5XlreafApsxVE6Jg1ky1xIt9iLlEmmVY lsCGsQ80+qcfXXzEHE0sdX7FaBdj+2n+fNP631b796YPg7jJAuC9TA1rYdyf283ypDvn ugmWA8IjAjqhMfiNRneeRtF8o3BIayDuFrEYWzq23nCMPjF0lr+i7yz2P4rzQ6C2ikzw RHwA/snYsgmyGqgTLXWTj5ULg59iOzpp6psFywW2weS2mhkYiMltVLKseRxliOrPGFiR 9A+46lQanZVmTwAtLHu2/ZFxQkvQNY1aMXNNWkSTHaSO5Y6GVz0qgahQKQ/QZBHDvADE x4hA== X-Forwarded-Encrypted: i=1; AFNElJ9sH8OiKptKmqZBTUVcakIGGafazg8uhAVc39mcxpjIs3C9JlglaTiwmlxB81L5JGRO0PRMD3NYoNF5Zsw=@vger.kernel.org X-Gm-Message-State: AOJu0YwBYvLvHefWYXRt2atZ7VFY24Him/CKRl5fMWZIqtHPITvgKf2X NjA5GtcMjFsgblG2DKmPVIjOWBIyqzD4RekOuTGAiiEuaM9WDdSRiHhm7NIWu35Oz/e729Te1Cd NFbck6g== X-Received: from pgbda3.prod.google.com ([2002:a05:6a02:2383:b0:c73:bc95:cca8]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:4328:b0:3a2:cf6d:aa04 with SMTP id adf61e73a8af0-3b0bdd00bfbmr9342014637.8.1778872844563; Fri, 15 May 2026 12:20:44 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:14 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-14-seanjc@google.com> Subject: [PATCH v3 13/41] x86/paravirt: Move handling of unstable PV clocks into paravirt_set_sched_clock() From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the handling of unstable PV clocks, of which kvmclock is the only example, into paravirt_set_sched_clock(). This will allow modifying paravirt_set_sched_clock() to keep using the TSC for sched_clock in certain scenarios without unintentionally marking the TSC-based clock as unstable. No functional change intended. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/include/asm/timer.h | 7 ++++++- arch/x86/kernel/kvmclock.c | 5 +---- arch/x86/kernel/tsc.c | 5 ++++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/arch/x86/include/asm/timer.h b/arch/x86/include/asm/timer.h index c71b466d6ace..fe41d40a9ae6 100644 --- a/arch/x86/include/asm/timer.h +++ b/arch/x86/include/asm/timer.h @@ -14,7 +14,12 @@ extern int no_timer_check; extern bool using_native_sched_clock(void); =20 #ifdef CONFIG_PARAVIRT -void paravirt_set_sched_clock(u64 (*func)(void)); +void __paravirt_set_sched_clock(u64 (*func)(void), bool stable); + +static inline void paravirt_set_sched_clock(u64 (*func)(void)) +{ + __paravirt_set_sched_clock(func, true); +} #endif =20 /* diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 006e3a13500b..1cbdb48e5503 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -94,10 +93,8 @@ static noinstr u64 kvm_sched_clock_read(void) =20 static inline void kvm_sched_clock_init(bool stable) { - if (!stable) - clear_sched_clock_stable(); kvm_sched_clock_offset =3D kvm_clock_read(); - paravirt_set_sched_clock(kvm_sched_clock_read); + __paravirt_set_sched_clock(kvm_sched_clock_read, stable); =20 pr_info("kvm-clock: using sched offset of %llu cycles", kvm_sched_clock_offset); diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 021612c22b84..567d30b30a5a 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -280,8 +280,11 @@ bool using_native_sched_clock(void) return static_call_query(pv_sched_clock) =3D=3D native_sched_clock; } =20 -void paravirt_set_sched_clock(u64 (*func)(void)) +void __paravirt_set_sched_clock(u64 (*func)(void), bool stable) { + if (!stable) + clear_sched_clock_stable(); + static_call_update(pv_sched_clock, func); } #else --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A088338F629 for ; Fri, 15 May 2026 19:20:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872848; cv=none; b=aK9s4evfIh/XhpgTpeBmbz/R8clYxytGBOw93C3bjH/I2Dgo3BDllR3SQS5SeqW8BckFaHzdmAyCo1yTp04VJG+NVNd3imh2xiifqksHxkIs+L40kZx5cXNhLyGjV8nEYjFHjFuH2PH8/e5r3Nl/SraSdI3OWleJyMtdcGgP0zU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872848; c=relaxed/simple; bh=fjnHwbCJPRX9oMswM0r3TipsrON28nk7QcNfnWcx/yE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=q+yiyaSJJdGGxVClmSIdUbgxvHiJTUknbRR9QpU4Vn7qe/dH2BF9g7Cr9nzA5ge1nCfhz0M21rOSz3TKvz1jGD95FcO5NPTvV9um+GgRwZrWvbvXhVv/QA3obb/Gyyj9dbU9j7RBj7oaH59ANjLW+jAaTmNjU67yjC0IXhcwxv8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Wr9DxZ4a; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Wr9DxZ4a" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-366015bca9bso1077589a91.1 for ; Fri, 15 May 2026 12:20:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872846; x=1779477646; darn=vger.kernel.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=My3crpwV3+2u8Tw2CWdR3qBXb15QrHmR5xjox9czyEU=; b=Wr9DxZ4a2MuCWJ/A4uRs+nQ9xLmDSVRxSK3w0ktjQyG4EzwwrSikVMEHY8P/7XRkJb Yj8/qthWj44SthbRXQ6zMFwoaL3iFEYPSJwIz8sc89TcfEi/RsopIi+EDpYpOrVYijT/ NLUKm1dzS30ueMIWMMmqJYC5CC7Lii03SPRGKbGe9siwTfEUe2B87Om59YEeo9dXzw5Z +XXEELqpKcy7Sfncb2teaf+UyvpmA6eXV1QBEf5oALjL6rd9PtgSMo9nZl6gjbCGuMwB l3fjWwfhCE5qvG2M1TytPhNVk6OZVUfHKRYzA6iitJaAffs6KGqZV0d5SAeyoiTFFP35 reiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872846; x=1779477646; 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=My3crpwV3+2u8Tw2CWdR3qBXb15QrHmR5xjox9czyEU=; b=pMZPBw4bm7en3r7QJW6erC0AZ1hWbownuGCoXS4aR3SxbrKlYz00073td7O1yhnaML vXYpuZXHB6CcmoeKOUHo1D9C7RNZV2HHHNXNIxBPoyS+X5wLomkh9ZRG6NTdoWHqf5S5 R0NB7URLCyaQm3bg38wMND2BJkV13yokgOglmkc3jmKQ1f75DIIbwckyekv0du0R3SOG oHIm0viaVnlzJ0p1QUHoeEApZWx5bUMEgv6ZjYh0+A6MvZiE28hiClwQleZHopNCQPXz xYnBnzRd0ITFO7qGL5IzwrLEkAgICEr7jrBynIgh+Lm0H97rxspFVf/vAK4NPLZwGl3W noTA== X-Forwarded-Encrypted: i=1; AFNElJ98pDdY7CxCP4U1wWE2xoM8q4WYToDOLvb0N8tLcL7C8J7rPgeMYTkSh5qvS3SznH4LE71dBi8CCFKRX1k=@vger.kernel.org X-Gm-Message-State: AOJu0YxXDFlBtJD0eUZ9xcDBpdGFXPEbCP8EgdvE7shKsbcL8WrrkNnX d17hljDxP2fiSmh1VzSAGwIUlPRWn06pl2HVtcYvFOdeMGfwDf4GR4Q5kARULg9HoIjYEwIyNf4 whnGrNA== X-Received: from pgc15.prod.google.com ([2002:a05:6a02:2f8f:b0:c74:497:507e]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:5488:b0:368:7398:df8a with SMTP id 98e67ed59e1d1-369233192aamr8411686a91.4.1778872845655; Fri, 15 May 2026 12:20:45 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:15 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-15-seanjc@google.com> Subject: [PATCH v3 14/41] x86/kvmclock: Move sched_clock save/restore helpers up in kvmclock.c From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move kvmclock's sched_clock save/restore helper "up" so that they can (eventually) be referenced by kvm_sched_clock_init(). No functional change intended. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/kernel/kvmclock.c | 108 ++++++++++++++++++------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 1cbdb48e5503..800c3d65f0af 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -71,6 +71,25 @@ static int kvm_set_wallclock(const struct timespec64 *no= w) return -ENODEV; } =20 +static void kvm_register_clock(char *txt) +{ + struct pvclock_vsyscall_time_info *src =3D this_cpu_hvclock(); + u64 pa; + + if (!src) + return; + + pa =3D slow_virt_to_phys(&src->pvti) | 0x01ULL; + wrmsrq(msr_kvm_system_time, pa); + pr_debug("kvm-clock: cpu %d, msr %llx, %s", smp_processor_id(), pa, txt); +} + +static void kvmclock_disable(void) +{ + if (msr_kvm_system_time) + native_write_msr(msr_kvm_system_time, 0); +} + static u64 kvm_clock_read(void) { u64 ret; @@ -91,6 +110,30 @@ static noinstr u64 kvm_sched_clock_read(void) return pvclock_clocksource_read_nowd(this_cpu_pvti()) - kvm_sched_clock_o= ffset; } =20 +static void kvm_save_sched_clock_state(void) +{ + /* + * Stop host writes to kvmclock immediately prior to suspend/hibernate. + * If the system is hibernating, then kvmclock will likely reside at a + * different physical address when the system awakens, and host writes + * to the old address prior to reconfiguring kvmclock would clobber + * random memory. + */ + kvmclock_disable(); +} + +#ifdef CONFIG_SMP +static void kvm_setup_secondary_clock(void) +{ + kvm_register_clock("secondary cpu clock"); +} +#endif + +static void kvm_restore_sched_clock_state(void) +{ + kvm_register_clock("primary cpu clock, resume"); +} + static inline void kvm_sched_clock_init(bool stable) { kvm_sched_clock_offset =3D kvm_clock_read(); @@ -103,6 +146,17 @@ static inline void kvm_sched_clock_init(bool stable) sizeof(((struct pvclock_vcpu_time_info *)NULL)->system_time)); } =20 +void kvmclock_cpu_action(enum kvm_guest_cpu_action action) +{ + /* + * Don't disable kvmclock on the BSP during suspend. If kvmclock is + * being used for sched_clock, then it needs to be kept alive until the + * last minute, and restored as quickly as possible after resume. + */ + if (action !=3D KVM_GUEST_BSP_SUSPEND) + kvmclock_disable(); +} + /* * If we don't do that, there is the possibility that the guest * will calibrate under heavy load - thus, getting a lower lpj - @@ -162,60 +216,6 @@ static struct clocksource kvm_clock =3D { .enable =3D kvm_cs_enable, }; =20 -static void kvm_register_clock(char *txt) -{ - struct pvclock_vsyscall_time_info *src =3D this_cpu_hvclock(); - u64 pa; - - if (!src) - return; - - pa =3D slow_virt_to_phys(&src->pvti) | 0x01ULL; - wrmsrq(msr_kvm_system_time, pa); - pr_debug("kvm-clock: cpu %d, msr %llx, %s", smp_processor_id(), pa, txt); -} - -static void kvmclock_disable(void) -{ - if (msr_kvm_system_time) - native_write_msr(msr_kvm_system_time, 0); -} - -static void kvm_save_sched_clock_state(void) -{ - /* - * Stop host writes to kvmclock immediately prior to suspend/hibernate. - * If the system is hibernating, then kvmclock will likely reside at a - * different physical address when the system awakens, and host writes - * to the old address prior to reconfiguring kvmclock would clobber - * random memory. - */ - kvmclock_disable(); -} - -static void kvm_restore_sched_clock_state(void) -{ - kvm_register_clock("primary cpu clock, resume"); -} - -void kvmclock_cpu_action(enum kvm_guest_cpu_action action) -{ - /* - * Don't disable kvmclock on the BSP during suspend. If kvmclock is - * being used for sched_clock, then it needs to be kept alive until the - * last minute, and restored as quickly as possible after resume. - */ - if (action !=3D KVM_GUEST_BSP_SUSPEND) - kvmclock_disable(); -} - -#ifdef CONFIG_SMP -static void kvm_setup_secondary_clock(void) -{ - kvm_register_clock("secondary cpu clock"); -} -#endif - static void __init kvmclock_init_mem(void) { unsigned long ncpus; --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0749E3E0C7B for ; Fri, 15 May 2026 19:20:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872849; cv=none; b=gP9kTwaEeoWLVsjAJRxNYkIcQ5byWYTyRbi5pqmKzU1wAaOdSfuCUArWaGftgfmhDf91YOnb96n6kDmi0knx4AhZTozNSVjFpmQwvoOy0aTYrxrBxAi7M+WDegQyX4n9bW9269DMnUVS8TB7olv4ytbZuh0ZdSfpP0cImGIg1KE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872849; c=relaxed/simple; bh=bIvGpEwSZtu1dFGmRrUgP1xhupYQhI4tOk7weRcJRgU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=GeQBX5sLR9/avZU4jj8rwIRn+jv/RVfaJYRmvsHO+6IA+LxCewwuq+eoSzOHLMU47pYWMzJ0FxQCatyXph6/EEYrBpi8JtG6y/m4GF3TxJ/DCQ5Q8dF5lOOXnybmhUxSfDWmzuDLWeaH0j2XV1x4wfw2xc8Ydw/YST5GNEcJkYc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=tQMfOm8L; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="tQMfOm8L" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c82751074c8so238532a12.0 for ; Fri, 15 May 2026 12:20:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872847; x=1779477647; darn=vger.kernel.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=eVzC+1NNlxe1k/R0gBkxcy+TPbGnZzPB3ftmmd4+5ik=; b=tQMfOm8LUOPoHNGBjDvA0nt2CkSzXhx9m1zO+XHx3KeB/YBqu4clwgUwjB4OUsbpwq kF8Gt1gSAhVDlG1S6IBx+9b8QB04SqRZK1dskYZFXyGhZY6ZqN1F8RaiQgQ0KuSDqs20 7F+Af8csGSwtxvL0UIEzMOMJjuc/i2nRkvtlE2wWzlwQixm0O/enJrXs3SXZ+fl7qkFm 2oOgPrsQwICoFJna7OkaV4XRUX1DTwI8K6tAITICgYkjI+DJsEqqoPz8r9rQJloPWs1Y Rk6n8UsRT9J18hmvoCIOqcjxq0AbyApvkJ30CXGs/obIbUaqLso4VfH43tHBjEaQVNN6 laCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872847; x=1779477647; 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=eVzC+1NNlxe1k/R0gBkxcy+TPbGnZzPB3ftmmd4+5ik=; b=d8UL0j5kvH2jCKPeyfWTXiACH+df3yLmsMPewXF88xdoJf8vGZrroI97+o7FQRXG1a 0aA4Sa/cUqZh0P61nvcDESP4LFgH6OnFbzsvw2Wkhqofk/XFUndFL5NLznkCXDTBvkxm LIFvPBE2/5MNUnbziI+x1vIr3dwPNLbfyXQ/kdnEoFv4c29+ot94ecdpDewtNWGo/5Nx EgwWGCddpYDpyxkY1LNqTHU2TgDVkrtkURvtstY1B2AWQU7jkvN1xfUZpSZ9jLaap/8F cXISas3obJgaTn/bbcLtnea3mwOUwtSGIHVynooYQH6kwvTXEk3eKlyVaEVHLdIDhDRX 6Fzg== X-Forwarded-Encrypted: i=1; AFNElJ/+399DUg0XYpPpFcfy2ogtO3URXN+l6RGFjYkUjExg00U9sXSpy8xR4e/M1gUr+NYLnjLUUyYubyrowFo=@vger.kernel.org X-Gm-Message-State: AOJu0YwdGpYf/PbbksWgNN5uydWNGsk5gVXC4GbQPTa1NhkUR5kMM6XN 76jawrdk/5Ambajir05EaFFc48bYVDVq/9zHa/n40HhihciYN0TTYy5/cJpFsEo0BO7j5BdQEnW aE1tqfg== X-Received: from pfblu4.prod.google.com ([2002:a05:6a00:7484:b0:83a:58c1:f5e2]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1404:b0:829:9a7b:db84 with SMTP id d2e1a72fcca58-83f33f30bf8mr5787888b3a.49.1778872846903; Fri, 15 May 2026 12:20:46 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:16 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-16-seanjc@google.com> Subject: [PATCH v3 15/41] x86/xen/time: Nullify x86_platform's sched_clock save/restore hooks From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Nullify the x86_platform sched_clock save/restore hooks when setting up Xen's PV clock to make it somewhat obvious the hooks aren't used when running as a Xen guest (Xen uses a paravirtualized suspend/resume flow). Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/xen/time.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index 3d3165eef821..21d366d01985 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c @@ -568,6 +568,12 @@ static void __init xen_init_time_common(void) xen_sched_clock_offset =3D xen_clocksource_read(); static_call_update(pv_steal_clock, xen_steal_clock); paravirt_set_sched_clock(xen_sched_clock); + /* + * Xen has paravirtualized suspend/resume and so doesn't use the common + * x86 sched_clock save/restore hooks. + */ + x86_platform.save_sched_clock_state =3D NULL; + x86_platform.restore_sched_clock_state =3D NULL; =20 tsc_register_calibration_routines(xen_tsc_khz, NULL); x86_platform.get_wallclock =3D xen_get_wallclock; --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1C2A83E1234 for ; Fri, 15 May 2026 19:20:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872850; cv=none; b=JKKeLv5uUFE4uMfu2aFYx+GCwc0YNoKRfXbXHWl2GG6Uy1F/7mGVAT2At8mzzowbQvxA0jNFt+snd8UjJShaWVOcHGr8IvsM2XOMveLWAzFr9LmU0ZMI+Q1PT5YjFBqFrEkV6zeKkdpl2FNz7HD/ZaAzXTjLdzcrXZ4HNV6ZzcA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872850; c=relaxed/simple; bh=7t7bZAkjWH8tEuvlMroGRphDuT5a2BO5RqjwXybBung=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=I5F9cTT1emUpECFfmpOLGXfoayyTgpO/IBaZiYqCRmItL0gWhFj6/8GzSanJo6wjgHb6N01S2GXkhkkESCwoFhMlR9P/rwhidctVIsnkfV1Iqh22U2E6luCpny0b9t/5/+twDjBCLVJb6tB0S6m1qRILACu7mtJ1X/6rg1jHP9I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=MQKdmMYz; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="MQKdmMYz" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c8279604464so193593a12.1 for ; Fri, 15 May 2026 12:20:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872848; x=1779477648; darn=vger.kernel.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=c0VSXuwvwTL0EdvBxlPRCLOC48TzlA2S3UU4EaITdRg=; b=MQKdmMYzTBG8D2ABaPQCcAEXqkCMCGJv6YwKGlaX17DMGnVCbdP3MUgauOOEQVKXMw A1acNcHqJLtVxzGoElkRdW00I+B6Eq/ogRlIhwAHxHQBb7DI7LU0YLJhPBCP/Tfmqlbq qdX76nD9qXo8PynEjKxwaLLRclGgRG+c8tzwVHdcQHcb5Jr9xZY1vbBqM5EfNoBaVDsQ 8GTii7EzsxR8ngTFNT1kJRBts7PgUylrNdnGQAyzy/J934KhT7vEkfCcC+4HesscZh29 66XT19rx4KZdOoE7LWfYTKMlNy9umwj4UPDZr0Bj9VjvIWedfr6+hPzz4WF40enA78Ce UBCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872848; x=1779477648; 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=c0VSXuwvwTL0EdvBxlPRCLOC48TzlA2S3UU4EaITdRg=; b=AravglIS8LyK4FCwAwfUYZfjrWU0PrdQEHJ3YGP6/MasC56Vb7yr79TLnkskOTK3qw JBBI5OHCVJssNu39pof3fVxQR8mc6Ggs55Ogaw8aGdM67D3HXBBDDv/vRlWVhHL97mFK AllU7FOPHxuz9ciDF5gQeI92WtztAwTiIMwhBpFYfbSNiujNzo9WfqHWZJjyUaARBFdf 6q03waAOuuK2Vuj6QBI4GJnG5MIy5fqiCaL9ug8BgA67pt+BvwN96Qp/439YJCiomjg1 /L/SJZBKx5nhJFJZ3w9XRWTYH2euaO24r8z7k+z3HQSSkXvyOmKTdHKcuxc3/EnMUWiI 8Xvg== X-Forwarded-Encrypted: i=1; AFNElJ8XxgJAUdh0ax7nvduiQIEYbb/Ejd3IC/dA5fhhEyV9XVYRhBUrd/wUpUmO+uWfXutzOg1Eq4+X98LUinc=@vger.kernel.org X-Gm-Message-State: AOJu0Yzr7eXgsTPfG4YnKSGbhBWLLH4BRxQWj6bCwz4AaQgP1A41kodj eQW7LEW2gcxxDKvL353xddzb/K5JerupkWH6Qpyr7cQD1dXVviiuIzQBnFeRgIgIaWiBzQ7t0r3 4sXpvjw== X-Received: from pfbff26.prod.google.com ([2002:a05:6a00:2f5a:b0:83e:dfc6:971]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1908:b0:82f:50cd:e586 with SMTP id d2e1a72fcca58-83f33cb2c40mr5886442b3a.13.1778872848066; Fri, 15 May 2026 12:20:48 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:17 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-17-seanjc@google.com> Subject: [PATCH v3 16/41] x86/vmware: Nullify save/restore hooks when using VMware's sched_clock From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Nullify the sched_clock save/restore hooks when using VMware's version of sched_clock. This will allow extending paravirt_set_sched_clock() to set the save/restore hooks, without having to simultaneously change the behavior of VMware guests. Note, it's not at all obvious that it's safe/correct for VMware guests to do nothing on suspend/resume, but that's a pre-existing problem. Leave it for a VMware expert to sort out. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/kernel/cpu/vmware.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c index b88d9ca01202..b5cb66ca022b 100644 --- a/arch/x86/kernel/cpu/vmware.c +++ b/arch/x86/kernel/cpu/vmware.c @@ -347,8 +347,11 @@ static void __init vmware_paravirt_ops_setup(void) =20 vmware_cyc2ns_setup(); =20 - if (vmw_sched_clock) + if (vmw_sched_clock) { paravirt_set_sched_clock(vmware_sched_clock); + x86_platform.save_sched_clock_state =3D NULL; + x86_platform.restore_sched_clock_state =3D NULL; + } =20 if (vmware_is_stealclock_available()) { has_steal_clock =3D true; --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3E2E53E1721 for ; Fri, 15 May 2026 19:20:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872851; cv=none; b=gX46USJIPm1h7OuRsCNYX6Zzs7EV8OYnXSk/A7As4sb3XrtkgzLmV9u8eEkYrNfzp7yoUUUywly1Kf3XlyGiOB3xGrISb67UOxTyqVEPgyA5lzvHn+KJV2SEMRv4yW+DlCzacQNfIW5rXx9+ogcIlPkxF7njb0+B2DP13PP4HrM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872851; c=relaxed/simple; bh=VGy+qLRWGOmAxsBGFeiFDyGswDSrJi4JQ5o9B+Fv8MU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=q5d+yKPQ0YT/t73ZZQ4BnRR3j6CW3PJrFxY0MMJYSfqCCVTP3FIWAwILIUNd5EspPouO985g66NySsRYX2WxX6tJzkO1aMAugv3WAPitSR65+z+ZcmnHgbrgq9Fysr6rw2qSz/4PCSFDWMI++nc6OheDktcEoM913dXilAYlANM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=X/N4q977; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="X/N4q977" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-837cc5bc6deso94372b3a.3 for ; Fri, 15 May 2026 12:20:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872849; x=1779477649; darn=vger.kernel.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=HUz/DYTZsMDp3XmDdx4uAZCV01b5NalrmHfGrDrQY4I=; b=X/N4q977l45ITMvll/o0+19guoFFUzxLB98uebW0VHaX5g1ESYoQcY1gm4J7J68uAK eNANpepCp+hfuEVQFDB0cK+WZnMxyypsOWfHpikWrR/1W1liCKDNCCt3VvI94ry6sL+N ZMmVfe3GB71WPKZZWlTfkYQoUhqgnt2CYGK7OSuZu4aYLbVgckPVRutwiZ1vLajkusK4 abciy5J/7KTbhz0j1cnW+Q8p9ZTK2bqSwBNx+GzIrAK/owHrOROSMOFC/YEgF49E27+k luy9LifUxLCS6088HLQLTSzDs/A6J97LYu9WSpHihGiARsHfhmkLtWCOpwDw8oS8YnVP FM4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872849; x=1779477649; 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=HUz/DYTZsMDp3XmDdx4uAZCV01b5NalrmHfGrDrQY4I=; b=sed7MlEpChHJRkQyiPCqwNGv9+bf1cmyFdr3AW81OZVulynH9XBHaRRaex33MfI/SI UI0wH3YdRb6vGVvESVttnsDNRKE6T8QryJufXE7ZpzWTI4/xByC37zPmphggsA7ZUW/G 0jjssXD/pLgyMSz8dvn+ndtxdZAy1CBGLw9gbHpeD18+LRnQfDXEQp0faHeFHJdmnQWP gmCQFmh38USPpDOAM/lGjtzGszzEhsHiW8fG8+uo9E+J2p0+uIL03T2F/Lzh52kHIb3S 28knjvS1jfApN85rczzOeZEMA5lLUUqss4jSHHgJamJMQPvZSNmJUsf3mO5zOHgRrv+3 PgLw== X-Forwarded-Encrypted: i=1; AFNElJ9AO8d9mw0YSRR2FFQgIkC84h1/BD8KjzU6jUlaEkxEjrcbXG3SjXycLcbS35rYgGg89287HJuapYqWNpY=@vger.kernel.org X-Gm-Message-State: AOJu0YwUAnecC26hbvsikE9D86yRPIVKgwa+1DPK2Y1pp33DLGXJUhdt sKvhUEJhh6XbejY8ZM5jlAF5hP6t8XuvX0anwG2wEcqsMcE7kYxay6ft6LGd+Hv3aIUXxo48lAe I9Et6Tw== X-Received: from pfmm20.prod.google.com ([2002:a05:6a00:2494:b0:835:43a4:4aaa]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:6ca2:b0:83d:b11f:7979 with SMTP id d2e1a72fcca58-83f33c60deemr6247193b3a.29.1778872849160; Fri, 15 May 2026 12:20:49 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:18 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-18-seanjc@google.com> Subject: [PATCH v3 17/41] x86/tsc: WARN if TSC sched_clock save/restore used with PV sched_clock From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now that all PV clocksources override the sched_clock save/restore hooks when overriding sched_clock, WARN if the "default" TSC hooks are invoked when using a PV sched_clock, e.g. to guard against regressions. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/kernel/tsc.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 567d30b30a5a..b14c4ada89a3 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -984,9 +984,17 @@ EXPORT_SYMBOL_GPL(recalibrate_cpu_khz); =20 static unsigned long long cyc2ns_suspend; =20 +static __always_inline bool tsc_is_save_restore_needed(void) +{ + if (WARN_ON_ONCE(!using_native_sched_clock())) + return false; + + return static_branch_likely(&__use_tsc) || sched_clock_stable(); +} + void tsc_save_sched_clock_state(void) { - if (!static_branch_likely(&__use_tsc) && !sched_clock_stable()) + if (!tsc_is_save_restore_needed()) return; =20 cyc2ns_suspend =3D sched_clock(); @@ -1006,7 +1014,7 @@ void tsc_restore_sched_clock_state(void) unsigned long flags; int cpu; =20 - if (!static_branch_likely(&__use_tsc) && !sched_clock_stable()) + if (!tsc_is_save_restore_needed()) return; =20 local_irq_save(flags); --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6CDC83E1203 for ; Fri, 15 May 2026 19:20:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872853; cv=none; b=bUuFsNhnXJse6hk2vTzzgeHArw9WSnUoMdG9PoBgWTCFVY7vH6ZKCriCsgyUjEyhRYn7/QIwDcOvRWHZ/YEu/CjcHtcKwkNa9B6AF58yAxMTw928l2MZZoLwSIuZh3vmMgARRGrLHIE+o3FaJxN70scpJ6ClGJGpNxz707ME3Bs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872853; c=relaxed/simple; bh=F9WUpGZj1miTCwUFuamAuxgNbr/h7T971FWwjKtok0w=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=eDiyM7vuk1dRZjQo0ARezHhnyWTGqE3Cn13JFvM2rmTpP3XUOqB6dWmC/+IUOZOhjkHPBT43j9XGAQl9hI3zfnfneTn9OjufyhEzGUVKT5J3+Sqm/0FLu2GQA6i1l5CnQEzxcWqCr9SQGA7U3LP+oobGpz7kd/GbN+5N+Z6ji4M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=CkQ404gL; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="CkQ404gL" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2babbeff9e4so1103965ad.0 for ; Fri, 15 May 2026 12:20:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872850; x=1779477650; darn=vger.kernel.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=HxeaHaxP6KnUzzL58lskoB535u+ahD+SqcMQMaRjbjY=; b=CkQ404gLc3NPI0iJRx6TL6bIRb8Hd/iMKv/XqaENPkELMQaqj5477betlpcZlsGPqu wUa/q7ThWbrCU0tRcrTJ92hNbf7+wDO7YJ/asuF0IV4PxAHu2uSI7JCS90/ZdI9KADb8 RK26FS2sSAkTjq93bpcd1Hqz/FgTOMejHDhRdTH74JY/UssoRxQ5O6L4ICg3k9alo8UO mB/t2AN6TyxFf5a4XyBTi1RwH29A/emWzgIi/q0vhlbLDlDBomUVIoi10+Ef0nIrzaQM V3Fy9KuzM0tEP6LSa47I3ean7Bzn6JDTdLEepfHeG7MgYxSOwTTPqDaMSrrSr/Wuq6IO U2cg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872850; x=1779477650; 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=HxeaHaxP6KnUzzL58lskoB535u+ahD+SqcMQMaRjbjY=; b=N9VE2JwrgwDOCAB7hFZ6hj5QL7cecyUz5S6RvvZCiTzd5n85tJD53t1MoKz51s/vEI xbIE44FwaEgxaoUbH2LBugkOMNIBEcQCHnCYbxGCaGPx/3V0t0ALufyxj5I+SWyxfUOp MBN82FPmc7oE9Sen0Ju+uDAXraNGisWwoEfGuACkOUz26hQcURw+FpcKuX1cSm7rPbnv EIk4PhL1HFmVWg9o9Cwf4koJOSqALdb9NKH6miezf7+UiAE770+e/ChBb8MOJsXomqgi w+jeERgyKbithr5kb3TTVaQC5KGhrcs/9RwhDqngupy5nxWcYaGT7DbgsyUCsJz9rDOb RbQQ== X-Forwarded-Encrypted: i=1; AFNElJ+7F974HRtJC9sHb0mP6EWiUDxp/VkXWd6uhVNX13lwTVS34u6TrFXosUgjnH4zvxjh0k8vMtuoCbome8k=@vger.kernel.org X-Gm-Message-State: AOJu0Yy724R47GDdun5l4UgDLeOk32Zu2KpzBvVIjOTYATIcZ0dabDAX TVawdQrkf7K37Buju4GkZnEc6GAaZgOWmSYs2sJViF251Hmqq2f+LfVRhhlh4ul8HpDVkgNOmN1 n9s9cTQ== X-Received: from plhl17.prod.google.com ([2002:a17:903:1211:b0:2ba:73fd:6d36]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:943:b0:2ba:5e99:93e8 with SMTP id d9443c01a7336-2bd52b6d778mr87428535ad.29.1778872850277; Fri, 15 May 2026 12:20:50 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:19 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-19-seanjc@google.com> Subject: [PATCH v3 18/41] x86/paravirt: Pass sched_clock save/restore helpers during registration From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Pass in a PV clock's save/restore helpers when configuring sched_clock instead of relying on each PV clock to manually set the save/restore hooks. In addition to bringing sanity to the code, this will allow gracefully "rejecting" a PV sched_clock, e.g. when running as a CoCo guest that has access to a "secure" TSC. No functional change intended. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/include/asm/timer.h | 9 ++++++--- arch/x86/kernel/cpu/vmware.c | 7 ++----- arch/x86/kernel/kvmclock.c | 6 +++--- arch/x86/kernel/tsc.c | 5 ++++- arch/x86/xen/time.c | 5 ++--- drivers/clocksource/hyperv_timer.c | 6 ++---- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/arch/x86/include/asm/timer.h b/arch/x86/include/asm/timer.h index fe41d40a9ae6..e97cd1ae03d1 100644 --- a/arch/x86/include/asm/timer.h +++ b/arch/x86/include/asm/timer.h @@ -14,11 +14,14 @@ extern int no_timer_check; extern bool using_native_sched_clock(void); =20 #ifdef CONFIG_PARAVIRT -void __paravirt_set_sched_clock(u64 (*func)(void), bool stable); +void __paravirt_set_sched_clock(u64 (*func)(void), bool stable, + void (*save)(void), void (*restore)(void)); =20 -static inline void paravirt_set_sched_clock(u64 (*func)(void)) +static inline void paravirt_set_sched_clock(u64 (*func)(void), + void (*save)(void), + void (*restore)(void)) { - __paravirt_set_sched_clock(func, true); + __paravirt_set_sched_clock(func, true, save, restore); } #endif =20 diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c index b5cb66ca022b..968de002975f 100644 --- a/arch/x86/kernel/cpu/vmware.c +++ b/arch/x86/kernel/cpu/vmware.c @@ -347,11 +347,8 @@ static void __init vmware_paravirt_ops_setup(void) =20 vmware_cyc2ns_setup(); =20 - if (vmw_sched_clock) { - paravirt_set_sched_clock(vmware_sched_clock); - x86_platform.save_sched_clock_state =3D NULL; - x86_platform.restore_sched_clock_state =3D NULL; - } + if (vmw_sched_clock) + paravirt_set_sched_clock(vmware_sched_clock, NULL, NULL); =20 if (vmware_is_stealclock_available()) { has_steal_clock =3D true; diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 800c3d65f0af..962b6fcb5c60 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -137,7 +137,9 @@ static void kvm_restore_sched_clock_state(void) static inline void kvm_sched_clock_init(bool stable) { kvm_sched_clock_offset =3D kvm_clock_read(); - __paravirt_set_sched_clock(kvm_sched_clock_read, stable); + __paravirt_set_sched_clock(kvm_sched_clock_read, stable, + kvm_save_sched_clock_state, + kvm_restore_sched_clock_state); =20 pr_info("kvm-clock: using sched offset of %llu cycles", kvm_sched_clock_offset); @@ -344,8 +346,6 @@ void __init kvmclock_init(void) #ifdef CONFIG_SMP x86_cpuinit.early_percpu_clock_init =3D kvm_setup_secondary_clock; #endif - x86_platform.save_sched_clock_state =3D kvm_save_sched_clock_state; - x86_platform.restore_sched_clock_state =3D kvm_restore_sched_clock_state; kvm_get_preset_lpj(); =20 /* diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index b14c4ada89a3..0114c63dfdd9 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -280,12 +280,15 @@ bool using_native_sched_clock(void) return static_call_query(pv_sched_clock) =3D=3D native_sched_clock; } =20 -void __paravirt_set_sched_clock(u64 (*func)(void), bool stable) +void __paravirt_set_sched_clock(u64 (*func)(void), bool stable, + void (*save)(void), void (*restore)(void)) { if (!stable) clear_sched_clock_stable(); =20 static_call_update(pv_sched_clock, func); + x86_platform.save_sched_clock_state =3D save; + x86_platform.restore_sched_clock_state =3D restore; } #else u64 sched_clock_noinstr(void) __attribute__((alias("native_sched_clock"))); diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index 21d366d01985..ee7095febfd1 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c @@ -567,13 +567,12 @@ static void __init xen_init_time_common(void) { xen_sched_clock_offset =3D xen_clocksource_read(); static_call_update(pv_steal_clock, xen_steal_clock); - paravirt_set_sched_clock(xen_sched_clock); + /* * Xen has paravirtualized suspend/resume and so doesn't use the common * x86 sched_clock save/restore hooks. */ - x86_platform.save_sched_clock_state =3D NULL; - x86_platform.restore_sched_clock_state =3D NULL; + paravirt_set_sched_clock(xen_sched_clock, NULL, NULL); =20 tsc_register_calibration_routines(xen_tsc_khz, NULL); x86_platform.get_wallclock =3D xen_get_wallclock; diff --git a/drivers/clocksource/hyperv_timer.c b/drivers/clocksource/hyper= v_timer.c index ac1d9f9c381c..dee59ce61c29 100644 --- a/drivers/clocksource/hyperv_timer.c +++ b/drivers/clocksource/hyperv_timer.c @@ -553,10 +553,8 @@ static void hv_restore_sched_clock_state(void) static __always_inline void hv_setup_sched_clock(void *sched_clock) { /* We're on x86/x64 *and* using PV ops */ - paravirt_set_sched_clock(sched_clock); - - x86_platform.save_sched_clock_state =3D hv_save_sched_clock_state; - x86_platform.restore_sched_clock_state =3D hv_restore_sched_clock_state; + paravirt_set_sched_clock(sched_clock, hv_save_sched_clock_state, + hv_restore_sched_clock_state); } #else /* !CONFIG_GENERIC_SCHED_CLOCK && !CONFIG_PARAVIRT */ static __always_inline void hv_setup_sched_clock(void *sched_clock) {} --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 72CBD3E2770 for ; Fri, 15 May 2026 19:20:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872854; cv=none; b=CgSu5Pc8/ENZYTfIKLaCvFtH2MWCDjxvJyP5Rn3AaxK8iqdGWaGqgbosOIFbWAaRar1wR5TK/OMNcBuSvg2hHnQRKUXUiY5vnh6eEyig637I2LLXhDE4p+rIJ0vQ8HdEBTtvoOtfVLuXQlNsHW/bMmbUxRv9s8A0Yi3Jha1p3XM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872854; c=relaxed/simple; bh=MgerBvYEE19VEGmb0jwZ6MxNxLG6DRj12L8dn18zHeg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=l9uWvKCkaxVRKVZuS2VakFP+3szL2bgPfPOruF+y5MhpsqRz/9bWSOHPv7mPFwhZMAC+dsuYbyDmbOptwJFlETphw27s0bHyVTJn+hQYcent5IGWcunV1lUHKPjH+lqrFtyWrh3SDIWBStUuVZaVTTeladToqcyb2xZg+vHOHXY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=UT3kJ/Od; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="UT3kJ/Od" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-83565161a6eso37162b3a.1 for ; Fri, 15 May 2026 12:20:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872852; x=1779477652; darn=vger.kernel.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=pABxqq/LCN+Mp4/TOmuyDPyBXfPq+tAOVmlCcYLwmko=; b=UT3kJ/OdQ25yEeZelrAP4l0D3NsjusKqRcRiLrXF8C3awBzRlgCEPLHKHVl5TBzQBE bQsph/G2EgTOsYw6qYYWerqfUIcrsHSDhkTsX6FABMPQHCpDZOiI91WBbRdkhuGOe2HV fH7RNerArVc6gJfBHrka0y3vsK38vjDDBGX97EUzPMhNX1igvPylPsrVtaE8JwT1Ww0P Bs5OkM1PlZXKdEg3ZwgLtT+QWqU4u1h/BIjnCtprPwEk3vb1frwSBrvQAB5NsKlVwUEw RUqtWjYOAFfnfrhZWh/s+39RI4myf+cXBTWxvAttaAaDvXKc1WdmH2r6XB2D24rRqImK lscA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872852; x=1779477652; 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=pABxqq/LCN+Mp4/TOmuyDPyBXfPq+tAOVmlCcYLwmko=; b=R1pMahjugd3upVieWqsEe+JrT+bjVPXgVVCfTPrjUN39/cT9zQsVxVmKAmIT0Pn5UT 8nVE9SFF4Nt8k7kB9DE12Wdi5Lzphj4y16deKllqgO+m6MYbgS7RJ348TvmygFvLxGgc sJ4O5COIGkG+1gWRB7MQSuXG0RzyMWo4avGKhs4enakRuyQM4eb9jzqJYlqfjkRlussM tp+nM++nOuKjkz6wAd8jTLSoiagi77HrtRQSLhMIev84Vvv4BxyUAgKHgySM01BVT3Th BYMHdUY+vwFN/b30pRn773C4xzz7NevUF7jIlr8YgYezVEDFs+PPI0j7VcSqF0biMgTh lAQg== X-Forwarded-Encrypted: i=1; AFNElJ88nvwt1M5o3YrgadD+jx66ch8a6oSBcFwBA0SIcYRNfyttpwgs6PQI+8r/l/dy8j8szkSI/2Na+QJ17TA=@vger.kernel.org X-Gm-Message-State: AOJu0YzSoU3Z02QujB7JWTkTIDNa78dFHqEmDaRF3b75diC3zrfGNh5D rx4JvjHlG9+dB1A0rJc8wQvQSmNXT9GF0kaF90SNu3vROUjMMz+/IDlrgP8gY5HMiuAgWDLVH/Q sq2FV6g== X-Received: from pfblj16.prod.google.com ([2002:a05:6a00:71d0:b0:83f:22c:66ee]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:801b:b0:835:51fd:b7e9 with SMTP id d2e1a72fcca58-83f18e75ed2mr8194934b3a.20.1778872851317; Fri, 15 May 2026 12:20:51 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:20 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-20-seanjc@google.com> Subject: [PATCH v3 19/41] x86/kvmclock: Move kvm_sched_clock_init() down in kvmclock.c From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move kvm_sched_clock_init() "down" so that it can reference the global kvm_clock structure without needing a forward declaration. Opportunistically mark the helper as "__init" instead of "inline" to make its usage more obvious; modern compilers don't need a hint to inline a single-use function, and an extra CALL+RET pair during boot is a complete non-issue. And, if the compiler ignores the hint and does NOT inline the function, the resulting code may not get discarded after boot due lack of an __init annotation. No functional change intended. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/kernel/kvmclock.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 962b6fcb5c60..8df6adcd6cd8 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -134,20 +134,6 @@ static void kvm_restore_sched_clock_state(void) kvm_register_clock("primary cpu clock, resume"); } =20 -static inline void kvm_sched_clock_init(bool stable) -{ - kvm_sched_clock_offset =3D kvm_clock_read(); - __paravirt_set_sched_clock(kvm_sched_clock_read, stable, - kvm_save_sched_clock_state, - kvm_restore_sched_clock_state); - - pr_info("kvm-clock: using sched offset of %llu cycles", - kvm_sched_clock_offset); - - BUILD_BUG_ON(sizeof(kvm_sched_clock_offset) > - sizeof(((struct pvclock_vcpu_time_info *)NULL)->system_time)); -} - void kvmclock_cpu_action(enum kvm_guest_cpu_action action) { /* @@ -304,6 +290,20 @@ static int kvmclock_setup_percpu(unsigned int cpu) return p ? 0 : -ENOMEM; } =20 +static __init void kvm_sched_clock_init(bool stable) +{ + kvm_sched_clock_offset =3D kvm_clock_read(); + __paravirt_set_sched_clock(kvm_sched_clock_read, stable, + kvm_save_sched_clock_state, + kvm_restore_sched_clock_state); + + pr_info("kvm-clock: using sched offset of %llu cycles", + kvm_sched_clock_offset); + + BUILD_BUG_ON(sizeof(kvm_sched_clock_offset) > + sizeof(((struct pvclock_vcpu_time_info *)NULL)->system_time)); +} + void __init kvmclock_init(void) { u8 flags; --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8F6583E277A for ; Fri, 15 May 2026 19:20:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872855; cv=none; b=KedeMfD1BWpmhV/ysstE8lsiS1OTcEhjTekPmXZc7JBkwIsy4X/nUUcDRukyf1ZRw7241cu0clFLSY6NLoiHFSAdfhEy8qlj7Of8Gxd/G/U9TFD62MA5taFTjYpRauO4WhG9n3Rr91gx/8yIgF2glECU7U5kXGnLTVXHIXcuU+k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872855; c=relaxed/simple; bh=xUpUGQiJgAA1ZwmKSf8xfquX01gunhdqbyqPreoYY78=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=B2OYguhLviPI/xu7KgFmqnZuFNb1tRvoweM1RPaCig+Vd93rXIYvS2sOT8y9rtzXJ2kGb8g+dWnAyJpnfcnSAJ2c1AyW5JtA0dHxNsHSi7GW0iKFlnsCrNtB1mFlGlFLYKD7IbhoXsenxGWSlzpjQn2STKFJGsd4JWmDT+XjuQg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=lWE5+zrE; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="lWE5+zrE" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2baf7748d0aso1728005ad.1 for ; Fri, 15 May 2026 12:20:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872853; x=1779477653; darn=vger.kernel.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=KhBZEy0/QKSWfL+Tze5jxYQtO7z6AVGLrSR5LBAuSZ4=; b=lWE5+zrE+getZ+4F8eR1KgiFAruihoO9kkdcxqOq0hvIFT9fFUuKKaL1WY06PArdfl 6Vo4M5Wn9Kqay9z3iUP30BndhCOn8KUdMFD4S+sdaeUS1LoCNV4HHM17gpSC3Qbbd8OO OU0WFhXIH2pq7N1DB7Q1qIVfJRuD/sZN/Y3vvDJP/HL0creCyeQRoVhsCnkadDmhPmJX 3VOZ+MDq/2Zf/V1v6b99x6otVvqV3GhJEO6yjHPK/FtbHeH8TT50IqOZ28R1Vc14H6x4 bQfIfqDaLiWuH5p1dBRTTh9UA7pCt+e2JmC7TnRwUfaoTbhOsX4DvQkPdS3mw+JsJeQj 5KeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872853; x=1779477653; 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=KhBZEy0/QKSWfL+Tze5jxYQtO7z6AVGLrSR5LBAuSZ4=; b=I4vBZLQNGYJZvBAgdJAbVMfRXqKcpQE3OHQynvl8cxWQwuB14YiAqSkiIWOtoRmSER xq/JxVvYa2SNGZ1zFOFVTuWnPitawXZm1Rq1pDL5Bs+4SYVdMoVQ3HrbRS5+Pjp1lHcC mC2zdbU2gbQ0ozEZ0MZ0MKB/j6SaUpXYx9fgme/VarJtPWc7MMmQfKVO/R7Y48dztbKw +k9D7jS2gJZxkcjvT9OZcoYgNHZXFWANJ2EobxzaPkYoI1vuY3F1dofGNirNNVgex6jC K/FMNwF5oRkEshtqDpB2NuH6egI0URxIevLOz4HErN8mSBR+hJ7TmHXvZxwSxVcPXh6A cxYg== X-Forwarded-Encrypted: i=1; AFNElJ+PtwXZzyj12iwJUset75sx5ajE3/OyvJ1VPzLclrm5kHtPDjiD2GcxGMZXDRcVkw0hgKkin9gmqo93d2o=@vger.kernel.org X-Gm-Message-State: AOJu0Yz5BLlAevK9G4KjO6YgJyM5bdPnqBmCbsTPhiPxeSKHYloaol/p JflzFON6F7WkrSdkLUxVTCqSOz23dG9WCMLg+SuX07uV12KCW2NjJusq0Nw7eS6FdTZDbQ+WG9k I6F6SKQ== X-Received: from plbmo16.prod.google.com ([2002:a17:903:a90:b0:2ab:194e:4d54]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:3c28:b0:2ba:bfb5:9cc with SMTP id d9443c01a7336-2bd7e8d3b9fmr61656605ad.26.1778872852484; Fri, 15 May 2026 12:20:52 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:21 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-21-seanjc@google.com> Subject: [PATCH v3 20/41] x86/xen/time: Mark xen_setup_vsyscall_time_info() as __init From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Annotate xen_setup_vsyscall_time_info() as being used only during kernel initialization; it's called only by xen_time_init(), which is already tagged __init. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/xen/time.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index ee7095febfd1..f087bb76457d 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c @@ -444,7 +444,7 @@ void xen_restore_time_memory_area(void) xen_sched_clock_offset =3D xen_clocksource_read() - xen_clock_value_saved; } =20 -static void xen_setup_vsyscall_time_info(void) +static void __init xen_setup_vsyscall_time_info(void) { struct vcpu_register_time_memory_area t; struct pvclock_vsyscall_time_info *ti; --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7CC5C3E4C6D for ; Fri, 15 May 2026 19:20:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872856; cv=none; b=lg0Ebnao8VH/ERzCT7ZjrIsGX6aWBxAjtFGDMvcOtfDbFGzvxu4EeE5zJqNupLUaKBy2t4+2v8rKaUQN0BVDMiLvNWYCzbiOmEnK8IK/DfgjkaH+1LpAx26/9xbUZB8meOB+zU2MaESDNjLSJY87adrM2tVcl51SYxij2SCQLGA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872856; c=relaxed/simple; bh=JoZRC/hW+tKnKrEAUcORKk9q7uPs7dRukf9wHei9sJ4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=NX16Ajfk9DCB4QsnV6ywWXv1CzMqIpmdO7AGecxKz0eQ9ZVmJ97kiTcx3bdu8vxOQbGIeBKwMH/OyZvrFAbta6AZHJF2P1hyMHoSCj2x4p2SMCjAho584W/MltJqQMpYNnbHdadpMHkxfEG2wUqMo6Ed52xAbb4FBWY6vejV3LM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=ZP6BnW8v; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="ZP6BnW8v" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c82ba4715b6so177067a12.2 for ; Fri, 15 May 2026 12:20:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872854; x=1779477654; darn=vger.kernel.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=0xIKAIujVCN543pIVJIG4PCsIsqHFXWMUqZ1keR+hJo=; b=ZP6BnW8vmtVwvLfKqROWOvk3QlFK8JlWuoa8dSK3i31GyTk/3g+daN2qBfmhzzZOsA GyL2EH4eaXLsIQ4bAN6mm1FsO/TlsJZWUUNJIl8TEnr3lhbj3YTOn+wSRlyUr99sdyf/ I8v+F60kWw+xDWt1OyH+QsY+7yRRlbqXJEFfAjQLnI8QUQyZQ31kzmst/RXDFqnCf6yD 3o4MN38X2A8xHcyVpsjAxFZIuTcNgaYdgYNhSmAMTqp0M6bwOmdCX8O7lipHsmoNTFOo 9qtM9qcfl2kfdN0M0h+toFbBSiAM6WMbtxs1/XMmuOFmzahwhcHkBKnQi81eXkDSwqCD SG2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872854; x=1779477654; 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=0xIKAIujVCN543pIVJIG4PCsIsqHFXWMUqZ1keR+hJo=; b=O/Y5rwqjIexZtcQjOL7HlF2BP8m5LqOazVwcYzuQTHorIYnaIRCRiJPW5GTB9uEaIE XGSyTQ3LQCzRyG68UUyRvuwidF9o8rtOFLX6Bjosd+F+nXsf/kQkGbv22Kfd6P87T2OZ Q8COD4aHchPYqXwzBp+0e70M699Z4tIBKI2K1ignU846G+qD7qdp7X0aS0YdXY2vMknb QRyAgIS3Llk/LN5S8PiYZ91D7WggzR2fZQYdijbUmCRf+vMMNxpdie+h1PlTD03nCIKg RPhJ/lZ2oFirlI3z/5dkQKsVnpcKwL2FRft97Z0UAQ0uHTU/lnLTMSHzPoK2M0FA6q5L 4RGQ== X-Forwarded-Encrypted: i=1; AFNElJ8SuwsZ/7J8pVbywXizAzJZ6j9Wabc/b8By8l1krbZtCQ5p/pHtpsr39y5wWNXsotDXMQnb0DpuGXdYtpU=@vger.kernel.org X-Gm-Message-State: AOJu0YwEdKvmsVcZO34Vd5J/IqtKgN/rgEZIlOsaz1cpF41BOFmtV8j2 7UHips5ry9TP+msEvAwdCMX91PRjjyn52xnGUc6kises8W8YT3N9eOGdVM3GyeLeRIAw7Frn/2+ IB8LtCw== X-Received: from pfbbd18.prod.google.com ([2002:a05:6a00:2792:b0:82f:75de:5da4]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1908:b0:82f:50cd:e586 with SMTP id d2e1a72fcca58-83f33cb2c40mr5886702b3a.13.1778872853499; Fri, 15 May 2026 12:20:53 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:22 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-22-seanjc@google.com> Subject: [PATCH v3 21/41] x86/pvclock: Mark setup helpers and related various as __init/__ro_after_init From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now that Xen PV clock and kvmclock explicitly do setup only during init, tag the common PV clock flags/vsyscall variables and their mutators with __init. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/kernel/pvclock.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c index b3f81379c2fc..a51adce67f92 100644 --- a/arch/x86/kernel/pvclock.c +++ b/arch/x86/kernel/pvclock.c @@ -16,10 +16,10 @@ #include #include =20 -static u8 valid_flags __read_mostly =3D 0; -static struct pvclock_vsyscall_time_info *pvti_cpu0_va __read_mostly; +static u8 valid_flags __ro_after_init =3D 0; +static struct pvclock_vsyscall_time_info *pvti_cpu0_va __ro_after_init; =20 -void pvclock_set_flags(u8 flags) +void __init pvclock_set_flags(u8 flags) { valid_flags =3D flags; } @@ -153,7 +153,7 @@ void pvclock_read_wallclock(struct pvclock_wall_clock *= wall_clock, set_normalized_timespec64(ts, now.tv_sec, now.tv_nsec); } =20 -void pvclock_set_pvti_cpu0_va(struct pvclock_vsyscall_time_info *pvti) +void __init pvclock_set_pvti_cpu0_va(struct pvclock_vsyscall_time_info *pv= ti) { WARN_ON(vclock_was_used(VDSO_CLOCKMODE_PVCLOCK)); pvti_cpu0_va =3D pvti; --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B09D03932F0 for ; Fri, 15 May 2026 19:20:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872857; cv=none; b=WEG7TybmsA+CJkc/NV4xpzkB+l4jSkHRBXfSbCny15jythYMPuzLkRwtmGBMKOKIu4lfpnkOgF5eVa/GJ7/+OMx5H5eRlqL1z9T6/CJXxrrDV7T9w5ah5/w0yiQDRak2qbd1aiib12Zt3MflrRI8j7aY0i8gvDA0qWd1DSld2Do= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872857; c=relaxed/simple; bh=lbZq5HMMUdoKD8t+V1QOxdv8UCq5RsQl+bpxwZwTljc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=VOc/UcQl4xDkTQ33wJtrPOGdaGDqfBgpjmjXCL5sMTJDoeoiQ8zp/SRLPtmAl1zVbi9SDe5UYR3uqTlWpa7QINYqaM2VPGpufAUSARB7kgLw6E30zYhCwNMtVPHQSQbffoY0JG0wQBmONS0P9VxWh4PYTZNw6afyggOYnt5wFJY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=eq494Ve/; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="eq494Ve/" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c8279604464so193712a12.1 for ; Fri, 15 May 2026 12:20:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872855; x=1779477655; darn=vger.kernel.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=BtD3/8r1rxxPL0bRTCD1R2r93qIzEoWuEeKvRfTm7KE=; b=eq494Ve/TYFJex7FCne50MgPTq4OKBcYwIkoPj6cyggtcnY9i1TmQKg6ZTM+Txku8j kOJLYYGTyllSNMsjN675NMMSDIreI122ZtDQybkdBKcKczZMzfs/fVvmMoo+cO7wiHGx snpSgiqZNq1lXeJ6ISiHbGho7Efzlyqrjuo6M7FxHkVaB5NPGX4Y79BQHAx5s0WPrZUt 7nTE+lZKutQv/wmMzKvsiD0EGjkDTj9L7meotK49TrMWpSfRBq3VsECae/R0hEyElNDr zYFTZ0KHgXzfaZ38nkbtqdzrwZ0nEE2KlefKRSjCMnc0a9LCe5VZUhwQVLVFIusR8uim fe/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872855; x=1779477655; 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=BtD3/8r1rxxPL0bRTCD1R2r93qIzEoWuEeKvRfTm7KE=; b=PbgHzar1Jw57LTvPxsBr6RFVJ0r40cxDo5RcDStw3Xlr7KJf8MuXZGve+fN/Mr5rq7 TteK/LBnFMLW7m94zMJRs2U1ah4mj6VyA5EMYIjjTtDALXwfce1t6TTEx6gsjlytFC4m c1MC7ADjzASo/2b21rnXgpOPaH8E9wQNZe86/m4pslUgRlP92L5vcytlhcmZvNcEZYWw L4oKUGw9jCMjNgE0ADW6NdVM3uL/8GNF6FRNUJgoRbMnFTLu0P+FSFLDKzAXm/S2drZj uTwjWLRQ1vj37pZWy9cVVUQYF/GLrBKWmbop7EZDBUUCmBC5seMCMSDRvEhCwASP1BiD 7KnQ== X-Forwarded-Encrypted: i=1; AFNElJ81N+JBfggMEbvSSxN0xNKIKN80Wog1N1WKuQ9YG5+jqFO48clPxMSC5mN90GTbQ3a5qpRHbIT+w84C0Ak=@vger.kernel.org X-Gm-Message-State: AOJu0YxWDFkwTurnTjnp8wUvw+ZiLw8OJFR0xeVgx028WWR5WqRxemZT UFhAKwhVvlfiJghUIbFzDMZ/S0W/swtgQv+2SbfhufAxmcvQdv4FRWuR2OUF9difwRtKy2Smqdf wdQy+uw== X-Received: from pfbly26.prod.google.com ([2002:a05:6a00:759a:b0:82f:a4cc:2fb3]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:ac86:b0:82a:805a:7e2 with SMTP id d2e1a72fcca58-83f33c4ed90mr5838917b3a.9.1778872854522; Fri, 15 May 2026 12:20:54 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:23 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-23-seanjc@google.com> Subject: [PATCH v3 22/41] x86/pvclock: WARN if pvclock's valid_flags are overwritten From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" WARN if the common PV clock valid_flags are overwritten; all PV clocks expect that they are the one and only PV clock, i.e. don't guard against another PV clock having modified the flags. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/kernel/pvclock.c | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c index a51adce67f92..8d098841a225 100644 --- a/arch/x86/kernel/pvclock.c +++ b/arch/x86/kernel/pvclock.c @@ -21,6 +21,7 @@ static struct pvclock_vsyscall_time_info *pvti_cpu0_va __= ro_after_init; =20 void __init pvclock_set_flags(u8 flags) { + WARN_ON(valid_flags); valid_flags =3D flags; } =20 --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AD2D83E3C51 for ; Fri, 15 May 2026 19:20:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872858; cv=none; b=ZRSNxh4Myp2t1narSSQH36G6SrKih0pr2Jq+7sGaDIyuckMvtuyG26pePpF0hUSQ4gHDSJdrMiynKa0YmojMThyNQ5ArRge4im7Upl3TJipZIEKm7224An8Gdb8IwpZe9RT5g3RdDa4PZ3WhBTjNQMtcY+saZdKpiP3fBNFWQcM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872858; c=relaxed/simple; bh=XHuFwpmRMigDS8aPY2gzeqSH8+iLJhWYuJEhRhC21LM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=d6zLJyHUBu2D0IZ7X/WOvBr+kOKTjHPMV0T9JJjwRyo5zvP3xED/QZXCb++5NYccr6W/DX1iCyZLD1nU+ydzO52H3k/KBJyXgqfJ8Qq5vcDinuijFvHL8NC+uBzOXtOH4KSMDCN0kgN/nE7nsBTQTXlhjXQ3va8bfYPgSM7YUDw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=f9qUis3N; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="f9qUis3N" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2ba86e35aa1so3525455ad.1 for ; Fri, 15 May 2026 12:20:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872856; x=1779477656; darn=vger.kernel.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=7w7qT+Z66rWfxvtZ1IzSRlO054bgZsKsszMlQ0FarYw=; b=f9qUis3NqQqc31fejsDRuqqa6jrOaAGRAzF6zoenSrTZ2DcnSjNPJGNjgSjAFr3+9d KX9CEnWOIdQ92TruBonx2C792rT3l2LqeU9NuOOQysXcwwLCyYX/Ggy0ODWRDUYPUeix jY6iOVu7KgseVHOpkU+EzJ61TXXywf8Jk2iBMYzc0B1BIcuxeP4ttuHJzJjgfaQaKW2P 6wxgi6EHnruYQfcO5i+8Dl0UJDnFuqkSLZ9yynqUDtBpc5oLSyBdWA5srNn1Um1n2BGE FmYGFm7EwByYU53OLwi6PiEPfCg7b+topQHfQXduNeRQzHiika67OoNvPlPPzHi5Yacq SSRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872856; x=1779477656; 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=7w7qT+Z66rWfxvtZ1IzSRlO054bgZsKsszMlQ0FarYw=; b=QhBXhCen6lC5sCi1mtPvwbrQ7USU7f1g0ov8E7kDsRnb52RZ3j44W1gtSxN+/N8hCu 2t4VbiIgSUiwSXsC2UTDEfNQMGsDecfptijSWQ4eq5OfptpqK83sxfWdisFglEFpKUcP 4bw47N/HXI2CQesBGFs6RSa4LVysGegQiltAZA4vvP5gyNQQA8ymccgqTi+daU1xzWqH 6/h9u2zu5J0sFtFgvkMriBmNWO7sjTCwMuOnnAGACWhy+F4QvIZlKjGSB6Gn4/8zQT0Y TJndV1uCb8X5QcgH0cPglBFca5rgvLPaZhuA+qxAGjlxZR8Qugpj6duX3G1Ey19Zopul gV0A== X-Forwarded-Encrypted: i=1; AFNElJ+HcW1Z63eRKab3pbuss5GksdeA+Z93Yxo4FmpKqkJVUT73U+FAs+9UmSzTO1CFuDp+ZQNDop4Ntc6JJP8=@vger.kernel.org X-Gm-Message-State: AOJu0YzxyIb+39/ab/nUEky6g0JblGIvG+sjeFp9zZ3hS9bjv6w+Zfjn rmAyHiZYVBOvNBZUnMbBhijh8uoRSZlu9OXL96bH9iql2JUEKIJMfSQRdLlUuT+0B8pM8jZHVXa 7nF6rFw== X-Received: from plcm4.prod.google.com ([2002:a17:902:f204:b0:2b0:b12e:1b07]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ee09:b0:2b4:62bd:ee3 with SMTP id d9443c01a7336-2bd7e937a4bmr42674815ad.33.1778872855638; Fri, 15 May 2026 12:20:55 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:24 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-24-seanjc@google.com> Subject: [PATCH v3 23/41] x86/kvmclock: Refactor handling of PVCLOCK_TSC_STABLE_BIT during kvmclock_init() From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Clean up the setting of PVCLOCK_TSC_STABLE_BIT during kvmclock init to make it somewhat obvious that pvclock_read_flags() must be called *after* pvclock_set_flags(). Note, in theory, a different PV clock could have set PVCLOCK_TSC_STABLE_BIT in the supported flags, i.e. reading flags only if KVM_FEATURE_CLOCKSOURCE_STABLE_BIT is set could very, very theoretically result in a change in behavior. In practice, the kernel only supports a single PV clock. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/kernel/kvmclock.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 8df6adcd6cd8..ccb2aff89b2f 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -306,7 +306,7 @@ static __init void kvm_sched_clock_init(bool stable) =20 void __init kvmclock_init(void) { - u8 flags; + bool stable =3D false; =20 if (!kvm_para_available() || !kvmclock) return; @@ -333,11 +333,18 @@ void __init kvmclock_init(void) kvm_register_clock("primary cpu clock"); pvclock_set_pvti_cpu0_va(hv_clock_boot); =20 - if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE_STABLE_BIT)) + if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE_STABLE_BIT)) { pvclock_set_flags(PVCLOCK_TSC_STABLE_BIT); =20 - flags =3D pvclock_read_flags(&hv_clock_boot[0].pvti); - kvm_sched_clock_init(flags & PVCLOCK_TSC_STABLE_BIT); + /* + * Check if the clock is stable *after* marking TSC_STABLE as a + * valid flag. + */ + stable =3D pvclock_read_flags(&hv_clock_boot[0].pvti) & + PVCLOCK_TSC_STABLE_BIT; + } + + kvm_sched_clock_init(stable); =20 tsc_register_calibration_routines(kvm_get_tsc_khz, kvm_get_tsc_khz); =20 --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5235237FF79 for ; Fri, 15 May 2026 19:21:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872862; cv=none; b=LPWIRRixbXAlrTHwQ2sHgowtQWi5/gb5ss8p/Y5zWkiOUGZqYksCpZHM2Wp0qHJgFMx0pb8DWICy8osHzODXT9br+dfqQsUH5BceasX4beaAXFl4yPBvMfQKhK1IKo3dLROK6/opOa5ehUv5FdnccP0jj052xctlzXsG10i92Vs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872862; c=relaxed/simple; bh=7HCympHBB5xq3NRYbNWj3V2HpCZUGQZPcE1kS6YLWe4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=PztSPG8oGmI3NShDresbT7N80wRX3DUdU8OxCMUrslAiQmNMAcpTDSqPdD8FSJCarQxbu00PsY40sCNpLt7J2HO/4xlxwEx1qCtYd4/r93d6cr9n13kqUQ/OiRV5tNXH3AD/HMTWRMnslliY7hfZfCnZ4eMabuFU64KKA2YVXiw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=qX1oxBB7; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="qX1oxBB7" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-bce224720d8so68028a12.1 for ; Fri, 15 May 2026 12:21:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872861; x=1779477661; darn=vger.kernel.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=4XJIP9GZP+0qc5TpuA2ddXAK/ReZERF3J3EAtmTAWAE=; b=qX1oxBB7mTdyVxx4knGRlOP64lC2ZjUh50UyOJCfzEr8oPwVWF1AHV3ss92CsVXVDt wb/m2rJB53f0WiUQECWRtlvOmBZoTufts9JBgPhhvAZPxqC/IPCiJ02ezn8MVSIxKIxc RX0L+5rPKWugT4pPD3LW17aTcNcr0tQCrp9soX2vFTpmvrWpc8LRaow6wm9WlFB6osom ctUqvYVYtnZVK1tv9QGiMKrbWeExjg1SWyMg/1bLrqUFJ2TElkd70DqNLQRh2ArbeCWS gA/Mlr3SysKWtfyZKUuVTMbrpTLsyeZuJIwXTkrymCHRqTeUJHrftZdF0G5xTMsSyWdX kZug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872861; x=1779477661; 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=4XJIP9GZP+0qc5TpuA2ddXAK/ReZERF3J3EAtmTAWAE=; b=EROQDzWQDkYJ29gV1RHVn9rtz8M25OfE+odpQIW3Huvl5L33GWGw2lbeFNC+CMyw12 EJSJHg0+DTT29fox8LOGSCXvPfu2LqqQand9L4veTTaE4UThB8AIsA69SPWojAudZAoB c0zlNC+vxWBmNLOSnEtekT7f8Ct1x6ilxvBajph8YT25m2/x+3mS/7X3MOmaXOQraeb2 9QelHhkCf3kzJF3+MD7CaexkeP9j4+neLiNfXEFvBXeAm128ilz+k+Ing9eWgWEfjfnH Qkf2B4AXoo404BP53usBHfoBdDHDE8dHfCl3TeA7MBvfTDQS1dNMqtXgUtyrTRn55h0H o6bw== X-Forwarded-Encrypted: i=1; AFNElJ+0aPpreFBQaVSwvhr8Avs97lSctlTcDwyAiuez2B9Kwru54lBRMSzYDG6LPxBilX3ZA8Vl+hC32sDr7Sk=@vger.kernel.org X-Gm-Message-State: AOJu0YyCEn/qBpCof30a04p5ebuPecTDHs1PE6GBSmfzm+llAiUu7YOt zCeik40pjFXWFlB1KWOfIK5qQatUG9rigmGoS42/pdnFz9VX0nbwYeZcEaD8K9UCk0ZqAhHlsd9 ZqWrW+A== X-Received: from pfje16.prod.google.com ([2002:a05:6a00:d0:b0:82f:6eb4:9793]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:a20e:b0:82c:e1aa:21e3 with SMTP id d2e1a72fcca58-83f33bca81dmr5806035b3a.10.1778872860340; Fri, 15 May 2026 12:21:00 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:25 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-25-seanjc@google.com> Subject: [PATCH v3 24/41] timekeeping: Resume clocksources before reading persistent clock From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When resuming timekeeping after suspend, restore clocksources prior to reading the persistent clock. Paravirt clocks, e.g. kvmclock, tie the validity of a PV persistent clock to a clocksource, i.e. reading the PV persistent clock will return garbage if the underlying PV clocksource hasn't been enabled. The flaw has gone unnoticed because kvmclock is a mess and uses its own suspend/resume hooks instead of the clocksource suspend/resume hooks, which happens to work by sheer dumb luck (the kvmclock resume hook runs before timekeeping_resume()). Note, there is no evidence that any clocksource supported by the kernel depends on a persistent clock. Reviewed-by: Thomas Gleixner Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- kernel/time/timekeeping.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index c493a4010305..26f3291a814d 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -2098,11 +2098,16 @@ void timekeeping_resume(void) u64 cycle_now, nsec; unsigned long flags; =20 - read_persistent_clock64(&ts_new); - clockevents_resume(); clocksource_resume(); =20 + /* + * Read persistent time after clocksources have been resumed. Paravirt + * clocks have a nasty habit of piggybacking a persistent clock on a + * system clock, and may return garbage if the system clock is suspended. + */ + read_persistent_clock64(&ts_new); + raw_spin_lock_irqsave(&tk_core.lock, flags); =20 /* --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7939C3E1204 for ; Fri, 15 May 2026 19:21:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872865; cv=none; b=Wg5M+rKKRHZUv7eQP34hAP/CYvbtFvDD26I5NFnjQ1OQV1EUQXEyemG8hFl8AUsBl86dFqPSu/VvUp6QVrKhPW+SqjV6xr3dpTW8xl5Zc0DQDFjS7EkNIetqLqW/AnmvvKD5B1+clHbfYSQtD+bURhHN/8Em6/D1D1oBIaKXOMY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872865; c=relaxed/simple; bh=++iwLO4D9TJzPz8kuVQ32pM9hy17JXnAFhkjXdC7Tyo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=B9gvNmr5SBn717e5mA9r1bYA7rxTHl0X1fVuNTYukhZCsGCNIWjiVFzY2maDYjZFHlsHDPcDP+elL5omRg+CISM8IGmuWyV0VXwmIo0JhQQdHoSBV+oxBfjrd9r3p/XnJ4xyZym9we3tszgc34zALpu60D9x9WjHmsCKO1Ghw8E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=WiNyH4Eg; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="WiNyH4Eg" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-837d43e9ff3so95297b3a.2 for ; Fri, 15 May 2026 12:21:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872863; x=1779477663; darn=vger.kernel.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=cmCCoVXH/wzfqmDby7kD+g/lqwg2CVoD5UqPiffRRm8=; b=WiNyH4EgkSkGLo5UY/FqEkQ+GcvsC5gGeLEmdJrO/wKCF5W5PcPAjrMdc8pF45dOVr duuJBVD0V2aQUAxk0daA+LrQqRAl9B0uTXEUJVjR1Cx/BOW8liKPJp69WzgtRY4pyCJf qtV3BqnoHfgD3p2YmO2Ly4QHSVxxd0+pWeMZvywm+r9qC+ZwsiSCWY0BKUCwazBw3ZEX pYOmIEzbP+IOaxSls4h6CprAkHZMdBpUg0pOMRqynVYIulTTtCRjqYp+scoVPK0Qv+3v QH9acRF0jGDE3kVCudHAAKRitwMROdkRMitHNu39QSCm8ULokSsxl5xRPQncWKA6Sd/N OzoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872863; x=1779477663; 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=cmCCoVXH/wzfqmDby7kD+g/lqwg2CVoD5UqPiffRRm8=; b=ZllLBlXPlzPwMUYOSsj7GXrw678phsQESiEcrUosgL7nNEt00ZZIp3Gs5liRRsWpS9 94YNc3bPdu6eTCBl4W3eYzN/O/de4MxonRAOCav3NOeqzt6vKlfpPCGxbqQyycbzOakB od89JodAiajxS01lflXTIF5eF84rEQWuHk2PFoc5/Hhj+hrh3rpM6OEwut1YnmI3K+84 +2sHro3+TY4irrJPPAuiZszRFBSUoUiszwMhao3Gjo+ZEXcQ8CWh6ENxPxF4nV2tm+ot ta9Ymtia3r4vNXxqPZN6HESBeAMxtVlx/QOY4stgfG/D9gzJ6srKj4vSkrMryrcACqk5 N+Zw== X-Forwarded-Encrypted: i=1; AFNElJ++eNnP1F02EkI7/tWN67PFHJhZMhURJepEL35+CaVJvOJ0jX5cUN83H88GAhUK0LsDAoVWdpre5ZvLCrc=@vger.kernel.org X-Gm-Message-State: AOJu0Yy1jSf1IsGEi6N7tbZbk8eW/2C5BISyk2F1kYqJIlWbv3p3Gid9 Wv4m9IM/5GGUtX4TL3Szm+eGRFnJkyS2Oh6WGD9rgpdJYJY0twPsgKyB2EyqK5PlI1EBAWnfPo0 J1JA66Q== X-Received: from pfbeq3.prod.google.com ([2002:a05:6a00:37c3:b0:82f:ad57:40bb]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:44c3:b0:82c:6da7:2d3d with SMTP id d2e1a72fcca58-83f33c2a8fdmr5145208b3a.11.1778872862416; Fri, 15 May 2026 12:21:02 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:26 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-26-seanjc@google.com> Subject: [PATCH v3 25/41] x86/kvmclock: Hook clocksource.suspend/resume when kvmclock isn't sched_clock From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Save/restore kvmclock across suspend/resume via clocksource hooks when kvmclock isn't being used for sched_clock. This will allow using kvmclock as a clocksource (or for wallclock!) without also using it for sched_clock. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/kernel/kvmclock.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index ccb2aff89b2f..655037949446 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -131,7 +131,17 @@ static void kvm_setup_secondary_clock(void) =20 static void kvm_restore_sched_clock_state(void) { - kvm_register_clock("primary cpu clock, resume"); + kvm_register_clock("primary cpu, sched_clock resume"); +} + +static void kvmclock_suspend(struct clocksource *cs) +{ + kvmclock_disable(); +} + +static void kvmclock_resume(struct clocksource *cs) +{ + kvm_register_clock("primary cpu, clocksource resume"); } =20 void kvmclock_cpu_action(enum kvm_guest_cpu_action action) @@ -202,6 +212,8 @@ static struct clocksource kvm_clock =3D { .flags =3D CLOCK_SOURCE_IS_CONTINUOUS, .id =3D CSID_X86_KVM_CLK, .enable =3D kvm_cs_enable, + .suspend =3D kvmclock_suspend, + .resume =3D kvmclock_resume, }; =20 static void __init kvmclock_init_mem(void) @@ -297,6 +309,15 @@ static __init void kvm_sched_clock_init(bool stable) kvm_save_sched_clock_state, kvm_restore_sched_clock_state); =20 + /* + * The BSP's clock is managed via dedicated sched_clock save/restore + * hooks when kvmclock is used as sched_clock, as sched_clock needs to + * be kept alive until the very end of suspend entry, and restored as + * quickly as possible after resume. + */ + kvm_clock.suspend =3D NULL; + kvm_clock.resume =3D NULL; + pr_info("kvm-clock: using sched offset of %llu cycles", kvm_sched_clock_offset); =20 --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B4CFA40C7A1 for ; Fri, 15 May 2026 19:21:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872866; cv=none; b=LxlToa80BGBHq6lP//8uGQn9keOVxArLhEfzOD9MIJJJv9tOwoHcral4wEtnC4aaU9RjReT68u7GMlE9i1gcZh0SUQX0pnVfOgwUm67/b7uyOBhZaZtOfbRPfp1L0lzkztPH+ltnkpM8+1IVoBttF3UQ3uDmHIr7iAziI94lDEA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872866; c=relaxed/simple; bh=njyJbcCwcXeXO9YjbcQGwk3m3d5+4iPknlalgaFw/CU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=LJmqfGu1i5110SD8Fvs0FVGJNblFxtitXwgVJNoWyejFl9Rtj55yoiV6JbNZ5pA73h0bHiUA7FV+vjrz3FEmPWNRZAL2oUw1v11uCM3d8TMsuFFvZlExkUSNa5wWM1JKqdw9V9VsnIWnLhw8UeHbqXgREXVFtu8a3hSAZGQkwOw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=m9z2TnIg; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="m9z2TnIg" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-3684cb22502so73106a91.2 for ; Fri, 15 May 2026 12:21:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872864; x=1779477664; darn=vger.kernel.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=5QvrpVnh0KMuRz6LXU92QW6Er6134KolvOCNQ9nQk3A=; b=m9z2TnIghs94WH+qrODjH2L6W6j0LHlvUy960yEkmiP3KJCa+qLhV6MFNiPeAsVyhK jEQyGKWSai8kM9yyybDVjNC6Tbp1qatfjeYRq/7yjrQCNh/iwTCiC1+oyR0BSkjaexOR XAtucWQCcv6KqgoSbEM/F9qFoGBJk9DmrbuwJJJfm06ExsnRQMb5AACQausHweg1XX7W OiPszx6F3a5PrZIK9/BoE6MLDaLMVYYPt2DJ1Sj5Tzc6Z8t9nN1tzAOGa5R7FY0ONR5g R80UGpmMjSPSiZI7bPb72SDiU0FkTGjjRva9553j0kmca7THpaypkS6FVCcTEhHKZTZN 6glg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872864; x=1779477664; 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=5QvrpVnh0KMuRz6LXU92QW6Er6134KolvOCNQ9nQk3A=; b=MGmK3B83r+e2/4oOXV8WCyrZMUVavhc7y4uNcCrcjsku7Zl2Y6i+ivEOYxjBAnsqTW YT5/u50md1cRA9IQKuhAnOBE8/zxhnZO/VvqgHTyTym4K32xTB2KwopJMMBcrCIIMfRE c4cTwdZtGAvVxy+3wg0u1wgG6u9oqZQiePvkKyydxOvwxsvIl5XspbZEG673ndN1hEcI NZ5/xAUgNzB8j8PzvXaeqHIGW4D/RGtc2Hf+Qdpou89uw16BNWd28b4I8EGtZSucpCya KzinO/CgiujsJH490EDD7sPRxKE3kxgihrv8zl/mdJnPqHreM5RexM86JVT9mvURCVXc vS3A== X-Forwarded-Encrypted: i=1; AFNElJ9xwRw0yv3nJuZiywSqHxI6vgkikfeSvdn8jpnbtrqKL9JtQZt7OgfqP0B6v2hJlpvlYgiUoZDXAOTSaXI=@vger.kernel.org X-Gm-Message-State: AOJu0Yzat92va1WSEpehMLQTiSowZF3/Hf9E52/Yz1lADa1Fqgk70SjU rLZNnlKbdel19I5o/O9PLkYDI0bfPdKiOY2QItB/Cnx5a1ZiyDjyrY5DkOfpnaIbYh46yuT8RBu UXgo4Qw== X-Received: from plbl12.prod.google.com ([2002:a17:902:eb0c:b0:2b0:aef9:a5a2]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1d84:b0:368:433:b697 with SMTP id 98e67ed59e1d1-36951ca51ecmr5533993a91.19.1778872863652; Fri, 15 May 2026 12:21:03 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:27 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-27-seanjc@google.com> Subject: [PATCH v3 26/41] x86/kvmclock: WARN if wall clock is read while kvmclock is suspended From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" WARN if kvmclock is still suspended when its wallclock is read, i.e. when the kernel reads its persistent clock. The wallclock subtly depends on the BSP's kvmclock being enabled, and returns garbage if kvmclock is disabled. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/kernel/kvmclock.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 655037949446..e7250d21c672 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -53,6 +53,8 @@ static struct pvclock_vsyscall_time_info *hvclock_mem; DEFINE_PER_CPU(struct pvclock_vsyscall_time_info *, hv_clock_per_cpu); EXPORT_PER_CPU_SYMBOL_GPL(hv_clock_per_cpu); =20 +static bool kvmclock_suspended; + /* * The wallclock is the time of day when we booted. Since then, some time = may * have elapsed since the hypervisor wrote the data. So we try to account = for @@ -60,6 +62,7 @@ EXPORT_PER_CPU_SYMBOL_GPL(hv_clock_per_cpu); */ static void kvm_get_wallclock(struct timespec64 *now) { + WARN_ON_ONCE(kvmclock_suspended); wrmsrq(msr_kvm_wall_clock, slow_virt_to_phys(&wall_clock)); preempt_disable(); pvclock_read_wallclock(&wall_clock, this_cpu_pvti(), now); @@ -119,6 +122,7 @@ static void kvm_save_sched_clock_state(void) * to the old address prior to reconfiguring kvmclock would clobber * random memory. */ + kvmclock_suspended =3D true; kvmclock_disable(); } =20 @@ -131,16 +135,19 @@ static void kvm_setup_secondary_clock(void) =20 static void kvm_restore_sched_clock_state(void) { + kvmclock_suspended =3D false; kvm_register_clock("primary cpu, sched_clock resume"); } =20 static void kvmclock_suspend(struct clocksource *cs) { + kvmclock_suspended =3D true; kvmclock_disable(); } =20 static void kvmclock_resume(struct clocksource *cs) { + kvmclock_suspended =3D false; kvm_register_clock("primary cpu, clocksource resume"); } =20 --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3076340C7C5 for ; Fri, 15 May 2026 19:21:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872868; cv=none; b=G65+eIFP9ZTvcKWSmcxAtPksueQklg0FcYywDJr4eqQgX7c6hV7WkJDCG2epkAc3w+XjTLmiUQRBtSCHaFvPKiGLbQEeoDANgYyr1OntDNkd0mwgwTFHVqNF9k4TL5yYO3plMxtWEG16lZPw8EV836bRK1cpxNqhBry+flgcGcM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872868; c=relaxed/simple; bh=zHts7S5ctJxrCQFHnZI66ey/sV4LnssrZ3CfSU2lq1U=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=R67ztcTrNNOjdflzMRdq0UesgxiutJaeeRzJs8S3ShGldwsLxBTGv9biSQbgjzGqbGDJg0FdStwuINNIs+wLmNO16w+XaPfNk1GqEecXNC2bZmsBYP6dZK2y59Gy7HlMa2NeusRZlrSRjOfr9p+xtCyF0iRhA5IQA5AD2nP1/Uc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=cAPdeFOd; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="cAPdeFOd" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2b9a3c3c4eeso3816025ad.3 for ; Fri, 15 May 2026 12:21:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872865; x=1779477665; darn=vger.kernel.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=9y7n0IksKFKFboHRfxCkU+QRldsv6JkfRx9t9kwNLA4=; b=cAPdeFOdNX/JG2MqM9sXcKVx2p33cguDr3E49fB88r+cOHXVHK/qTkjbIN0NPm0JVJ 1ZXQ4eG6z9H3Tb+tAP1FR++KS5r3dso/4o8NSiCzyy1kn32qPdKfau3pil2sTAsMIXQ1 SXvCFJgnqskX6nO8VEjtM1Ru7FsPzNjjVFazT3rUMjeYc+/V2D0FIT2UTid4C63EHlht T9+5k14vD7F+bBNIZr6EScgZPsPAk7CNE5vHlF3yMwpGDpTX/vi5dc1AyE/lWDzhw0pl BXRWn6qCA8gZ4WYPFTEvtTOCdgbvGr+715NlJn3vasNWcwGioeUxT3Hx5ex20pixHkMC ssLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872865; x=1779477665; 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=9y7n0IksKFKFboHRfxCkU+QRldsv6JkfRx9t9kwNLA4=; b=ALExpHaR2Uis89/uXHtB6tGQuUbYcR91tPHM5W73IoW0dnvqjjJoo0NPVUHvPrHQ/N tnJdJnSKSDdKSSPfgh7GC3vfkLLS0E9IPsavJKO88RGII0NiqimXBJoxdW8Q0ovvPD+k pE2+gHq6tnZ4087kKP/Dg4g+7nJdwwANPent7BgoYKOLGwsGyhyA0pHEVCr9IJurvWdz ZY2jrXBR491dM9uWgJYiluQJQWEWrG91PhZogQQpebSxwJEUCapko6ipgh8F8je2EoQ+ lT/EscIpar0x349oSFjzIWhprz8kPENanpR8UmNbsyA0feeN1An0D35IF26d7a8UZe99 +oIg== X-Forwarded-Encrypted: i=1; AFNElJ9S+cj5hdMOR023/1ZYBvLXef0vHmym1Ejy2cGYLJ6Pj6Czy8aXRAxGTpnrUeicuJ2hUWSdU49PAfmQT6Y=@vger.kernel.org X-Gm-Message-State: AOJu0YxgK/WxjSZ3Ikc0kdDHUFfTckuOunPinvSaiaiU0rKm/QmR1Gtd ZpdCZVMhsrpbcOkJQOGMPuIoagCoTlnyQ81U9NHCMVDlMbpVrIew/+/YS54E0KgDcwFBE7rXtrN BzfLqbg== X-Received: from plnq2.prod.google.com ([2002:a17:902:f782:b0:2bd:7c8c:4ef4]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:bc8:b0:2ba:30fb:d777 with SMTP id d9443c01a7336-2bd7e86c408mr40874505ad.6.1778872864946; Fri, 15 May 2026 12:21:04 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:28 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-28-seanjc@google.com> Subject: [PATCH v3 27/41] x86/kvmclock: Enable kvmclock on APs during onlining if kvmclock isn't sched_clock From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In anticipation of making x86_cpuinit.early_percpu_clock_init(), i.e. kvm_setup_secondary_clock(), a dedicated sched_clock hook that will be invoked if and only if kvmclock is set as sched_clock, ensure APs enable their kvmclock during CPU online. While a redundant write to the MSR is technically ok, skip the registration when kvmclock is sched_clock so that it's somewhat obvious that kvmclock *needs* to be enabled during early bringup when it's being used as sched_clock. Plumb in the BSP's resume path purely for documentation purposes. Both KVM (as-a-guest) and timekeeping/clocksource hook syscore_ops, and it's not super obvious that using KVM's hooks would be flawed. E.g. it would work today, because KVM's hooks happen to run after/before timekeeping's hooks during suspend/resume, but that's sheer dumb luck as the order in which syscore_ops are invoked depends entirely on when a subsystem is initialized and thus registers its hooks. Opportunsitically make the registration messages more precise to help debug issues where kvmclock is enabled too late. Opportunstically WARN in kvmclock_{suspend,resume}() to harden against future bugs. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/include/asm/kvm_para.h | 2 ++ arch/x86/kernel/kvm.c | 24 +++++++++++------- arch/x86/kernel/kvmclock.c | 44 +++++++++++++++++++++++++++------ 3 files changed, 53 insertions(+), 17 deletions(-) diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_par= a.h index 2adba2aff539..17053d2bf270 100644 --- a/arch/x86/include/asm/kvm_para.h +++ b/arch/x86/include/asm/kvm_para.h @@ -120,6 +120,8 @@ static inline long kvm_sev_hypercall3(unsigned int nr, = unsigned long p1, #ifdef CONFIG_KVM_GUEST enum kvm_guest_cpu_action { KVM_GUEST_BSP_SUSPEND, + KVM_GUEST_BSP_RESUME, + KVM_GUEST_AP_ONLINE, KVM_GUEST_AP_OFFLINE, KVM_GUEST_SHUTDOWN, }; diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 0131bc1cb459..65c787b1ea03 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -471,18 +471,24 @@ static void kvm_guest_cpu_offline(enum kvm_guest_cpu_= action action) kvmclock_cpu_action(action); } =20 +static int __kvm_cpu_online(unsigned int cpu, enum kvm_guest_cpu_action ac= tion) +{ + unsigned long flags; + + local_irq_save(flags); + kvmclock_cpu_action(action); + kvm_guest_cpu_init(); + local_irq_restore(flags); + return 0; +} + +#ifdef CONFIG_SMP + static int kvm_cpu_online(unsigned int cpu) { - unsigned long flags; - - local_irq_save(flags); - kvm_guest_cpu_init(); - local_irq_restore(flags); - return 0; + return __kvm_cpu_online(cpu, KVM_GUEST_AP_ONLINE); } =20 -#ifdef CONFIG_SMP - static DEFINE_PER_CPU(cpumask_var_t, __pv_cpu_mask); =20 static bool pv_tlb_flush_supported(void) @@ -747,7 +753,7 @@ static int kvm_suspend(void *data) =20 static void kvm_resume(void *data) { - kvm_cpu_online(raw_smp_processor_id()); + __kvm_cpu_online(raw_smp_processor_id(), KVM_GUEST_BSP_RESUME); =20 #ifdef CONFIG_ARCH_CPUIDLE_HALTPOLL if (kvm_para_has_feature(KVM_FEATURE_POLL_CONTROL) && has_guest_poll) diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index e7250d21c672..d3bb281c0805 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -53,6 +53,7 @@ static struct pvclock_vsyscall_time_info *hvclock_mem; DEFINE_PER_CPU(struct pvclock_vsyscall_time_info *, hv_clock_per_cpu); EXPORT_PER_CPU_SYMBOL_GPL(hv_clock_per_cpu); =20 +static bool kvmclock_is_sched_clock; static bool kvmclock_suspended; =20 /* @@ -129,7 +130,7 @@ static void kvm_save_sched_clock_state(void) #ifdef CONFIG_SMP static void kvm_setup_secondary_clock(void) { - kvm_register_clock("secondary cpu clock"); + kvm_register_clock("secondary cpu, sched_clock setup"); } #endif =20 @@ -141,25 +142,51 @@ static void kvm_restore_sched_clock_state(void) =20 static void kvmclock_suspend(struct clocksource *cs) { + if (WARN_ON_ONCE(kvmclock_is_sched_clock)) + return; + kvmclock_suspended =3D true; kvmclock_disable(); } =20 static void kvmclock_resume(struct clocksource *cs) { + if (WARN_ON_ONCE(kvmclock_is_sched_clock)) + return; + kvmclock_suspended =3D false; kvm_register_clock("primary cpu, clocksource resume"); } =20 void kvmclock_cpu_action(enum kvm_guest_cpu_action action) { - /* - * Don't disable kvmclock on the BSP during suspend. If kvmclock is - * being used for sched_clock, then it needs to be kept alive until the - * last minute, and restored as quickly as possible after resume. - */ - if (action !=3D KVM_GUEST_BSP_SUSPEND) + switch (action) { + /* + * The BSP's clock is managed via clocksource suspend/resume, + * to ensure it's enabled/disabled when timekeeping needs it + * to be, e.g. before reading wallclock (which uses kvmclock). + */ + case KVM_GUEST_BSP_SUSPEND: + case KVM_GUEST_BSP_RESUME: + break; + case KVM_GUEST_AP_ONLINE: + /* + * Secondary CPUs use dedicated sched_clock hooks to enable + * kvmclock early during bringup, there's nothing to be done + * when during CPU online. + */ + if (kvmclock_is_sched_clock) + break; + kvm_register_clock("secondary cpu, online"); + break; + case KVM_GUEST_AP_OFFLINE: + case KVM_GUEST_SHUTDOWN: kvmclock_disable(); + break; + default: + WARN_ON_ONCE(1); + break; + } } =20 /* @@ -315,6 +342,7 @@ static __init void kvm_sched_clock_init(bool stable) __paravirt_set_sched_clock(kvm_sched_clock_read, stable, kvm_save_sched_clock_state, kvm_restore_sched_clock_state); + kvmclock_is_sched_clock =3D true; =20 /* * The BSP's clock is managed via dedicated sched_clock save/restore @@ -358,7 +386,7 @@ void __init kvmclock_init(void) msr_kvm_system_time, msr_kvm_wall_clock); =20 this_cpu_write(hv_clock_per_cpu, &hv_clock_boot[0]); - kvm_register_clock("primary cpu clock"); + kvm_register_clock("primary cpu, online"); pvclock_set_pvti_cpu0_va(hv_clock_boot); =20 if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE_STABLE_BIT)) { --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A4A5F3BFAD0 for ; Fri, 15 May 2026 19:21:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872869; cv=none; b=JFIoL4Vm91wv6gTnE+mY251l2bsFBm2WmeAE7yPnAbnDJJPM6vG1GK3lod18Dz/c9EueaA2fP4RJjy6RSZwXJFj1Tp5F/zfllaCy5RhAZwFwlH91lN2I56V5OunSe451cSxu22OInXlSzB4A7l7n13hUwtBSMPlYPAbyybXajgY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872869; c=relaxed/simple; bh=dMZi/ynefGqL3V/hiHHk2W0j93MqJm0B6kXxK/NMi+E=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=WPVT0aykh4b/k6Z5oqSXbqP7eggfsrXfivvMrpiG1uAhRDJ7EkbQxZnGRdF5Jaml1e3Wphmyp3tYVNN6BM8Cl285IsfhWA0oHqG7icTKdgAy3BDrc5cCTAF9cIDOjT+ifqDvc7d4Fn24rFqiaFyKO1EQgPFXY8EYY4LGZ/AAde4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=vln0evpJ; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="vln0evpJ" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-3662668b825so208742a91.3 for ; Fri, 15 May 2026 12:21:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872867; x=1779477667; darn=vger.kernel.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=czryuinsQM/bDv8Ei5QNsAEKCG27pLCUAiJBy5nMgao=; b=vln0evpJjZCLQm4W9wGjjm1WrHcySGyzcgPoYi71uio/EQ82k1Jxte/hG4jFU161yH +6lhqX3ZkNCJY0Jl41wthOia5vZeRbm+Gl46Yljg1rqfXFe+Cmn3xPbgX4k67i6xnfcg 4dgXfAzGvkn+92OMReJZIzRp2O5+6U77GkfgxwF+8sgzmNvznuDbrLtF3Gyi6ufIIzKU HoZOGpZNAXuc+zCLUtzEyCvA7N+kBjVXIFxkkPKnJeRdZPwveIPkcm85nD/W3krjrt/+ exb13ZQ0xoQ84gAl0buyjrXrdLq6Cl+S+B7j960mUP7nZq383Q5/Qw4q5urX8QmFjdO+ d3IQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872867; x=1779477667; 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=czryuinsQM/bDv8Ei5QNsAEKCG27pLCUAiJBy5nMgao=; b=WGJ8U3wcXZu2fpMb7HCqtBkGrDmvio+y+cqlntS4MP0cGfc0ixv5w67QFb+5DVDEg+ pnvuKsak61Ju240n14IpLxdFGGDsXf0Of4IAenDfObRxqdGCWbVaZ5s8Yw/J1iUqnUj5 8CdVmHvzdfole2BACg3xdGp96Z/wceYBxsAC3ILQDQjxEL7mCsL7YFJfsrBaDT6mzoY1 3aFZ9VdBOInuOQBr2EdgtSNH5VLsQAlYD/KVqKlZp6OezvgXaEfv8JUDMkpox5E5Gby2 owrnyW+jKOTWBX5SJOwkGmkrvfck4/ZOBbG9KBhoUKyIY2EWLfMELb9KgUCd2WSPpjfc F7sQ== X-Forwarded-Encrypted: i=1; AFNElJ8XyuzFbCw6ICGswbVTgA1gwWBYc71OuRSxIEBwEa0PdvNaMToIQw5x90Qa6M14iLCeY/PlEcmmeWngqq0=@vger.kernel.org X-Gm-Message-State: AOJu0YwZPSWRvVknibRkjIW34jbzqJX0v3Z2SlU1yw6qigT0dOI2sJR5 w6fUVuPOxfVkBAlIbXB6hkvMwekJTf8AH0itZmLI6wiM4fFFFbJ4CwWccDMk39U+3CxpSJ3m7Cd mVg1yBw== X-Received: from pjbiw14.prod.google.com ([2002:a17:90b:420e:b0:365:df9b:ae96]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:4ca4:b0:369:69f8:ad6b with SMTP id 98e67ed59e1d1-36969f8b046mr1344290a91.0.1778872866654; Fri, 15 May 2026 12:21:06 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:29 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-29-seanjc@google.com> Subject: [PATCH v3 28/41] x86/paravirt: Mark __paravirt_set_sched_clock() as __init From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Annotate __paravirt_set_sched_clock() as __init, and make its wrapper __always_inline to ensure sanitizers don't result in a non-inline version hanging around. All callers run during __init, and changing sched_clock after boot would be all kinds of crazy. No functional change intended. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/include/asm/timer.h | 10 +++++----- arch/x86/kernel/tsc.c | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/arch/x86/include/asm/timer.h b/arch/x86/include/asm/timer.h index e97cd1ae03d1..96ae7feac47c 100644 --- a/arch/x86/include/asm/timer.h +++ b/arch/x86/include/asm/timer.h @@ -14,12 +14,12 @@ extern int no_timer_check; extern bool using_native_sched_clock(void); =20 #ifdef CONFIG_PARAVIRT -void __paravirt_set_sched_clock(u64 (*func)(void), bool stable, - void (*save)(void), void (*restore)(void)); +void __init __paravirt_set_sched_clock(u64 (*func)(void), bool stable, + void (*save)(void), void (*restore)(void)); =20 -static inline void paravirt_set_sched_clock(u64 (*func)(void), - void (*save)(void), - void (*restore)(void)) +static __always_inline void paravirt_set_sched_clock(u64 (*func)(void), + void (*save)(void), + void (*restore)(void)) { __paravirt_set_sched_clock(func, true, save, restore); } diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 0114c63dfdd9..4a48b8ba5bea 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -280,8 +280,8 @@ bool using_native_sched_clock(void) return static_call_query(pv_sched_clock) =3D=3D native_sched_clock; } =20 -void __paravirt_set_sched_clock(u64 (*func)(void), bool stable, - void (*save)(void), void (*restore)(void)) +void __init __paravirt_set_sched_clock(u64 (*func)(void), bool stable, + void (*save)(void), void (*restore)(void)) { if (!stable) clear_sched_clock_stable(); --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AC1E140D1CC for ; Fri, 15 May 2026 19:21:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872870; cv=none; b=n7yHTDYPPV5cYIpmTAmLSAJI+eAbQMOTyLJZjX2cDFiyuWjUC3lR1A8SV3ixdQ2W3T6WxcpRrra5nCzgmA822fABZf4TGasKPfhPP0vHxJdKma3pL7eEYUqXswVYBjLtOWV0wIyHGN/7trwxGV3w+EWmJTkQ1YOfXiJWWwHvFlI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872870; c=relaxed/simple; bh=wHV+tqsgKZeHCNlwzMKQ+ffX2tGbMars+kUaRwUmZDQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=sc+q3Fp4UXVUbk+SBWZ2RjhetHrnuDWmCPT6GqA4sq6P2BzcT4qcVv+sCrFt4dNA2NHCklKYxfcxlwhbUWfFo60FVU72gH/1w5tkHsSx6lSaYxiNHS29qXdM01nyLKACpIAH5GeI6b5OUrC+dd+KJHDjJom9DiDnbcHyQoX6vuY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=PIcnnCKs; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="PIcnnCKs" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-83cecc22d5fso80403b3a.2 for ; Fri, 15 May 2026 12:21:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872868; x=1779477668; darn=vger.kernel.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=pNsHSCzVBvNpSbb8atgOEwFmCd7ur8peJFPmwL2u2ME=; b=PIcnnCKsUhDggNx5raHnwzwB1GSeKCUoxOzu+H38L7b4K/vfohKztrmRSi36SL7GxH nA9xXTw9P84T+AQa23IWjiOkCe0kaOGR4HdA4dmFr/qNDrZI3QwCsmYHcBGj5ClsDcK3 5dJ9S+sN2oFDQjPUJYNvwqyzArqebuQ9nDvR/zEkB9gruttwvaD3cHNCX2meIgcKPVV4 DCQ3IFqmcGJypLr6paDYTbs+R9kzbo2kH3cjHNLl9lGgqMUYG+f3FAehGEe+F3wbxItU X7YAtlkHbT+OGaJCq1NKqqqRwXcNVb7g+LAW5XnueCyBKnESK/QGkBCAmitROs0wZCTC tjOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872868; x=1779477668; 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=pNsHSCzVBvNpSbb8atgOEwFmCd7ur8peJFPmwL2u2ME=; b=awi0nQjX4wQ2P2WKIEsp1GIW4z+gv1yzamWwhGBt01OA6rFtnl49FWLa+tImfWLc7T e4vwyztt4XQr6tSRdryzIJjjooGGzPc1zsBPbAONegS/YmrIZ3tIJyzyunDts4iDhjWv RPbaOUZfkHmEFixBS+MKAzZN7HzJBAlQzAVjjVysp6qUXCp7cobtA5plOsWDgqPLhXYf VJE4VJblSwAzLEScrVgkWC81kORPQxApZAj+xWDUaEPpNtqconeTjWl/bYZxER4iQSS5 GU23RqTulatx/2Q9qUZJ6TxRaba7YBqkQ67S0x6OdP6Ay1xVwPE7qztSqsn9zhPlHBoW qhxQ== X-Forwarded-Encrypted: i=1; AFNElJ+UCkmmp9xc1Fg23YL4L7azq8amlwJ7j7h5lsTWPfJvvrtvb3Zy+jWmDdVw1JfC6tVMyap7gDV2B2keiFA=@vger.kernel.org X-Gm-Message-State: AOJu0YzlS2H1I95TviBFa5hSJBA0uJMEOO1vN1ck2WvCoNK8Cqmimzmp soEdrITul+39blrbT0zyXqT8JIqYuTierVRIdEZx5Fj8YFZsw4WXksCIknoHyigpm0QRnEE/Je/ mGj4VpA== X-Received: from pfra8.prod.google.com ([2002:aa7:8e88:0:b0:83e:b125:ff3c]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3005:b0:82f:29fe:7239 with SMTP id d2e1a72fcca58-83f33d3659cmr5558676b3a.50.1778872867738; Fri, 15 May 2026 12:21:07 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:30 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-30-seanjc@google.com> Subject: [PATCH v3 29/41] x86/paravirt: Plumb a return code into __paravirt_set_sched_clock() From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a return code to __paravirt_set_sched_clock() so that the kernel can reject attempts to use a PV sched_clock without breaking the caller. E.g. when running as a CoCo VM with a secure TSC, using a PV clock is generally undesirable. Note, kvmclock is the only PV clock that does anything "extra" beyond simply registering itself as sched_clock, i.e. is the only caller that needs to check the new return value. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/include/asm/timer.h | 6 +++--- arch/x86/kernel/kvmclock.c | 8 +++++--- arch/x86/kernel/tsc.c | 5 +++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/arch/x86/include/asm/timer.h b/arch/x86/include/asm/timer.h index 96ae7feac47c..ca5c95d48c03 100644 --- a/arch/x86/include/asm/timer.h +++ b/arch/x86/include/asm/timer.h @@ -14,14 +14,14 @@ extern int no_timer_check; extern bool using_native_sched_clock(void); =20 #ifdef CONFIG_PARAVIRT -void __init __paravirt_set_sched_clock(u64 (*func)(void), bool stable, - void (*save)(void), void (*restore)(void)); +int __init __paravirt_set_sched_clock(u64 (*func)(void), bool stable, + void (*save)(void), void (*restore)(void)); =20 static __always_inline void paravirt_set_sched_clock(u64 (*func)(void), void (*save)(void), void (*restore)(void)) { - __paravirt_set_sched_clock(func, true, save, restore); + (void)__paravirt_set_sched_clock(func, true, save, restore); } #endif =20 diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index d3bb281c0805..9b3d1ed1a96d 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -338,10 +338,12 @@ static int kvmclock_setup_percpu(unsigned int cpu) =20 static __init void kvm_sched_clock_init(bool stable) { + if (__paravirt_set_sched_clock(kvm_sched_clock_read, stable, + kvm_save_sched_clock_state, + kvm_restore_sched_clock_state)) + return; + kvm_sched_clock_offset =3D kvm_clock_read(); - __paravirt_set_sched_clock(kvm_sched_clock_read, stable, - kvm_save_sched_clock_state, - kvm_restore_sched_clock_state); kvmclock_is_sched_clock =3D true; =20 /* diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 4a48b8ba5bea..3c15fc10e501 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -280,8 +280,8 @@ bool using_native_sched_clock(void) return static_call_query(pv_sched_clock) =3D=3D native_sched_clock; } =20 -void __init __paravirt_set_sched_clock(u64 (*func)(void), bool stable, - void (*save)(void), void (*restore)(void)) +int __init __paravirt_set_sched_clock(u64 (*func)(void), bool stable, + void (*save)(void), void (*restore)(void)) { if (!stable) clear_sched_clock_stable(); @@ -289,6 +289,7 @@ void __init __paravirt_set_sched_clock(u64 (*func)(void= ), bool stable, static_call_update(pv_sched_clock, func); x86_platform.save_sched_clock_state =3D save; x86_platform.restore_sched_clock_state =3D restore; + return 0; } #else u64 sched_clock_noinstr(void) __attribute__((alias("native_sched_clock"))); --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF94040D1F3 for ; Fri, 15 May 2026 19:21:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872871; cv=none; b=Y3dtd7d+D3SCQYKZv5Cq5kPRpFSwOPixl619dBb1e304rd9NjAQxewJv7bQxubZiw0eI4sTrhmb/mBzEMUTWWajv7KwKZebzM4CXGeKLpfGOLe+5hRABQXyKMze2Mo7GHxOH4py898JNacHdtm7ExWTMjdr/nN51YXg0WQBJf24= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872871; c=relaxed/simple; bh=HQc+XSE41PFV7TKfdfxzuaNckcb4A4qOikHfqQvrKd4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=I22IzM7glfcDxsgZsD5TteMSZoWR2Vdh9OKQnvW54d47vfP5aqgHjdSqC0LPh7CzwQ8Jz791vnsIKyMZOIFKgDvjtVNvRZmJQ5lZK9wZYXS2ITl8HsooEvswsh8hKsT3QpH2v5TAP+tyPGJomhu1gjORG3uhy3kqkhdvlkBOS5U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=oWA4z6kn; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="oWA4z6kn" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-82f6b984b3aso137379b3a.3 for ; Fri, 15 May 2026 12:21:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872869; x=1779477669; darn=vger.kernel.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=teddAWkuf/46YtH4MCYfAbMCm8nV+WgxKaJ2tNA73Cw=; b=oWA4z6kn5eNKhuItZj0wrAFY0RwVdX+/QqtJ55/4FkoBQeiqc+x6KyO8m3lkuFi8PF BELPeMEwpeYsy19FJesCeoPr0wlE50Wsour6gWVJ/THIxd5FHiJNHTT6kiSLy5YPGHBW icBrI9HROCBA4e4fYBwQeQq8FddYVh8FySmoWJqZp+ZEKsD5ypN2yNm2wyjGBeXVMnCD tUrkdZwLExwB6RUEMGc3ELts3ttna2Bk9Voy0R6lQLm9l+p6QAIGKMdKjJ3nps9GD30u XvFhez5OxZSw/bGZ6UW7lGDSmJ131RFRnEt5l7nBQ8IiBxh9XiFtA55iFXhqk2OAqpUe DAyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872869; x=1779477669; 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=teddAWkuf/46YtH4MCYfAbMCm8nV+WgxKaJ2tNA73Cw=; b=ZeQiWP2MDuqan2HkHlcaRw3xKG/pEvdwBuwlXJvwsvLiyVpPUo995gC0SQE1kH+u3I /708h3COJAGCNleeOhmh/m4W44Qq59cr5lCJ+4yo1ISrs6DUr1HQ1c9Gqrn52Dl6uQ2E n8HWHjF4VLhCE6/y0SC6OQvQIyOQs3lYtI98oxwVwOKECH+VElKSodAmsjfvMfn1rqc4 iss0EYAIixbznotSAhXQqazR+KIo6cKlrCPW03eN00eJOJQN+CyBNnEveZLh4kIWq3lC nYO0Lio3t2RS+n1Cmrli4xDIHn73jUsIWUZoCBntkJanUXt0tSKHfnWbeYz3CCa0FnrZ 0sMA== X-Forwarded-Encrypted: i=1; AFNElJ+h7KC/0EEVAslExG6cHkrIdFRx+sNIBulbLzdSffeZ311m2Epg8yYAKy+W1yLyT2iJPFlgo0z4MZnac5U=@vger.kernel.org X-Gm-Message-State: AOJu0YwrvY2oQGu3tlKBA5rgbtIk/P5O2LTekGWf+sBmkQ06eFy/Vhen hQqyy/8+I1cVeY//aw1YfKwKzw8nBdbreGrgM3eUg2B3N86MNgTm3TaqxBAb2BvZpJnjxSOqF1i OgIGAkg== X-Received: from pfbdu21.prod.google.com ([2002:a05:6a00:2b55:b0:82f:6245:a6ec]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:950f:b0:838:c01a:7a50 with SMTP id d2e1a72fcca58-83f33d8c1ddmr5490444b3a.30.1778872868844; Fri, 15 May 2026 12:21:08 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:31 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-31-seanjc@google.com> Subject: [PATCH v3 30/41] x86/paravirt: Don't use a PV sched_clock in CoCo guests with trusted TSC From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Silently ignore attempts to switch to a paravirt sched_clock when running as a CoCo guest with trusted TSC. In hand-wavy theory, a misbehaving hypervisor could attack the guest by manipulating the PV clock to affect guest scheduling in some weird and/or predictable way. More importantly, reading TSC on such platforms is faster than any PV clock, and sched_clock is all about speed. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/kernel/tsc.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 3c15fc10e501..ac4abfec1f05 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -283,6 +283,15 @@ bool using_native_sched_clock(void) int __init __paravirt_set_sched_clock(u64 (*func)(void), bool stable, void (*save)(void), void (*restore)(void)) { + /* + * Don't replace TSC with a PV clock when running as a CoCo guest and + * the TSC is secure/trusted; PV clocks are emulated by the hypervisor, + * which isn't in the guest's TCB. + */ + if (cc_platform_has(CC_ATTR_GUEST_SNP_SECURE_TSC) || + boot_cpu_has(X86_FEATURE_TDX_GUEST)) + return -EPERM; + if (!stable) clear_sched_clock_stable(); =20 --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 246BF40C7C6 for ; Fri, 15 May 2026 19:21:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872873; cv=none; b=JYWkwOquLcXIywQhzJ9d8MgHNL3iCsZWpXqg2dExqj3gVRFrBUEqGsQjGDkhG8ke6edYN9oB9I01Sk8WDsS+Pgj1uPC4g1h6SPWE+6H0YDGLf7TtLpU2/YwQpToE0yT7ssfyrAaCqp3bpDVLZHg7S9hGpX6EInziNRTx5ra+j5w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872873; c=relaxed/simple; bh=aDdzPwKH5mlXfE5QjpaWfAhYaCF3O4EfHaFLXFBr3HA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=mILQ/jKwcBn1l/bB9zp0jNyKjSLx45fFI1Le4Kce3Rd3tCT+hIF20mafE4UV9+CobhRdqkOM/9uLLZBB1IHPP4qlh/74GcrcYkG6eeVrmoQ9qtUKelWu9gnchLKuh1/tOpstJ9zSH+EDnsXXMkpzBI6f4RW8zeZeWZBOZrk43Yc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=OcaKfuWZ; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="OcaKfuWZ" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c828f0f5c23so65084a12.1 for ; Fri, 15 May 2026 12:21:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872870; x=1779477670; darn=vger.kernel.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=GynyMcltCamU1dXPXnRIm6lqrNcs78pXek2ggzODYGc=; b=OcaKfuWZScDCiYakezYFFgYQq0P0U4CNc8J8qPgOEk8Bvb9H4pD8lz0eGAKLkHLfdy PFtGMPKp+9xPywW69qZHdP9pluXHJA2N4S8qGjw8XwhnAKfrGE+X38bjtu9gn4EBrlZp +GcCdB0H7/pMQMJh72yxWuZVWt7VbzX2MSA0ZfQTwg9JGxRl2pPkXUYvq92jMb8X1wU2 h00W3D2RqhxpM/cyKt634wv+cvnExEj+JimAhPgqJAuQ4iGEpaSl3JMzlJjUgnfpQdSN nE3jL2wH0+ZU/NDK+7YFaJudKdEASHp6fxWcXxVE1sZd/+jbcm6bI4RCB2+XiB305P8Z QFxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872870; x=1779477670; 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=GynyMcltCamU1dXPXnRIm6lqrNcs78pXek2ggzODYGc=; b=FQN20gkY5eUZd6C2ApWyGJnr434BV2RINjKjgdBUwRLuZGo3VCphshS1o4wE8B14YT BKlQMLYzDE01qbCXR1Eydg8LNb7kafHOmxCQxs9FbZylvxORiiqSjcsacxbwZrUeF4Qo 9msh6gLgyBUgj4g+2IkO0rm/aKw0nZ/qoVS/hVXOaSdTC7ulYXbUDxhD7BeYnhuEwAsw /XbNhxC403VtaFPhyGeyDYEdAvkB8nLOpUqRu3RbgSnYjWbFQPdhYmBk9DtyuDgzarEe 4xY/hdls5D+xPcwWpLqWdXqsnoCMLSdff5hHVA8J9olG6RQ+11cGKCyfQOMHTs2JMpBE rNig== X-Forwarded-Encrypted: i=1; AFNElJ9Tz8uALKmUh5P2LTTbFZ2IECIVdgwBVCAXTma2vnoWYKTaUOXrThl+zzlvc8Evh+WwX8LKsK3bdmbotP0=@vger.kernel.org X-Gm-Message-State: AOJu0YwhY2OyvU+wkSSrQOB9bW2QhEDA9BwQKH//DOV7+fSxBXrVdarT STUD+EW4Lg1LqnndEPEe9UfRdT1YLOXV8ZqNoIRCL4GM3WUmfTNEhCSvdVaIlEYhJpNf7Zjy02Y Qnriidw== X-Received: from pgbfm5.prod.google.com ([2002:a05:6a02:4985:b0:c82:7df9:8c21]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:9985:b0:39b:e1e5:a101 with SMTP id adf61e73a8af0-3b22ec7d04bmr6317771637.43.1778872870066; Fri, 15 May 2026 12:21:10 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:32 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-32-seanjc@google.com> Subject: [PATCH v3 31/41] x86/tsc: Pass KNOWN_FREQ and RELIABLE as params to registration From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a "tsc_properties" set of flags and use it to annotate whether the TSC operates at a known and/or reliable frequency when registering a paravirtual TSC calibration routine. Currently, each PV flow manually sets the associated feature flags, but often in haphazard fashion that makes it difficult for unfamiliar readers to see the properties of the TSC when running under a particular hypervisor. The other, bigger issue with manually setting the feature flags is that it decouples the flags from the calibration routine. E.g. in theory, PV code could mark the TSC as having a known frequency, but then have its PV calibration discarded in favor of a method that doesn't use that known frequency. Passing the TSC properties along with the calibration routine will allow adding sanity checks to guard against replacing a "better" calibration routine with a "worse" routine. As a bonus, the flags also give developers working on new PV code a heads up that they should at least mark the TSC as having a known frequency. Reviewed-by: Michael Kelley Tested-by: Michael Kelley Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/coco/sev/core.c | 6 ++---- arch/x86/coco/tdx/tdx.c | 7 ++----- arch/x86/include/asm/tsc.h | 8 +++++++- arch/x86/kernel/cpu/acrn.c | 4 ++-- arch/x86/kernel/cpu/mshyperv.c | 10 +++++++--- arch/x86/kernel/cpu/vmware.c | 7 ++++--- arch/x86/kernel/jailhouse.c | 4 ++-- arch/x86/kernel/kvmclock.c | 4 ++-- arch/x86/kernel/tsc.c | 8 +++++++- arch/x86/xen/time.c | 4 ++-- 10 files changed, 37 insertions(+), 25 deletions(-) diff --git a/arch/x86/coco/sev/core.c b/arch/x86/coco/sev/core.c index 39fb50697542..822a2a0f1a2f 100644 --- a/arch/x86/coco/sev/core.c +++ b/arch/x86/coco/sev/core.c @@ -2037,9 +2037,6 @@ void __init snp_secure_tsc_init(void) =20 secrets =3D (__force struct snp_secrets_page *)mem; =20 - setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); - setup_force_cpu_cap(X86_FEATURE_TSC_RELIABLE); - rdmsrq(MSR_AMD64_GUEST_TSC_FREQ, tsc_freq_mhz); =20 /* Extract the GUEST TSC MHZ from BIT[17:0], rest is reserved space */ @@ -2048,7 +2045,8 @@ void __init snp_secure_tsc_init(void) snp_tsc_freq_khz =3D SNP_SCALE_TSC_FREQ(tsc_freq_mhz * 1000, secrets->tsc= _factor); =20 tsc_register_calibration_routines(securetsc_get_tsc_khz, - securetsc_get_tsc_khz); + securetsc_get_tsc_khz, + TSC_FREQ_KNOWN_AND_RELIABLE); =20 early_memunmap(mem, PAGE_SIZE); } diff --git a/arch/x86/coco/tdx/tdx.c b/arch/x86/coco/tdx/tdx.c index 26890cea790b..7050f3ee6593 100644 --- a/arch/x86/coco/tdx/tdx.c +++ b/arch/x86/coco/tdx/tdx.c @@ -1208,14 +1208,11 @@ static unsigned long tdx_get_tsc_khz(void) =20 void __init tdx_tsc_init(void) { - /* TSC is the only reliable clock in TDX guest */ - setup_force_cpu_cap(X86_FEATURE_TSC_RELIABLE); - setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); - /* * Override the PV calibration routines (if set) with more trustworthy * CPUID-based calibration. The TDX module emulates CPUID, whereas any * PV information is provided by the hypervisor. */ - tsc_register_calibration_routines(tdx_get_tsc_khz, NULL); + tsc_register_calibration_routines(tdx_get_tsc_khz, NULL, + TSC_FREQ_KNOWN_AND_RELIABLE); } diff --git a/arch/x86/include/asm/tsc.h b/arch/x86/include/asm/tsc.h index bae709f5f44d..f458be688512 100644 --- a/arch/x86/include/asm/tsc.h +++ b/arch/x86/include/asm/tsc.h @@ -95,8 +95,14 @@ extern int cpuid_get_tsc_freq(struct cpuid_tsc_info *inf= o); extern void tsc_early_init(void); extern void tsc_init(void); #if defined(CONFIG_HYPERVISOR_GUEST) || defined(CONFIG_AMD_MEM_ENCRYPT) +enum tsc_properties { + TSC_FREQUENCY_KNOWN =3D BIT(0), + TSC_RELIABLE =3D BIT(1), + TSC_FREQ_KNOWN_AND_RELIABLE =3D TSC_FREQUENCY_KNOWN | TSC_RELIABLE, +}; extern void tsc_register_calibration_routines(unsigned long (*calibrate_ts= c)(void), - unsigned long (*calibrate_cpu)(void)); + unsigned long (*calibrate_cpu)(void), + enum tsc_properties properties); #endif extern void mark_tsc_unstable(char *reason); extern int unsynchronized_tsc(void); diff --git a/arch/x86/kernel/cpu/acrn.c b/arch/x86/kernel/cpu/acrn.c index 2da3de4d470e..4f2f4f7ec334 100644 --- a/arch/x86/kernel/cpu/acrn.c +++ b/arch/x86/kernel/cpu/acrn.c @@ -29,9 +29,9 @@ static void __init acrn_init_platform(void) /* Install system interrupt handler for ACRN hypervisor callback */ sysvec_install(HYPERVISOR_CALLBACK_VECTOR, sysvec_acrn_hv_callback); =20 - setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); tsc_register_calibration_routines(acrn_get_tsc_khz, - acrn_get_tsc_khz); + acrn_get_tsc_khz, + TSC_FREQUENCY_KNOWN); } =20 static bool acrn_x2apic_available(void) diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index 5ca139ae50b4..734d79c10ae5 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c @@ -516,8 +516,13 @@ 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) { - tsc_register_calibration_routines(hv_get_tsc_khz, hv_get_tsc_khz); - setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); + enum tsc_properties tsc_properties =3D TSC_FREQUENCY_KNOWN; + + if (ms_hyperv.features & HV_ACCESS_TSC_INVARIANT) + tsc_properties =3D TSC_FREQ_KNOWN_AND_RELIABLE; + + tsc_register_calibration_routines(hv_get_tsc_khz, hv_get_tsc_khz, + tsc_properties); } =20 if (ms_hyperv.priv_high & HV_ISOLATION) { @@ -629,7 +634,6 @@ static void __init ms_hyperv_init_platform(void) * is called. */ wrmsrq(HV_X64_MSR_TSC_INVARIANT_CONTROL, HV_EXPOSE_INVARIANT_TSC); - setup_force_cpu_cap(X86_FEATURE_TSC_RELIABLE); } =20 /* diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c index 968de002975f..c19fa4471800 100644 --- a/arch/x86/kernel/cpu/vmware.c +++ b/arch/x86/kernel/cpu/vmware.c @@ -388,10 +388,10 @@ static void __init vmware_paravirt_ops_setup(void) */ static void __init vmware_set_capabilities(void) { + /* TSC is non-stop and reliable even if the frequency isn't known. */ setup_force_cpu_cap(X86_FEATURE_CONSTANT_TSC); setup_force_cpu_cap(X86_FEATURE_TSC_RELIABLE); - if (vmware_tsc_khz) - setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); + if (vmware_hypercall_mode =3D=3D CPUID_VMWARE_FEATURES_ECX_VMCALL) setup_force_cpu_cap(X86_FEATURE_VMCALL); else if (vmware_hypercall_mode =3D=3D CPUID_VMWARE_FEATURES_ECX_VMMCALL) @@ -420,7 +420,8 @@ static void __init vmware_platform_setup(void) =20 vmware_tsc_khz =3D tsc_khz; tsc_register_calibration_routines(vmware_get_tsc_khz, - vmware_get_tsc_khz); + vmware_get_tsc_khz, + TSC_FREQ_KNOWN_AND_RELIABLE); =20 #ifdef CONFIG_X86_LOCAL_APIC /* Skip lapic calibration since we know the bus frequency. */ diff --git a/arch/x86/kernel/jailhouse.c b/arch/x86/kernel/jailhouse.c index db8f31fdb480..1bdc9ab321e0 100644 --- a/arch/x86/kernel/jailhouse.c +++ b/arch/x86/kernel/jailhouse.c @@ -219,7 +219,8 @@ static void __init jailhouse_init_platform(void) =20 machine_ops.emergency_restart =3D jailhouse_no_restart; =20 - tsc_register_calibration_routines(jailhouse_get_tsc, jailhouse_get_tsc); + tsc_register_calibration_routines(jailhouse_get_tsc, jailhouse_get_tsc, + TSC_FREQUENCY_KNOWN); =20 while (pa_data) { mapping =3D early_memremap(pa_data, sizeof(header)); @@ -257,7 +258,6 @@ static void __init jailhouse_init_platform(void) pr_debug("Jailhouse: PM-Timer IO Port: %#x\n", pmtmr_ioport); =20 precalibrated_tsc_khz =3D setup_data.v1.tsc_khz; - setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); =20 pci_probe =3D 0; =20 diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 9b3d1ed1a96d..b6b2018c51db 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -200,7 +200,6 @@ void kvmclock_cpu_action(enum kvm_guest_cpu_action acti= on) */ static unsigned long kvm_get_tsc_khz(void) { - setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); return pvclock_tsc_khz(this_cpu_pvti()); } =20 @@ -404,7 +403,8 @@ void __init kvmclock_init(void) =20 kvm_sched_clock_init(stable); =20 - tsc_register_calibration_routines(kvm_get_tsc_khz, kvm_get_tsc_khz); + tsc_register_calibration_routines(kvm_get_tsc_khz, kvm_get_tsc_khz, + TSC_FREQUENCY_KNOWN); =20 x86_platform.get_wallclock =3D kvm_get_wallclock; x86_platform.set_wallclock =3D kvm_set_wallclock; diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index ac4abfec1f05..98bef1d06fa9 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -1311,11 +1311,17 @@ static void __init check_system_tsc_reliable(void) */ #if defined(CONFIG_HYPERVISOR_GUEST) || defined(CONFIG_AMD_MEM_ENCRYPT) void tsc_register_calibration_routines(unsigned long (*calibrate_tsc)(void= ), - unsigned long (*calibrate_cpu)(void)) + unsigned long (*calibrate_cpu)(void), + enum tsc_properties properties) { if (WARN_ON_ONCE(!calibrate_tsc)) return; =20 + if (properties & TSC_FREQUENCY_KNOWN) + setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); + if (properties & TSC_RELIABLE) + setup_force_cpu_cap(X86_FEATURE_TSC_RELIABLE); + x86_platform.calibrate_tsc =3D calibrate_tsc; if (calibrate_cpu) x86_platform.calibrate_cpu =3D calibrate_cpu; diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index f087bb76457d..c04548641558 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c @@ -43,7 +43,6 @@ static unsigned long xen_tsc_khz(void) struct pvclock_vcpu_time_info *info =3D &HYPERVISOR_shared_info->vcpu_info[0].time; =20 - setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); return pvclock_tsc_khz(info); } =20 @@ -574,7 +573,8 @@ static void __init xen_init_time_common(void) */ paravirt_set_sched_clock(xen_sched_clock, NULL, NULL); =20 - tsc_register_calibration_routines(xen_tsc_khz, NULL); + tsc_register_calibration_routines(xen_tsc_khz, NULL, + TSC_FREQUENCY_KNOWN); x86_platform.get_wallclock =3D xen_get_wallclock; } =20 --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 31A69400164 for ; Fri, 15 May 2026 19:21:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872874; cv=none; b=rxCG75NRSkogY0edlWMHTQ7o8SOdRg3rxRtdNeRc8XK02hHZuIM4hID7ccyZsfw2H2jX6pd0JlSoXVrqBWNzd6GYVtyRl88Lsgb1az3N0tC7ANQE/X4lHyFbILck+1c4fLHIDqjXrCY1B1XseTPt+iLpon8Mc/HRk+b9oFJMXJE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872874; c=relaxed/simple; bh=7fNZAyvHkd4hTsuWucV5ADSCdPdtVNOHGfWpS1jSTro=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=RydGo9s3yO1jmdT3Z7Ygilqaz4qjbTfZsRMF36Gh8BwQOUcBVZFfd8/Aak0/PAaqB+YpOpIf4wYoD4vkj8h+0K0a7KSRyCxqWTKIIiGv9sK7UcIJ3sPdz/3Cyu7qDS8Xde7VR9xaFXhECGsHeJTXh6VqJEuVFGuX5mRpNSIoAos= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=oVHVF2BY; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="oVHVF2BY" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-837d0d71c61so80793b3a.1 for ; Fri, 15 May 2026 12:21:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872871; x=1779477671; darn=vger.kernel.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=HRAsSS8xU7yGk1K8a9fV0Bzp4HNJreTB4TmSZ4FXvc4=; b=oVHVF2BYlX76Y+d7LcjozAnixTwMgfDODWxvgpdYfY2UUzLJsJPOlV8lQ+IjKrG2LA zrvnqjFfSTyc3zpx/yevDZLIzNHZ6dDIgoWXRlXK7GijtDO992XLcCwvaM2g9imFTQ6l U1iniYxYclV9gZjVhBUnExG6SrazXxpfr/OLtCzZAmNsw+F/nh1Zn2fNgqDn5hQuh3QJ 8wPeaVfyBTq8gDox+SbNuhSF2mQRpRN7SoK+i0BcX4Da6e/RpJs+j7esxatDoOD1AwKB fsdJroPPCq/erWa2nUBsJTe7AsqMrAVW0kpT6OpA005oDbggec+OHV258SqESRrIaJlK Z39A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872871; x=1779477671; 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=HRAsSS8xU7yGk1K8a9fV0Bzp4HNJreTB4TmSZ4FXvc4=; b=YJRbCN3B7fQVx91G+0DW8pHKhX+GZcEQAsFCDdCwDlDP9DvttdIPfm/njiElCvvRPL 1cTRl+tvxN51s0Rz9qvH1cYx5YoEffaU0LU61NO+AoST/63ZOSVWgLvhYGQTBbyTTl/F rgXvvS02JyOkhpi6aYOT/qNDKgYWu12JFUdewxd806EWvpIoRagXTCzGvQjm1k6yUQhO Pco2jgVUk0O5Qha8IRnCP7INN/xYP/JXHep93mpmmzh2RHSZdieAeEnJ+SaZlBV2gkq1 yIJ8LmQSx5NlcCbASR9Nox/sT8R+2iGQK5V514aFVcLwFORrcsxaBHVMA/Q4d5TVTGfT pWRQ== X-Forwarded-Encrypted: i=1; AFNElJ+dYo/OLlFmebtRklYn0dX5WI2MN2uGg2eFGpDp1ywxsM+tD+MirCIT5hL6Sc9Z4D+puQS/63b3hrlq8go=@vger.kernel.org X-Gm-Message-State: AOJu0YxIq7ctp1AHFRjE8SVYKWrqrKwhi9Kc4fox91IkwX+6mNZ1ZzGW BAoM2U8Jqr4r4yg6njGuA2aUN/hCWf/gaBunMemDwvxpiLUWwIyI9+zHHOz7sOyNhal22wjI+tG UelScsw== X-Received: from pfdc5.prod.google.com ([2002:aa7:8c05:0:b0:82f:a75b:f7fa]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:ab0d:b0:839:e27c:6cce with SMTP id d2e1a72fcca58-83f33d97d9amr5480931b3a.37.1778872871152; Fri, 15 May 2026 12:21:11 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:33 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-33-seanjc@google.com> Subject: [PATCH v3 32/41] x86/tsc: Rejects attempts to override TSC calibration with lesser routine From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When registering a TSC frequency calibration routine, sanity check that the incoming routine is as robust as the outgoing routine, and reject the incoming routine if the sanity check fails. Because native calibration routines only mark the TSC frequency as known and reliable when they actually run, the effective progression of capabilities is: None (native) =3D> Known and maybe Reliable (PV) =3D> Known and Reliable (CoCo). Violating that progression for a PV override is relatively benign, but messing up the progression when CoCo is involved is more problematic, as it likely means a trusted source of information (hardware/firmware) is being discarded in favor of a less trusted source (hypervisor). Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/kernel/tsc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 98bef1d06fa9..7a261214fa3e 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -1319,8 +1319,13 @@ void tsc_register_calibration_routines(unsigned long= (*calibrate_tsc)(void), =20 if (properties & TSC_FREQUENCY_KNOWN) setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); + else if (WARN_ON(boot_cpu_has(X86_FEATURE_TSC_KNOWN_FREQ))) + return; + if (properties & TSC_RELIABLE) setup_force_cpu_cap(X86_FEATURE_TSC_RELIABLE); + else if (WARN_ON(boot_cpu_has(X86_FEATURE_TSC_RELIABLE))) + return; =20 x86_platform.calibrate_tsc =3D calibrate_tsc; if (calibrate_cpu) --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4AEBF39DBC0 for ; Fri, 15 May 2026 19:21:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872875; cv=none; b=lTSn/Ewen36uofTXR1FE1xF0rWKwCJfFPwOYnR8qXMSp+gReQoEn5j38XWBwQ0Hxt0Df48PI1uMJRnoH2p4ZR3FiNUCYyEb2DF/9fKEtmkSQYQ4/O3qmSaIxx53/XJLB9mbrWQnh4yZsnM5RKTha/rB264qNtvHjrX1kpcMQAmw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872875; c=relaxed/simple; bh=oS9aSnkApcPsOGR1rkhF7MOLa9irLvbbIXlzkW7Bx9o=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=N8ivWcrOX8YHreiOKiF1BFwvRtHCfl+fkpSo34fXs65ol0N+CpVhZjGVXNCHdOKetbYtLqMMU2up/cxa23Ftp+oDHt65AeowsOOVoJu0RCGCFiaJ7oXaB6kqRIFk3rzQ3olYU/5P7AN4KttlWHVINEyiQ9UePxnpxv83QUR0LWI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=HOQx/5IZ; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="HOQx/5IZ" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-369467ab5bfso127919a91.0 for ; Fri, 15 May 2026 12:21:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872872; x=1779477672; darn=vger.kernel.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=POYAFJXhX15R3hmqAgfLZg3VsZ+0XFpd3jcwWXWllKs=; b=HOQx/5IZYerJC/WWeKC/Kkn6AjpugGAFhcEItpV+2mgON5Bqe8mkDlWs+nCRb2vhKr vwySmDj0B+x+ot6ih6EsjmEQG4yHhH8qWi0FI9wUed51CG6Gdm9XR7ZMkEXdyJzCaY8Z a1TKMv3bwfscaN1AtLvp38p1QsqDTT5TtWeHaaHPpzUSM0fcfEmVIklwDYFfDkLzCBfe 75B6ASkGLw2rFzGkY+ctcOzeej4xIFifFHeyyPlhWxscy0+bPlf2YrlJqAVDIxBlJES0 DHC/CVcg8bI/x9JTnyqExWxlQt+eAmUqPVm8CSdrw1Lh6AVoagF9XouAhCNCLGvR1iSZ b8wg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872872; x=1779477672; 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=POYAFJXhX15R3hmqAgfLZg3VsZ+0XFpd3jcwWXWllKs=; b=N6TzSQqu/ex+Vbri5AwfxHTp251+cFlviAzSlfjhZG8siMd8iG/Z10p3I11cGSkOz6 KDdWuF8rgKtbI2QOJteXKE257Bs5Mw0SecqPH+PLAQG0C1D/WMOq+pomR6gUi/wVE9Tc SIOKNTmCsas4faGAeFyOlotMtr5XVjCPSEuWl8aSWnN8eSdaTM2KvyfZFL8bfMdLaA42 U8/T2xtRj12wT77sCcQv2MUMBBuhP74TBQZOZwmtay6bTu54WpD6PtUx8vSYD/lqRezm EyonCoY3qbRvY2lC4o3BowH7GgdUghhzl7ziXKWAdkVA9dbmjbJfUgrSZ0Djh05tPBLz 7iYg== X-Forwarded-Encrypted: i=1; AFNElJ80Al84A2NFuDRoAs2LPNRB4+Ln1TfqeKiVV9r1uWhwGYN3uoTYfNu7V7z1wmHmWOuVPyjncoiueoLDNVA=@vger.kernel.org X-Gm-Message-State: AOJu0Yy/yEanCuhOyT+ZssJFDe+FVa6I38dY3Dq6SlG/N9dvx6Y9FmGd sp2//upUmAcdRLUkWRO5H3PqBMCfSiwVNbzSMqqNaq5FdaeGm8dLirxOp2+H8dgAU+ceO5bcXzn pQWyFMw== X-Received: from pgla17.prod.google.com ([2002:a63:b51:0:b0:c82:2e5b:8f33]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3505:b0:364:edd2:812 with SMTP id 98e67ed59e1d1-36951cb3086mr5037302a91.25.1778872872299; Fri, 15 May 2026 12:21:12 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:34 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-34-seanjc@google.com> Subject: [PATCH v3 33/41] x86/kvmclock: Mark TSC as reliable when it's constant and nonstop From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Mark the TSC as reliable if the hypervisor (KVM) has enumerated the TSC as constant and nonstop, and the admin hasn't explicitly marked the TSC as unstable. Like most (all?) virtualization setups, any secondary clocksource that's used as a watchdog is guaranteed to be less reliable than a constant, nonstop TSC, as all clocksources the kernel uses as a watchdog are all but guaranteed to be emulated when running as a KVM guest. I.e. any observed discrepancies between the TSC and watchdog will be due to jitter in the watchdog. This is especially true for KVM, as the watchdog clocksource is usually emulated in host userspace, i.e. reading the clock incurs a roundtrip cost of thousands of cycles. Marking the TSC reliable addresses a flaw where the TSC will occasionally be marked unstable if the host is under moderate/heavy load. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/kernel/kvmclock.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index b6b2018c51db..47f7df1e81a0 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -363,6 +363,7 @@ static __init void kvm_sched_clock_init(bool stable) =20 void __init kvmclock_init(void) { + enum tsc_properties tsc_properties =3D TSC_FREQUENCY_KNOWN; bool stable =3D false; =20 if (!kvm_para_available() || !kvmclock) @@ -401,18 +402,6 @@ void __init kvmclock_init(void) PVCLOCK_TSC_STABLE_BIT; } =20 - kvm_sched_clock_init(stable); - - tsc_register_calibration_routines(kvm_get_tsc_khz, kvm_get_tsc_khz, - TSC_FREQUENCY_KNOWN); - - x86_platform.get_wallclock =3D kvm_get_wallclock; - x86_platform.set_wallclock =3D kvm_set_wallclock; -#ifdef CONFIG_SMP - x86_cpuinit.early_percpu_clock_init =3D kvm_setup_secondary_clock; -#endif - kvm_get_preset_lpj(); - /* * X86_FEATURE_NONSTOP_TSC is TSC runs at constant rate * with P/T states and does not stop in deep C-states. @@ -423,8 +412,22 @@ void __init kvmclock_init(void) */ if (boot_cpu_has(X86_FEATURE_CONSTANT_TSC) && boot_cpu_has(X86_FEATURE_NONSTOP_TSC) && - !check_tsc_unstable()) + !check_tsc_unstable()) { kvm_clock.rating =3D 299; + tsc_properties =3D TSC_FREQ_KNOWN_AND_RELIABLE; + } + + kvm_sched_clock_init(stable); + + tsc_register_calibration_routines(kvm_get_tsc_khz, kvm_get_tsc_khz, + tsc_properties); + + x86_platform.get_wallclock =3D kvm_get_wallclock; + x86_platform.set_wallclock =3D kvm_set_wallclock; +#ifdef CONFIG_SMP + x86_cpuinit.early_percpu_clock_init =3D kvm_setup_secondary_clock; +#endif + kvm_get_preset_lpj(); =20 clocksource_register_hz(&kvm_clock, NSEC_PER_SEC); pv_info.name =3D "KVM"; --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 93E9940EBA9 for ; Fri, 15 May 2026 19:21:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872877; cv=none; b=CsablAheJvIlgIMNadoDz6qk1Pt0bWTtIJl4IBvg395hFZoVB2N9qgdhxBCAINsf8wFsdkydjgKc+u3x1j2DeHSHLrCYSlDWM0ALzMfbYgZwM0WGvd2OF1wqTry18OXd0f9iluH8rKB1qLocqYrPQakfHaSiUSF5arIyqTG0u4g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872877; c=relaxed/simple; bh=B/Nd88zreMJtUwVM+EKuE0OYb6EhoS4ohLt5CAFmh34=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=jAG4U0Ay8A0eITzEZGUwavyPYhH8y8ZgrYwU+92nj+O84XnCZ751k7Cc712KnHP8NpRiIEFe/x4cmKEq6kJscXHVHrr+0F4/hjEueIAy0Z4XUjqWxl+AVUBsPsMjUdxRKXxs8kMG3zzvrzSjBdYY/N+xCA8+BVCT4Oaa3v4J/5M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Z2cP/jjo; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Z2cP/jjo" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-83536dc3be5so248695b3a.1 for ; Fri, 15 May 2026 12:21:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872874; x=1779477674; darn=vger.kernel.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=vVLX5t3yX9DiZyDHfD7io13ZG0m6EjUCrIAXjsJko2U=; b=Z2cP/jjoFQh2BFEaRMzgxBD70YvB3x1zUmlI8Ainn5q0K9K4JcWIDO4P5IZDqTrguu Wrv6I5jdQUhua+hrNs4FvEuMHWpOeSU83aGHVrCGJkNvmtJKGdZn6uccR+W9Xe/WNdx7 IwM5uj+PauCtgynRlDNvXbGrzKnZz5xI/YGQIqcoT2CAo3cCSpmZbDo/piSeNubeAoea iFfGetRzUsJqK4c9lFZ1pvwn54/Dywjy4ajzm5HdBvT4Q7UI36xLvPmMwqY2x3hC0v8c L8fTIF5wsEEIRN5/1eEaSv3n/9Z4b67tliMvu5xKVVLqp0psReeNmfIkoTkbI1ravUCZ aIKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872874; x=1779477674; 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=vVLX5t3yX9DiZyDHfD7io13ZG0m6EjUCrIAXjsJko2U=; b=cAwrv4XtPUi5p+Ghb/uN/lnsN+rBqFYT/AHsGWm53cCKg0yFK9K59r8Dguyrskb4+k KJxR8Z84VUDBFD+O84sb+t23ulRFISvmzR5aAg0Lh9tzeYANdkx1slJzekdyA5rOZkm8 N8QsPNGKgA6AWf7kXlQXZdAO2iJcfnN5EnucaJnYBKUhv8lfE7646hQH3qqNrZKKXW9E 0sqvndwnq6QSqiKaz5BZwvXnw/HFySUo3W9OvDEXgfIyog9DtsbLXpd0h3vODblDMhHH +lyXo49XQqMlkbstz9hHseiBR3O/YeEmbKyWMAOs3PihNbBJkWb5/kO4c17ilE7KAPWL pmLA== X-Forwarded-Encrypted: i=1; AFNElJ/0k15DJGIpIjrM6WsqNLH6nnw8tvc3ZoIu10lwYw2Tm3q/chpR4sL9KdtVyfPW8/keIaY1VZ6adIq6cGg=@vger.kernel.org X-Gm-Message-State: AOJu0YyVCr5s86ouWd/IR6RH/IotwxVqm+fO4h/kfLkpFyAYqDCBQwkd UyH0nb4n+UJdq54fOJHYQDrfUeBGNzYS7QYJ3njJ10hVqmY4G128pIcqS0kr1VtxPXCiVNJ0W8h IlixOeQ== X-Received: from pfoo22.prod.google.com ([2002:a05:6a00:1a16:b0:836:d115:1e44]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:299a:b0:83b:c487:43d2 with SMTP id d2e1a72fcca58-83f33df451fmr5925936b3a.36.1778872873374; Fri, 15 May 2026 12:21:13 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:35 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-35-seanjc@google.com> Subject: [PATCH v3 34/41] KVM: x86: Officially define CPUID 0x40000010 as PV Timing Info (TSC and Bus) From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Woodhouse Formally define and document CPUID 0x40000010 as providing TSC and local APIC bus frequency information for KVM's PV CPUID range. Way back in 2008, VMware proposed (https://lkml.org/lkml/2008/10/1/246) carving out a range of CPUID leaves for use by hypervisors. While the broader proposal from VMware was mostly shot down in flames, use of CPUID 0x40000010 to provide TSC and local APIC bus frequency information survived and made it's way into multiple guest operating systems. XNU unconditionally assumes CPUID 0x40000010 contains the frequency information, if it's present on any hypervisor: https://github.com/apple/darwin-xnu/blob/main/osfmk/i386/cpuid.c As does FreeBSD: https://github.com/freebsd/freebsd-src/commit/4a432614f68 More importantly, QEMU (the de facto "reference" VMM for KVM) has conditionally provided timing information in CPUID 0x40000010 for almost 9 years, since commit 9954a1582e ("x86-KVM: Supply TSC and APIC clock rates to guest like VMWare"). So at this point it would be daft for KVM (or any hypervisor) to expose 0x40000010 for any *other* content. Officially carve out and define the CPUID leaf so that Linux-as-a-guest can follow suit and pull TSC and Local APIC Bus frequency information from CPUID. Defer providing userspace with the necessary information needed to precisely and accurately enumerate the _actual_ configured TSC frequency to the guest (that exact information, along with the scaled ratio, isn't exposed to userspace). As evidenced by QEMU, providing CPUID 0x40000010 without help from KVM is entirely possible, just not ideal. Link: https://lore.kernel.org/all/ea0d7f43d910cee9600b254e303f468722fa355b.= camel@infradead.org Signed-off-by: David Woodhouse [sean: drop KVM filling of CPUID, add documentation, massage changelog] Signed-off-by: Sean Christopherson --- Documentation/virt/kvm/x86/cpuid.rst | 12 ++++++++++++ arch/x86/include/uapi/asm/kvm_para.h | 11 +++++++++++ 2 files changed, 23 insertions(+) diff --git a/Documentation/virt/kvm/x86/cpuid.rst b/Documentation/virt/kvm/= x86/cpuid.rst index bda3e3e737d7..f02e395cfa9b 100644 --- a/Documentation/virt/kvm/x86/cpuid.rst +++ b/Documentation/virt/kvm/x86/cpuid.rst @@ -122,3 +122,15 @@ KVM_HINTS_REALTIME 0 guest checks this feat= ure bit to preempted for an unlimited time allowing optimizations =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +function: KVM_CPUID_TIMING_INFO (0x40000010) + +returns:: + + eax =3D (Virtual) TSC frequency in kHz + ebx =3D (Virtual) Bus (local APIC timer) frequency in kHz + ecx =3D 0 (Reserved) + edx =3D 0 (Reserved) + +Note, KVM only defines the semantics of KVM_CPUID_TIMING_INFO; KVM does NOT +advertise support via KVM_GET_SUPPORTED_CPUID. \ No newline at end of file diff --git a/arch/x86/include/uapi/asm/kvm_para.h b/arch/x86/include/uapi/a= sm/kvm_para.h index a1efa7907a0b..c3a384711f3a 100644 --- a/arch/x86/include/uapi/asm/kvm_para.h +++ b/arch/x86/include/uapi/asm/kvm_para.h @@ -44,6 +44,17 @@ */ #define KVM_FEATURE_CLOCKSOURCE_STABLE_BIT 24 =20 +/* + * The timing information leaf provides TSC and local APIC timer frequency + * information to the guest. Note, userspace is responsible for filling t= he + * leaf with the correct information. + * + * # EAX: (Virtual) TSC frequency in kHz. + * # EBX: (Virtual) Bus (local APIC timer) frequency in kHz. + * # ECX, EDX: Reserved (must be zero). + */ +#define KVM_CPUID_TIMING_INFO 0x40000010 + #define MSR_KVM_WALL_CLOCK 0x11 #define MSR_KVM_SYSTEM_TIME 0x12 =20 --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD6A440EBD2 for ; Fri, 15 May 2026 19:21:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872878; cv=none; b=qCqKrDwNp+TOTaydghv/0sn5MfAxg/LDnJfibMwIWcNK18tOny4XjMxldlr3hCWtoNh+Vwe7aa6ygslsYXf8YNLqV7E87dOkde2zYZey3nbQBUWy/DnXexWB6I0bIzwbMQziJ2zPQO6d1DETX0e+ygv3nnUI1/mFGD/NPXCJZuQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872878; c=relaxed/simple; bh=GcjjOomxWCHwXqJ+DzUBCv/BxVAVHsSL2Hl0ee8rM2Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=XXRHVqKeuYOQSJZxToZ+23g9drbcKM2gNhDPaHm8/JDbiUeHTHE2Cgq9+X9LFlN8axkrQZxkuXIw8Bt/ualwteo3XCe4IaXLRgS6x5bp6ZwRlzKW/QpZIxGKPOFJy+6jdLxVSsYrGOB1RCrwX0idpFV1667gK9UnTlToFhhAkSc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=G8WG7OPx; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="G8WG7OPx" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-36629e48023so84742a91.2 for ; Fri, 15 May 2026 12:21:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872875; x=1779477675; darn=vger.kernel.org; h=content-transfer-encoding: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=Zm1yasCgCkYBCfOrXX2peIQ68HcxfozY1zg+bDbrsDM=; b=G8WG7OPxz2P88eVCqylK6cyHYDSNISdnoVps7PmNyNP5fpbEdNSBKDx1uBZCkBRYvl EX+ZljKxgUfzs3PdYf9iLt6GJBPq99jv8TR8z9qGxNDeSq9HSZRP45t9W+QD7yyoS7W5 R+eo8BOsdhAovRYTGZV1vlMLWj/YQMVRtIJakwV10CLPhX3Q0HO+6nLj9Uwx+IUqSCp0 3sJK8llcl+JXSO3FKEVUnc1pfICLEHXZSB5MRbchk4N+Ii6ThOK3BX/LguxGbKwM7o9V HxMX2xalB8mJINU4y2idZFaIFPXdkp7fHfzLJd8+oqw36yVPmaJkBm4kVcbjxF993JQk Ao2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872875; x=1779477675; h=content-transfer-encoding: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=Zm1yasCgCkYBCfOrXX2peIQ68HcxfozY1zg+bDbrsDM=; b=VSeNVz1LngZIEdHpR1jZ55+ya+3IVXwneYGdZY8V8nwBjkhp49AvjEcT5PjQRu6t5G Bk5Mp3XKTG9baLCb2zyxqxlwu8lCOvTO0hcg7veVfvmn9dPwqFhZwbBdRLHjGvXSyvyU LHammf/jPa6fOX5q+fb1rUSy9PFxt4dBjvxwatZrzE37F1nvpinO0NIeq5fAus7k5PfP kqIJ2l4PebpVL4UJSxFmj2jtGmt3gRwlpdPnqG8pkrO84xq+Pd+iUt+WCIyR7pQcaLBv aB+W0IQsRV9KSAz1DSlvEOkF6/hO2osXMmKrWdQEPVaDMp/5cO8iH1qeOKMrnbIjL9cu 6yOg== X-Forwarded-Encrypted: i=1; AFNElJ+OT0VoqCcQf7JwwuEE9cVFOK7w3A8oEHXFCV6Ngvdg6iAi58GSSKWmCkuCzmRkZ59lx5+kUBngwCqZSzo=@vger.kernel.org X-Gm-Message-State: AOJu0Yy0xSzKE5wf+nsRgbP8fAjHFO73thmirkrSXbNYMV0B2cofC6bY mywepT6AkasQsTG1pWevsc1DS8B0o7z/Ns56NWEtF73a38XBu/2wt9po+uRp3osUP1xtlChoC9b itBn/jw== X-Received: from pfvo27.prod.google.com ([2002:a05:6a00:1b5b:b0:837:e90f:8cd9]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:338b:b0:838:9e25:f128 with SMTP id d2e1a72fcca58-83f33cf0bf3mr5811988b3a.26.1778872874478; Fri, 15 May 2026 12:21:14 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:36 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-36-seanjc@google.com> Subject: [PATCH v3 35/41] x86/kvmclock: Obtain TSC frequency from CPUID if present From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Woodhouse In https://lkml.org/lkml/2008/10/1/246 a proposal was made for generic CPUID conventions across hypervisors. It was mostly shot down in flames, but the leaf at 0x40000010 containing timing information didn't die. It's used by XNU and FreeBSD guests under all hypervisors=C2=B9=C2=B2 to de= termine the TSC frequency, and also exposed by the EC2 Nitro hypervisor (as well as, presumably, VMware). FreeBSD's Bhyve is probably just about to start exposing it too. Use it under KVM to obtain the TSC frequency more accurately, instead of reverse-calculating the frequency from the mul/shift values in the KVM clock. Before: [ 0.000020] tsc: Detected 2900.014 MHz processor After: [ 0.000020] tsc: Detected 2900.015 MHz processor $ cpuid -1 -l 0x40000010 CPU: hypervisor generic timing information (0x40000010): TSC frequency (Hz) =3D 2900015 bus frequency (Hz) =3D 1000000 =C2=B9 https://github.com/apple/darwin-xnu/blob/main/osfmk/i386/cpuid.c =C2=B2 https://github.com/freebsd/freebsd-src/commit/4a432614f68 Signed-off-by: David Woodhouse Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_para.h | 1 + arch/x86/kernel/kvm.c | 10 ++++++++++ arch/x86/kernel/kvmclock.c | 6 +++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_par= a.h index 17053d2bf270..3f7f558b5b24 100644 --- a/arch/x86/include/asm/kvm_para.h +++ b/arch/x86/include/asm/kvm_para.h @@ -129,6 +129,7 @@ enum kvm_guest_cpu_action { void kvmclock_init(void); void kvmclock_cpu_action(enum kvm_guest_cpu_action action); bool kvm_para_available(void); +unsigned int kvm_para_tsc_khz(void); unsigned int kvm_arch_para_features(void); unsigned int kvm_arch_para_hints(void); void kvm_async_pf_task_wait_schedule(u32 token); diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 65c787b1ea03..5cd92a0b156a 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -918,6 +918,16 @@ bool kvm_para_available(void) } EXPORT_SYMBOL_GPL(kvm_para_available); =20 +unsigned int kvm_para_tsc_khz(void) +{ + u32 base =3D kvm_cpuid_base(); + + if (cpuid_eax(base) >=3D (base | KVM_CPUID_TIMING_INFO)) + return cpuid_eax(base | KVM_CPUID_TIMING_INFO); + + return 0; +} + unsigned int kvm_arch_para_features(void) { return cpuid_eax(kvm_cpuid_base() | KVM_CPUID_FEATURES); diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 47f7df1e81a0..5ceba4f3836c 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -200,7 +200,11 @@ void kvmclock_cpu_action(enum kvm_guest_cpu_action act= ion) */ static unsigned long kvm_get_tsc_khz(void) { - return pvclock_tsc_khz(this_cpu_pvti()); + /* + * If KVM advertises the frequency directly in CPUID, use that + * instead of reverse-calculating it from the KVM clock data. + */ + return kvm_para_tsc_khz() ? : pvclock_tsc_khz(this_cpu_pvti()); } =20 static void __init kvm_get_preset_lpj(void) --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8D52D400161 for ; Fri, 15 May 2026 19:21:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872878; cv=none; b=f7tnNG+XtSVBqm5UDnrjschk9N6+1z23hL8EJfCB+bB/jHmwJhMfLcItiIr2PSJFi0Dt2pUxx/CZxcGL3SfcMDzBAYLNPVu0hfV1kOQiACLtIhEAIzvVe/a/UzdnG9alMFJ59a+gYxEMKo3eiXmOZuuHmpcLJJWm6TVOSheL2+U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872878; c=relaxed/simple; bh=lj0Wrx3Iv//hmkaQGmo4E+9Pr8EcmWhtdqcjCm5wSw8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=TAc4fIpYbDIlzazp+2DO/rUTsTBuyho+GwTZEMNE52Q08cOFJwbjRcdrEYWIKYChNqVlWrsCouAekKc5eHtyhdZNoyCJroZw/scRRCxI0bnFxWwKuSn1GmpqXsDAiNpJSv57MFjVuU2pF06kPQgfFgUoCeOiQVfOIeE10XKnP/0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=K9Dkyqfa; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="K9Dkyqfa" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c799ee56bd6so145593a12.2 for ; Fri, 15 May 2026 12:21:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872876; x=1779477676; darn=vger.kernel.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=b8iwHk13SynGR+feSoAEVsPbJ8RDfXFvMc9oOLx500A=; b=K9Dkyqfa3RaGeSD8dV91pA0SluiqNnvEpIfy8bSrL8dt07s42DBDdTxdF8TWIJXBZ0 gd7uoOe9IaaJ1oxipmVXSa8wQmP1hW8zl/lpvvdz6y9f2Zf7tA+BcWonVW4l4hfG2DoF 6sBiKuz4kD1/k7mklFm+uPAhuBLm8Q88Dkp+khpqdm6EuHIHkR4lYew+9B/fpdJVOt9p V5Lf/Eo8q0WaexeC7VsKg2DcpWHkgteLymlZi1hGe1kkCZ9QcXUVHp9saVG+bq8TDAGc eAXx6InNtl9Au705LR8nUacjdCNUIe45Z1IoIdm3g3knnopCaWpJLtv86/W2/fxrc46X pwvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872876; x=1779477676; 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=b8iwHk13SynGR+feSoAEVsPbJ8RDfXFvMc9oOLx500A=; b=O8/ehVM5WGWs17Gv4jtW0Y7AhKSH53O27xS9DRpAmClTu0YQpztKF2wOy1+WANSoHL 68mDRMJPA4VG4/3B8bG7AMpHH1fOOMvrOZs5yzM7x8xgY+MU3RZhDCeAU6HkuJ1HLUHx Crvi+d575Rt6O8XPdLU13jL6LkAb+LCAuBpwgJrjTKz2UjfOHhLQgWHawl67Pfah30af N/wtTUxOqfnSfKmjHnSLj0WwN9KecZGr9+AzeuPSTfVAo0SSdjnCeSGtTTNWB5cIh5Y2 KnEgDsv5+Bv8r8iyKVkw0kW4FF497YGkCbhqpVvpLnR9Qq5M9dGgVU0FQ5p0twp/Msvp HYWw== X-Forwarded-Encrypted: i=1; AFNElJ8VRziMYRK5SZ8rnd5/C7C/N8jdS1iHa57sAkULoSgkMzWJsVNTnRMV5K5oo+8dAGu3XCbE27ilxhNcTKw=@vger.kernel.org X-Gm-Message-State: AOJu0YxjcD2GsPDCCCHWZfObmLEIpe3PRSI04WUaxXDCuaIADq9BuR+r UO3Z13lqFxb2O5QjGEvwVMdAlMnU4A5vILjsxNyGJoxXsDRT3btV+uT4cVwuhn3pfqiYd+dQwTV CmSiFvA== X-Received: from pfmm20.prod.google.com ([2002:a05:6a00:2494:b0:835:43a4:4aaa]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:4293:b0:835:41f3:f440 with SMTP id d2e1a72fcca58-83f33bf68e4mr5394751b3a.14.1778872875569; Fri, 15 May 2026 12:21:15 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:37 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-37-seanjc@google.com> Subject: [PATCH v3 36/41] x86/kvmclock: Get local APIC bus frequency from PV CPUID Timing Info From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When running as a KVM guest with kvmclock support enabled, 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. Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_para.h | 1 + arch/x86/kernel/kvm.c | 19 ++++++++++++++++--- arch/x86/kernel/kvmclock.c | 13 +++++++++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_par= a.h index 3f7f558b5b24..381d029b72e7 100644 --- a/arch/x86/include/asm/kvm_para.h +++ b/arch/x86/include/asm/kvm_para.h @@ -130,6 +130,7 @@ void kvmclock_init(void); void kvmclock_cpu_action(enum kvm_guest_cpu_action action); bool kvm_para_available(void); unsigned int kvm_para_tsc_khz(void); +unsigned int kvm_para_apic_bus_khz(void); unsigned int kvm_arch_para_features(void); unsigned int kvm_arch_para_hints(void); void kvm_async_pf_task_wait_schedule(u32 token); diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 5cd92a0b156a..bfe36e361b3c 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -918,12 +918,25 @@ bool kvm_para_available(void) } EXPORT_SYMBOL_GPL(kvm_para_available); =20 -unsigned int kvm_para_tsc_khz(void) +static bool kvm_cpuid_has_timing_info(void) { u32 base =3D kvm_cpuid_base(); =20 - if (cpuid_eax(base) >=3D (base | KVM_CPUID_TIMING_INFO)) - return cpuid_eax(base | KVM_CPUID_TIMING_INFO); + return cpuid_eax(base) >=3D (base | KVM_CPUID_TIMING_INFO); +} + +unsigned int kvm_para_tsc_khz(void) +{ + if (kvm_cpuid_has_timing_info()) + return cpuid_eax(kvm_cpuid_base() | KVM_CPUID_TIMING_INFO); + + return 0; +} + +unsigned int kvm_para_apic_bus_khz(void) +{ + if (kvm_cpuid_has_timing_info()) + return cpuid_ebx(kvm_cpuid_base() | KVM_CPUID_TIMING_INFO); =20 return 0; } diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 5ceba4f3836c..abcc5b36ea1d 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -200,10 +200,19 @@ void kvmclock_cpu_action(enum kvm_guest_cpu_action ac= tion) */ static unsigned long kvm_get_tsc_khz(void) { +#ifdef CONFIG_X86_LOCAL_APIC + u32 apic_khz =3D kvm_para_apic_bus_khz(); + /* - * If KVM advertises the frequency directly in CPUID, use that - * instead of reverse-calculating it from the KVM clock data. + * Use the TSC frequency from KVM's (and other hypervisors') PV CPUID + * leaf when available, instead of reverse-calculating it from the KVM + * clock data. As a bonus, the CPUID leaf also includes the local APIC + * bus/timer frequency. */ + if (apic_khz) + lapic_timer_period =3D apic_khz; +#endif + return kvm_para_tsc_khz() ? : pvclock_tsc_khz(this_cpu_pvti()); } =20 --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0C2AB40F6ED for ; Fri, 15 May 2026 19:21:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872880; cv=none; b=dNwBqcsLmXp2UlZUCKuFrw+GK1FhMEEo3bR2jLERjItaj/MkjFJf8RVgr144xBh12fqtifR6GHpSp5zFIqxHSqSaxhQ9Sth3krqY7nDZuyrbJYZnV0u8VJ/VL+OYUGtxsbmnHgugoyPf/QtyrwzvtV3tCEQwIIj4DyPcVjKevP4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872880; c=relaxed/simple; bh=m/luZgSg5MFPZdvcg1lGftNBA8eVB0LHHzknRLffplY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=d1LfhKDPGVoDRu6E4NXdQIPW9Wcpvfk4+GbIHQlSOhR/mVqtRKDF5TwrNeznKEIkv6ApuYB/5PqhDwqZq6FIdFwfRJ7GwYkWcff5WnIijukV42sZqlKd4tLRZgMXDZoFtC9aaH1IVXa/R1eThgAbzFMfVZO1w+Y8uXdwjimkIXo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=v0VIBiMh; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="v0VIBiMh" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-82fa366fb79so248872b3a.2 for ; Fri, 15 May 2026 12:21:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872877; x=1779477677; darn=vger.kernel.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=E3je6rXVDqS2RblPlDEIDkn7XwnxqvqokNa5l9m4jL4=; b=v0VIBiMh5rqevqCDBDUERGqZs6DRmjKj5dAde+ysnyuBXGMsYBFwcMPm4Ae4BwaWzF V1qMegse5FUJ474Prgzxxy7ZK3Vn9wBcBkTVN18ReiXHEUxTh8u4Me5wPKW+r8nDE2ZH IYFv443XExQ/ojRk7MRdYkEEf7VmrFKbWMJW3WHc/KAojlYDpUKn1wtwlNU1HHkmyDxG WGnNPHk6Zd1cTSzxoMU0JeTo/3ow2EmBc/f4qm4ztOUOcUjNN4KkDVno7CQTZ3SHQrG9 3AMpXJO5W9+IAJvFrHF3KrBjh/bhVDq+Z9FvvjpDbPbmWV4E2He+bLqy0rK0WuLX0Omo 9cRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872877; x=1779477677; 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=E3je6rXVDqS2RblPlDEIDkn7XwnxqvqokNa5l9m4jL4=; b=P/MgRKyM15uCxGmvngv+hNtZYYoeTfsI/2YcKONARbVHwH/UQKlhc79nlApEzi9kdi Dl7SndRaODgqK3vXYuaflnfkKC8t52tgjKR8uxAX58+A71y25cs44dZ8xZwDN8iFR49G 5ArmXR09bYj7mg9pHnwy9ifplaQLvfGeAhMXtVgn5izFS+gl5lXv5pAK3CceMjD/HLEF xpP55pfjCcJTrW/scRY6BePECQuqOXdspGNZlIkw+I7CoJHxp0gRV/Iw/QSoG0iD71Qv 59mKBhPLVRLiE+i6zhM0PNPou/xLHHfn3Y5SopihmjuypgRqewCz8PFpka4jdrKMu6Q6 gS6w== X-Forwarded-Encrypted: i=1; AFNElJ/65oRHGQ9TLo7uRL9neyLUyzMUgwu4OST9rs5lYaKDUD0OxSJ9bqbpTBkmiFTDOWBxX0hmTx2f709CZ0Y=@vger.kernel.org X-Gm-Message-State: AOJu0YyrfunbRRt1AjytAupQUX6/HW+9K7wurWRrDX+MOxqW1o63nbd+ E5AIX83V9Oaf0KFjUGnVT1/fBltsPuQjqdxg6hyqu+kG9dxGNspEa2jE6xQZRv2XIpaBZ5Xat/H 5rmpDCw== X-Received: from pfbmd16.prod.google.com ([2002:a05:6a00:7710:b0:82f:c134:e67c]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:8d1:b0:82c:6aee:b21a with SMTP id d2e1a72fcca58-83f33f2a54fmr5839384b3a.45.1778872876956; Fri, 15 May 2026 12:21:16 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:38 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-38-seanjc@google.com> Subject: [PATCH v3 37/41] x86/kvmclock: Use TSC for sched_clock if it's constant and non-stop From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Prefer the TSC over kvmclock for sched_clock if the TSC is constant, nonstop, and not marked unstable via command line. I.e. use the same criteria as tweaking the clocksource rating so that TSC is preferred over kvmclock. Per the below comment from native_sched_clock(), sched_clock is more tolerant of slop than clocksource; using TSC for clocksource but not sched_clock makes little to no sense, especially now that KVM CoCo guests with a trusted TSC use TSC, not kvmclock. /* * Fall back to jiffies if there's no TSC available: * ( But note that we still use it if the TSC is marked * unstable. We do this because unlike Time Of Day, * the scheduler clock tolerates small errors and it's * very important for it to be as fast as the platform * can achieve it. ) */ The only advantage of using kvmclock is that doing so allows for early and common detection of PVCLOCK_GUEST_STOPPED, but that code has been broken for over two years with nary a complaint, i.e. it can't be _that_ valuable. And as above, certain types of KVM guests are losing the functionality regardless, i.e. acknowledging PVCLOCK_GUEST_STOPPED needs to be decoupled from sched_clock() no matter what. Link: https://lore.kernel.org/all/Z4hDK27OV7wK572A@google.com Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/kernel/kvmclock.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index abcc5b36ea1d..0578bc448b1b 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -416,22 +416,22 @@ void __init kvmclock_init(void) } =20 /* - * X86_FEATURE_NONSTOP_TSC is TSC runs at constant rate - * with P/T states and does not stop in deep C-states. - * - * Invariant TSC exposed by host means kvmclock is not necessary: - * can use TSC as clocksource. - * + * If the TSC counts at a constant frequency across P/T states, counts + * in deep C-states, and the TSC hasn't been marked unstable, prefer + * the TSC over kvmclock for sched_clock and drop kvmclock's rating so + * that TSC is chosen as the clocksource. Note, the TSC unstable check + * exists purely to honor the TSC being marked unstable via command + * line, any runtime detection of an unstable will happen after this. */ if (boot_cpu_has(X86_FEATURE_CONSTANT_TSC) && boot_cpu_has(X86_FEATURE_NONSTOP_TSC) && !check_tsc_unstable()) { kvm_clock.rating =3D 299; tsc_properties =3D TSC_FREQ_KNOWN_AND_RELIABLE; + } else { + kvm_sched_clock_init(stable); } =20 - kvm_sched_clock_init(stable); - tsc_register_calibration_routines(kvm_get_tsc_khz, kvm_get_tsc_khz, tsc_properties); =20 --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CDCC841212F for ; Fri, 15 May 2026 19:21:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872884; cv=none; b=YIX8wLbJsRYw207sZH8AmJZZ+zgF5HHbVv4JmOtJfBfqrbzxI5GDGb3ZauowRFPONVy0mtqRmvfyyd8ZjP4lkO9o7ifyy548qCZl0kj06/S8P5C78hcsgRF9oUb6AJRFlOM73MO7Wwt/BmOmXtoTrpCAOr/KhilCd2poNOqCMes= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872884; c=relaxed/simple; bh=+wUr561K82TnIIpq5POLLP9qm+OKlIkzSL6qT55+ohk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=p0zECwBorVi7Ri8GXAe5/EwFFd0MkK9IU5b6G6oXulZJ52aG8Cc1EdOQwMGyYZFmq7IUr58hns+m4OpLAIu804htcLg/4TzU/JKPWdc4jMKStEh+7xrGVAIUkmFnUcm8oeAqaOgL4HDzdx43qKE73KpRuBGunsyG64CIZ63Xtuk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Ta25z2bi; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Ta25z2bi" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-835444b6ce1so197151b3a.1 for ; Fri, 15 May 2026 12:21:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872881; x=1779477681; darn=vger.kernel.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=rGCW9kF5gS8wHa+YnUvDY3DL62KvWmhRkotZ7eduTfw=; b=Ta25z2bi/E1rNTbhmSno1IWUNLCuO+aK1Y6t/kHmk9LK7KaW8q74FErtbeLvxVdCLv gjFYghKJmudd1vj3medSzcTDBUFt0WUZtmK8VmGJ58JMurKrko1SCC04IKAVhLhDWEkB XYK/dG5Cs+L+ExLY+z//vb+QAAMjjEZ7TtgmZx0AHGlzZVr2JH5AhWKxxsL4KY5DwyM5 JO6gspvhBPtDM2hp0lOENIN409lzPzHLEqnUZBn2Wb7lUcx3ERW8kvam2giqyCCaT2qw 5yLcn15RyQccNh+vMUkB8u1lfp4qkN4ukcZYhkUkMmA3dIqOwkYuALVdwUd3/LZ9cR45 FaUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872881; x=1779477681; 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=rGCW9kF5gS8wHa+YnUvDY3DL62KvWmhRkotZ7eduTfw=; b=ofzwhB8X6h1wNARXXWviOYzt2d0fcFwek6ty1ccFmBTo3FaJvjtcgbLxwI36H13QEH at643K3usumFiN2qH7mk/WklCkHQ0n7iPghZaDEMxGtWf5OkoIPhxLWhFYrUPJxxSLaG 7C71tH5pmu5rcCra2LS/oLKWdlyzOxchDx4bBLsvkOFWXhaY0WgQXU7f0SL4WPXt19DL gVijqLHNkOyf8m7mKWdz4d7mlZIbXUBWiYy/NbSAW82Ehi3mAT0uacSOdMRtaIYhlsHm g5cs/yFa47FQvT/PEe+G4T5+lPBVwEru70aLKIz9pnn51OCpsP2d1xgu69QJ7KI9+D9v DvXQ== X-Forwarded-Encrypted: i=1; AFNElJ/RyW7UW+y4/C0eAV66Xe3qeJEOxR47g8t4WU6oKd1rOiuyaOchCVg6s7ZI6NLz7hVE7tGY/xtXFoX0Scc=@vger.kernel.org X-Gm-Message-State: AOJu0Yxc0NODPxDGgq5ST7B/COMjBBFH86OVwUtb5rLLOfxZJJp8rG2L 3wh6ZaH7iHnGZIMLse3AJnzy9mD9IO2w2ZM/3UhkgWrEcx1+BKPCKZSSVB40qqnVpobDd29eJAu h90PWgA== X-Received: from pfkq14.prod.google.com ([2002:a05:6a00:84e:b0:839:4a33:c354]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:12e4:b0:835:405a:7e68 with SMTP id d2e1a72fcca58-83f33d9dd83mr5938852b3a.32.1778872880815; Fri, 15 May 2026 12:21:20 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:39 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-39-seanjc@google.com> Subject: [PATCH v3 38/41] x86/paravirt: kvmclock: Setup kvmclock early iff it's sched_clock From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rework the seemingly generic x86_cpuinit_ops.early_percpu_clock_init hook into a dedicated PV sched_clock hook, as the only reason the hook exists is to allow kvmclock to enable its PV clock on secondary CPUs before the kernel tries to reference sched_clock, e.g. when grabbing a timestamp for printk. Rearranging the hook doesn't exactly reduce complexity; arguably it does the opposite. But as-is, it's practically impossible to understand *why* kvmclock needs to do early configuration. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/include/asm/timer.h | 8 ++++++-- arch/x86/include/asm/x86_init.h | 2 -- arch/x86/kernel/kvmclock.c | 13 ++++++------- arch/x86/kernel/smpboot.c | 3 ++- arch/x86/kernel/tsc.c | 16 +++++++++++++++- arch/x86/kernel/x86_init.c | 1 - 6 files changed, 29 insertions(+), 14 deletions(-) diff --git a/arch/x86/include/asm/timer.h b/arch/x86/include/asm/timer.h index ca5c95d48c03..ab1271bd9c3b 100644 --- a/arch/x86/include/asm/timer.h +++ b/arch/x86/include/asm/timer.h @@ -15,14 +15,18 @@ extern bool using_native_sched_clock(void); =20 #ifdef CONFIG_PARAVIRT int __init __paravirt_set_sched_clock(u64 (*func)(void), bool stable, - void (*save)(void), void (*restore)(void)); + void (*save)(void), void (*restore)(void), + void (*start_secondary)); =20 static __always_inline void paravirt_set_sched_clock(u64 (*func)(void), void (*save)(void), void (*restore)(void)) { - (void)__paravirt_set_sched_clock(func, true, save, restore); + (void)__paravirt_set_sched_clock(func, true, save, restore, NULL); } +void paravirt_sched_clock_start_secondary(void); +#else +static inline void paravirt_sched_clock_start_secondary(void) { } #endif =20 /* diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_ini= t.h index 6c8a6ead84f6..d1b3f18ea41f 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h @@ -187,13 +187,11 @@ struct x86_init_ops { /** * struct x86_cpuinit_ops - platform specific cpu hotplug setups * @setup_percpu_clockev: set up the per cpu clock event device - * @early_percpu_clock_init: early init of the per cpu clock event device * @fixup_cpu_id: fixup function for cpuinfo_x86::topo.pkg_id * @parallel_bringup: Parallel bringup control */ struct x86_cpuinit_ops { void (*setup_percpu_clockev)(void); - void (*early_percpu_clock_init)(void); void (*fixup_cpu_id)(struct cpuinfo_x86 *c, int node); bool parallel_bringup; }; diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 0578bc448b1b..62c8ea2e6769 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -127,12 +127,13 @@ static void kvm_save_sched_clock_state(void) kvmclock_disable(); } =20 -#ifdef CONFIG_SMP -static void kvm_setup_secondary_clock(void) +static void kvm_setup_secondary_sched_clock(void) { + if (WARN_ON_ONCE(!IS_ENABLED(CONFIG_SMP))) + return; + kvm_register_clock("secondary cpu, sched_clock setup"); } -#endif =20 static void kvm_restore_sched_clock_state(void) { @@ -352,7 +353,8 @@ static __init void kvm_sched_clock_init(bool stable) { if (__paravirt_set_sched_clock(kvm_sched_clock_read, stable, kvm_save_sched_clock_state, - kvm_restore_sched_clock_state)) + kvm_restore_sched_clock_state, + kvm_setup_secondary_sched_clock)) return; =20 kvm_sched_clock_offset =3D kvm_clock_read(); @@ -437,9 +439,6 @@ void __init kvmclock_init(void) =20 x86_platform.get_wallclock =3D kvm_get_wallclock; x86_platform.set_wallclock =3D kvm_set_wallclock; -#ifdef CONFIG_SMP - x86_cpuinit.early_percpu_clock_init =3D kvm_setup_secondary_clock; -#endif kvm_get_preset_lpj(); =20 clocksource_register_hz(&kvm_clock, NSEC_PER_SEC); diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 294a8ea60298..318ae70e5e7b 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c @@ -78,6 +78,7 @@ #include #include #include +#include #include #include #include @@ -275,7 +276,7 @@ static void notrace __noendbr start_secondary(void *unu= sed) cpu_init(); fpu__init_cpu(); rcutree_report_cpu_starting(raw_smp_processor_id()); - x86_cpuinit.early_percpu_clock_init(); + paravirt_sched_clock_start_secondary(); =20 ap_starting(); =20 diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 7a261214fa3e..f78e86494dec 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -280,8 +280,19 @@ bool using_native_sched_clock(void) return static_call_query(pv_sched_clock) =3D=3D native_sched_clock; } =20 +#ifdef CONFIG_SMP +static void (*pv_sched_clock_start_secondary)(void) __ro_after_init; + +void paravirt_sched_clock_start_secondary(void) +{ + if (pv_sched_clock_start_secondary) + pv_sched_clock_start_secondary(); +} +#endif + int __init __paravirt_set_sched_clock(u64 (*func)(void), bool stable, - void (*save)(void), void (*restore)(void)) + void (*save)(void), void (*restore)(void), + void (*start_secondary)) { /* * Don't replace TSC with a PV clock when running as a CoCo guest and @@ -298,6 +309,9 @@ int __init __paravirt_set_sched_clock(u64 (*func)(void)= , bool stable, static_call_update(pv_sched_clock, func); x86_platform.save_sched_clock_state =3D save; x86_platform.restore_sched_clock_state =3D restore; +#ifdef CONFIG_SMP + pv_sched_clock_start_secondary =3D start_secondary; +#endif return 0; } #else diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c index ebefb77c37bb..cbb5ee613ed5 100644 --- a/arch/x86/kernel/x86_init.c +++ b/arch/x86/kernel/x86_init.c @@ -128,7 +128,6 @@ struct x86_init_ops x86_init __initdata =3D { }; =20 struct x86_cpuinit_ops x86_cpuinit =3D { - .early_percpu_clock_init =3D x86_init_noop, .setup_percpu_clockev =3D setup_secondary_APIC_clock, .parallel_bringup =3D true, }; --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0C1793D75B9 for ; Fri, 15 May 2026 19:21:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872886; cv=none; b=cZJFYl7AmPhQdQX98MrEIPaDy1P05oWpa/Onk9dVKB3BkGL8PcanT7kUmmMjkyhUWRSpsd8f1QrXL4crwOVzuzCGoKueEk9e20ZPYkga+0tLlyac6AIbiMTnPVUm7LGctwxhuXj36Z+eSQACU3eOLaPuCMjYRdJaEvqek2UbpuM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872886; c=relaxed/simple; bh=iobt3mMcxUgFyEoOEmLnGtiXka6utk5+xSHE3bisqLw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=RoiYNu60oYy99y+N+W9b2KIjw6IOL1hpVHM4uN4et4q4Aiwf/ZHC0fGTcPE1Kcq2iC1Iph92Bm2ZYwBRKvF0SYU2uqT8GAS2UnPoSxhzKwFLhNju3q31zbvPIMH+oglZbRnw1CseIdYFpQlbNNiRQQteybbEAlA9yOpOtttgpGA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=YXEMbnvg; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="YXEMbnvg" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-82f6a5b4f88so296412b3a.2 for ; Fri, 15 May 2026 12:21:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872882; x=1779477682; darn=vger.kernel.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=CJ9Kqslov6eJXg3tHpdlTt5rxLZvQw1ej96frcIls5c=; b=YXEMbnvgg6l0uKD6wsZPuFH8e21NihcxH9ZlNNKRqFSt0mdPcxMre6Gjjke+3vlKHq mtRhqG6ei8i7WBwUyBvb5tK8+GCLhtT7bTyPNxZn5ixZp6BQr7qLIPYCqYaUd3IZaP6H Q0Qw4UnvbFstDQ1o0jce7lTz3/HtuVBlAQ6aur2jioWFINpDmSMkn4z1JDGzv8LY2lBg tZoqluuSYqQUd6Jfhz/RLiWoSzloQHycgpp18RJ4wtMO8JiPeXgleJCJaDORnpfaPzC2 fFz1ArilyKGjicvvI0a4bA4kiyvlsCyFIMU5OP9dCQPn4b0WP5+5gzLEkWolKo03IiO2 Z5qA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872882; x=1779477682; 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=CJ9Kqslov6eJXg3tHpdlTt5rxLZvQw1ej96frcIls5c=; b=CEboScFr7+38q2uV32RAR5TqWqIaVa5/D/6ZhVkIj1YD7JJGhf4/++mxwBcEjgv4P2 2z42LzELulACQxDbzCZlXMaazn3QOzlKUoMPfxmqh9kcUOPUI3oGMmVzMQ2MmslkdATv fqIuc40trqQ46DgAFcE9ZsNl0sFtYpTmZRWIQvPJ/bFZwW5tAQ0QVe1Ip4PxzWPN5byC 56IY1hxuvh5ZK25oxr1fxqRKxdEJ+AbADe9olQR9qJg0zk52jCn/Ao2bLlPrwvwwgyll IJFRidx9OTSZoNt9sByh9SA/MydgX7fxyt7RxLQxUPuQJrWqtpRI7FRUo1pm6MKn838D DS5w== X-Forwarded-Encrypted: i=1; AFNElJ91UgFdALt6XNQTdilhAqVD6SfVvk7CwjcDNtiz62J5r9RTHP7HY4abbyP+f1sqfRgKdLJqEAFPgAVoVLM=@vger.kernel.org X-Gm-Message-State: AOJu0YwiNibAfJFBjluBECF+yBYk9PMUw0RIAW8eQmqnPWdjjFhYJqoy Fw17/hM425OfZfySZC5sWG7nC0tybRAgQQsReRVX7lklK+JamQCRDwKB3V9f6vSxyBedeucoiCv C+huDvA== X-Received: from pfmm20.prod.google.com ([2002:a05:6a00:2494:b0:835:43a4:4aaa]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:2d19:b0:82f:a89e:e16f with SMTP id d2e1a72fcca58-83f33b2f58fmr5940174b3a.14.1778872881979; Fri, 15 May 2026 12:21:21 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:40 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-40-seanjc@google.com> Subject: [PATCH v3 39/41] x86/paravirt: Move using_native_sched_clock() stub into timer.h From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now that timer.h ended up with CONFIG_PARAVIRT #ifdeffery anyways, move the PARAVIRT=3Dn using_native_sched_clock() stub into timer.h as a "free" optimization. No functional change intended. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/include/asm/timer.h | 5 +++-- arch/x86/kernel/tsc.c | 2 -- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/arch/x86/include/asm/timer.h b/arch/x86/include/asm/timer.h index ab1271bd9c3b..d8cb9c84f2c7 100644 --- a/arch/x86/include/asm/timer.h +++ b/arch/x86/include/asm/timer.h @@ -11,9 +11,9 @@ extern void recalibrate_cpu_khz(void); =20 extern int no_timer_check; =20 -extern bool using_native_sched_clock(void); - #ifdef CONFIG_PARAVIRT +extern bool using_native_sched_clock(void); + int __init __paravirt_set_sched_clock(u64 (*func)(void), bool stable, void (*save)(void), void (*restore)(void), void (*start_secondary)); @@ -27,6 +27,7 @@ static __always_inline void paravirt_set_sched_clock(u64 = (*func)(void), void paravirt_sched_clock_start_secondary(void); #else static inline void paravirt_sched_clock_start_secondary(void) { } +static inline bool using_native_sched_clock(void) { return true; } #endif =20 /* diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index f78e86494dec..1b569954ae5e 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -316,8 +316,6 @@ int __init __paravirt_set_sched_clock(u64 (*func)(void)= , bool stable, } #else u64 sched_clock_noinstr(void) __attribute__((alias("native_sched_clock"))); - -bool using_native_sched_clock(void) { return true; } #endif =20 notrace u64 sched_clock(void) --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 40F7F4033E2 for ; Fri, 15 May 2026 19:21:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872887; cv=none; b=RG3e74SfADx7hfWoO5eS9upziA0LEUHPRvKude6ayip8fdmYROKOnsWMrGUrVpoHCzfn7bveRJKaLWESaIhrWSpy7X7m2s5Gkw6q1HMmWLl8jTGPSW6RmvRNlgyweCSwWTqskgj+IerdlhxDGRDnj411DhVIjFTsJuDtcADR/ys= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872887; c=relaxed/simple; bh=FAuTHtAqfIjKZiW/8ebxRcA6f3m9NrH7uZUAhFreD6g=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=PuIlwVv6hX/oQi6WJyvBrADZG+FXcqlLlyXmubstuCGds5v8Wjsr5GHF/ny9IOk3XnWkXnRqHgZC5kac5cfJrH4N8jCcjYRFK+ruRH5+NB97drO2cupXqtWF7URlypEz6+NXWF3YZKrv/hlSbPlvdEvfn/2AJZEm08LG9Q5Mzls= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=LvrbrJH9; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="LvrbrJH9" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82f6a5b4f88so296443b3a.2 for ; Fri, 15 May 2026 12:21:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872883; x=1779477683; darn=vger.kernel.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=cGLSRPI8RMv865ATBw7wYYFL1PB8rGFTI0lK6a8u9vM=; b=LvrbrJH94vhQ6HA2qmxkxxXJ/QN2Dw0//whyTF6hOG0f9Is6tgL31c3w7RLGKF+K1M JmzLVPzlkPDt2MIOEMZNqUMcebW9IMXDQqOdykZeflTp56RXPVyiHJmybf8nVlARZ6rN F5LmNRtKIcF0vsz0mI5i+YnddiFoN+L3AzgbUMfiFUcUlTbgab2AGRsxPcLU8z6etKTk Tf4tqQk6bmX2yu4u1/1cRqdwrEAoweNCd0+FMK0DO0QRvEjEy3IwwROFYvmsJ5wOifoD oRV49fLytlfJ9/kjdp7HjfAeqteaGAIMF2PG1HN/DFh/qolrVKPVU9IgjJXKA6xfuBcr rhqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872883; x=1779477683; 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=cGLSRPI8RMv865ATBw7wYYFL1PB8rGFTI0lK6a8u9vM=; b=kF71R5yReoFVQiM3xBcE+Z96OQhhTuTWR3DKq6c80vlUu0qqIpBxp8D6ENhUFGsaCD GSsftQUGWS2eXoo51RjRg6IaXtZAr0K41htN8T1Qwr6Y+AxzdmR7VY9sTzclolnoQnsx bTVEVXPyWnYoeaL4k62Iuxzc2yrG/y6KhB3yIKXsrdVnKydDjlDbyzduQlOY69vc0jRI HKIXsamNQdPaAo4P+wcd/Eru899JzupBddNNvxzhvYsXsM2lb22KNUHMn0JudiPpe9N4 kwrDjIHXM4vHMajQ6HpSy1wUcp30BDvihrU6jXPxu64HGHH6xrn2Eb590tEtM3vTCJIW UqmQ== X-Forwarded-Encrypted: i=1; AFNElJ88W+V0PyfPPwLk0tN0P6T1cgD7rxrBlVplJUGFYr61P6H0KqoPXl7+8YLd0T3N25BL2ZNdt5tI5DkgRPw=@vger.kernel.org X-Gm-Message-State: AOJu0YxuDiJXdmRJKA0D0ZRGqZBWZG4zbTvdmnYZyPhRkVOfiTcGvCsp 1RFqB0WGCS2Mhm7yYlddgh9CZMX43fJlKqWDGcBz9izCTA19ME9LuRWp8Bb/MnFxTtWnUAihuRR 565sffg== X-Received: from pfdc18.prod.google.com ([2002:aa7:8c12:0:b0:834:df9e:8e02]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:194f:b0:82f:355a:857e with SMTP id d2e1a72fcca58-83f33d0398emr5462972b3a.47.1778872883144; Fri, 15 May 2026 12:21:23 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:41 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-41-seanjc@google.com> Subject: [PATCH v3 40/41] x86/tsc: Add standalone helper for getting CPU frequency from CPUID From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Extract the guts of cpu_khz_from_cpuid() to a standalone helper that doesn't restrict the usage to Intel CPUs. This will allow sharing the core logic with kvmclock, as (a) CPUID.0x16 may be enumerated alongside kvmclock, and (b) KVM generally doesn't restrict CPUID based on vendor. No functional change intended. Signed-off-by: Sean Christopherson Reviewed-by: David Woodhouse --- arch/x86/include/asm/tsc.h | 1 + arch/x86/kernel/tsc.c | 37 +++++++++++++++++++++++-------------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/arch/x86/include/asm/tsc.h b/arch/x86/include/asm/tsc.h index f458be688512..c145f5707b52 100644 --- a/arch/x86/include/asm/tsc.h +++ b/arch/x86/include/asm/tsc.h @@ -91,6 +91,7 @@ struct cpuid_tsc_info { }; extern int cpuid_get_tsc_info(struct cpuid_tsc_info *info); extern int cpuid_get_tsc_freq(struct cpuid_tsc_info *info); +extern int cpuid_get_cpu_freq(unsigned int *cpu_khz); =20 extern void tsc_early_init(void); extern void tsc_init(void); diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 1b569954ae5e..745fa2052c74 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -719,6 +719,24 @@ int cpuid_get_tsc_freq(struct cpuid_tsc_info *info) return 0; } =20 +int cpuid_get_cpu_freq(unsigned int *cpu_khz) +{ + unsigned int eax_base_mhz, ebx, ecx, edx; + + *cpu_khz =3D 0; + + if (boot_cpu_data.cpuid_level < CPUID_LEAF_FREQ) + return -ENOENT; + + cpuid(CPUID_LEAF_FREQ, &eax_base_mhz, &ebx, &ecx, &edx); + + if (!eax_base_mhz) + return -ENOENT; + + *cpu_khz =3D eax_base_mhz * 1000; + return 0; +} + /** * native_calibrate_tsc - determine TSC frequency * Determine TSC frequency via CPUID, else return 0. @@ -754,13 +772,8 @@ unsigned long native_calibrate_tsc(void) * clock, but we can easily calculate it to a high degree of accuracy * by considering the crystal ratio and the CPU speed. */ - if (!info.crystal_khz && boot_cpu_data.cpuid_level >=3D CPUID_LEAF_FREQ) { - unsigned int eax_base_mhz, ebx, ecx, edx; - - cpuid(CPUID_LEAF_FREQ, &eax_base_mhz, &ebx, &ecx, &edx); - info.crystal_khz =3D eax_base_mhz * 1000 * - info.denominator / info.numerator; - } + if (!info.crystal_khz && !cpuid_get_cpu_freq(&cpu_khz)) + info.crystal_khz =3D cpu_khz * info.denominator / info.numerator; =20 if (!info.crystal_khz) return 0; @@ -787,19 +800,15 @@ unsigned long native_calibrate_tsc(void) =20 static unsigned long cpu_khz_from_cpuid(void) { - unsigned int eax_base_mhz, ebx_max_mhz, ecx_bus_mhz, edx; + unsigned int cpu_khz; =20 if (boot_cpu_data.x86_vendor !=3D X86_VENDOR_INTEL) return 0; =20 - if (boot_cpu_data.cpuid_level < CPUID_LEAF_FREQ) + if (cpuid_get_cpu_freq(&cpu_khz)) return 0; =20 - eax_base_mhz =3D ebx_max_mhz =3D ecx_bus_mhz =3D edx =3D 0; - - cpuid(CPUID_LEAF_FREQ, &eax_base_mhz, &ebx_max_mhz, &ecx_bus_mhz, &edx); - - return eax_base_mhz * 1000; + return cpu_khz; } =20 /* --=20 2.54.0.563.g4f69b47b94-goog From nobody Mon May 25 08:12:02 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 52DC64033FF for ; Fri, 15 May 2026 19:21:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872888; cv=none; b=jVvGq+aI99kM015514XphixwuH+hhlEG3SurxGuBpitOgbKy/KUDugLnVJE8jTr/68QhEdZXRa7ZzN+2gwwz/OzG4INOQvjl6r9kj69cGLmO41j4Ftarns90YqRN8uIPJkO9WxUQtxptUeDAzHzTezrOZNvvqpTbyPrjxtwS5DM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778872888; c=relaxed/simple; bh=QioBrwKpRdsCytYFTzNNbiVitx8MQJE4M4sQvpXgFXY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=SqOIlarFsfYM5Ya5UmTCTZDFK0JicWLaHMEeaf1U+8gk6GJSZyVTZ778/9ME0olx9ViWxlAv6qlGWJkyZ9ULiFbCfCRVBGkAcVbj20Yx3wP8svnuDhOTibjTL5xYscIjnYz45aNtGLE7rBAYIRLYQPXceM1AqLnfurdU8W/mFj4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=P9QOwJpd; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="P9QOwJpd" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c829586e894so69902a12.2 for ; Fri, 15 May 2026 12:21:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778872885; x=1779477685; darn=vger.kernel.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=5BJQi7ZR1svDe2KF7RHkPrmL6MBNA7Dkc8gFvThdUD0=; b=P9QOwJpddaMglO39lPf0W/+PPdE6u0psiu5iecAPCxFkcs757Wlu8ETiXkl5hEcowr jmvrew7GOeId8lK0efHUa4xsgA4plYxpv9jnp99U/nbLgtvGVlkLqPGFMBEZjESX0rOe YyidFNALdrhx3LxCNU4u1sWjfEuF1iiBtln5eYs/kfLgeYSMEKgoOKGZc2A7XXEEIEZX D9BUqV+TQxMgnUtQGIgW7PBBCxJPs+Uvyjo/bpLmX/5uhtZxxdnGf8LoIprNT1le3tWd 73SdMlbEi00ryg3w7tScK67q1hFcv4vbzjtQ/ZDzzMMM+AGe+EblAU3BR2R8Y+HWPevT Gzhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778872885; x=1779477685; 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=5BJQi7ZR1svDe2KF7RHkPrmL6MBNA7Dkc8gFvThdUD0=; b=NQwIgOCy1RtAgj92AWs7VWsJ6laqbhIjsbKvKKONkr7RUZLteAE0482LhEKDjATILv qVBUW1PH6ZcRNzo7PwVxzk8FA5RvnHQJCYw1u4eRCPrxcuiUXoK9yBaOYJwZyxyLZQAa vZK10MupRqCaWK2M/RWn28dF7CmztQSsbfxLnjowU0kYDBfrx3Lyf0mchAT1SCdCTAiP pMopqHGfPsHn2DqbDHqmmoPcEEz+ZTGx+6g5yL41WpuitvTHzoomRGdAbO16sG137Aro xNfp3IftWR3QN/Btz/3GfgIFgbZ3q3pT+Koz0/pMXsoz0gh0Unte2CIWOyZH0TtgL5OD w8tA== X-Forwarded-Encrypted: i=1; AFNElJ/s1NYLMBJQ2kORLHgh2ylmu6nQmO/muXJ9mOp7WRsEQjPDbOxV9lF31NL4Fv5GJ4PPi4B9PmfrBh9CCI0=@vger.kernel.org X-Gm-Message-State: AOJu0Yx/XPz1QQxKwaArco9Os62uvgTser93HpzLJM0PJwKmexrQ73z2 MlxDaQBzfff6z4RT45INy5WVy9h2kMvu367rZkgVSckIs5gy7GNz6qWnDkUXE9igFxCZ1tLZ59g 8ydOExg== X-Received: from pfbeq4.prod.google.com ([2002:a05:6a00:37c4:b0:82f:344e:386a]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:9502:b0:838:1c02:2763 with SMTP id d2e1a72fcca58-83f33ab667bmr5736284b3a.9.1778872884225; Fri, 15 May 2026 12:21:24 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 15 May 2026 12:19:42 -0700 In-Reply-To: <20260515191942.1892718-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260515191942.1892718-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260515191942.1892718-42-seanjc@google.com> Subject: [PATCH v3 41/41] x86/kvmclock: Get CPU base frequency from CPUID when it's available From: Sean Christopherson To: Kiryl Shutsemau , Paolo Bonzini , Sean Christopherson , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Juergen Gross , Daniel Lezcano , Thomas Gleixner , John Stultz Cc: Rick Edgecombe , Vitaly Kuznetsov , Broadcom internal kernel review list , Boris Ostrovsky , Stephen Boyd , x86@kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, Michael Kelley , Tom Lendacky , Nikunj A Dadhania , Thomas Gleixner , David Woodhouse Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If CPUID.0x16 is present and valid, use the CPU frequency provided by CPUID instead of assuming that the virtual CPU runs at the same frequency as TSC and/or kvmclock. Back before constant TSCs were a thing, treating the TSC and CPU frequencies as one and the same was somewhat reasonable, but now it's nonsensical, especially if the hypervisor explicitly enumerates the CPU frequency. Signed-off-by: Sean Christopherson --- arch/x86/kernel/kvmclock.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 62c8ea2e6769..7607920ae386 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -190,6 +190,20 @@ void kvmclock_cpu_action(enum kvm_guest_cpu_action act= ion) } } =20 +static unsigned long kvm_get_cpu_khz(void) +{ + unsigned int cpu_khz; + + /* + * Prefer CPUID over kvmclock when possible, as the base CPU frequency + * isn't necessarily the same as the kvmlock "TSC" frequency. + */ + if (!cpuid_get_cpu_freq(&cpu_khz)) + return cpu_khz; + + return pvclock_tsc_khz(this_cpu_pvti()); +} + /* * If we don't do that, there is the possibility that the guest * will calibrate under heavy load - thus, getting a lower lpj - @@ -434,7 +448,7 @@ void __init kvmclock_init(void) kvm_sched_clock_init(stable); } =20 - tsc_register_calibration_routines(kvm_get_tsc_khz, kvm_get_tsc_khz, + tsc_register_calibration_routines(kvm_get_tsc_khz, kvm_get_cpu_khz, tsc_properties); =20 x86_platform.get_wallclock =3D kvm_get_wallclock; --=20 2.54.0.563.g4f69b47b94-goog