From: sashiko-bot@kernel.org
To: "Sean Christopherson" <seanjc@google.com>
Cc: kvm@vger.kernel.org
Subject: Re: [PATCH v10 21/21] KVM: x86: Use kernel timekeeping snapshot to get walltime+TSC
Date: Wed, 26 Aug 2026 21:49:51 +0000 [thread overview]
Message-ID: <20260826214952.129BB1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260826213303.914988-22-seanjc@google.com>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Removal of KVM's local TSC clamping exposes guests to mismatched (tsc, walltime) pairs when the host TSC goes backwards, causing guest time to jump forward.
--
commit 538536e82164aaa6297ef0ce3bf878f455e79fc7
Author: Sean Christopherson <seanjc@google.com>
KVM: x86: Use kernel timekeeping snapshot to get walltime+TSC
This commit replaces the KVM-private timekeeping reimplementation with calls
to the generic ktime_get_snapshot_id() interface. It provides both the system
time and raw cycles atomically paired using a sequence counter, allowing the
deletion of the unused read_tsc() and vgettsc() functions.
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 0352bd147c400..34eadc75fee46 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
[ ... ]
> @@ -1525,11 +1449,14 @@ bool kvm_get_monotonic_and_clockread(s64 *kernel_ns, u64 *tsc_timestamp)
> static bool kvm_get_walltime_and_clockread(struct timespec64 *ts,
> u64 *tsc_timestamp)
> {
> - /* checked again under seqlock below */
> - if (!gtod_is_based_on_tsc(pvclock_gtod_data.clock.vclock_mode))
> + struct system_time_snapshot snap = {};
> +
> + ktime_get_snapshot_id(CLOCK_REALTIME, &snap);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[Severity: High]
Does removing KVM's local TSC clamping expose guests to mismatched time pairs?
When establishing the guest's PV clock, KVM provides a master clock
snapshot pairing a host TSC with a system time. The previous read_tsc()
logic explicitly clamped the TSC to cycle_last to maintain mathematical
consistency.
Looking at ktime_get_snapshot_id() in kernel/time/timekeeping.c, the
function does not clamp the returned raw TSC (cycles):
kernel/time/timekeeping.c:ktime_get_snapshot_id() {
...
systime_snapshot->cycles = now;
...
}
However, the system time is clamped by timekeeping_cycles_to_ns(), which
skips the negative delta if now < cycle_last.
If the host TSC read on the current CPU is slightly behind tkr->cycle_last
(for example, due to cross-CPU TSC skew), could this result in KVM
returning a mathematically mismatched pair?
An older unclamped TSC (now) paired with a clamped future walltime
(at cycle_last) would cause the elapsed delta (guest_tsc - master_tsc)
to be artificially inflated when the guest later reads the TSC.
Could this cause the guest's clock to jump forward by that offset?
> + if (!kvm_snapshot_has_tsc(&snap, tsc_timestamp))
> return false;
>
> - return gtod_is_based_on_tsc(do_realtime(ts, tsc_timestamp));
> + *ts = ktime_to_timespec64(snap.systime);
> + return true;
> }
> #endif
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260826213303.914988-1-seanjc@google.com?part=21
next prev parent reply other threads:[~2026-08-26 21:49 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-26 21:32 [PATCH v10 00/21] KVM: x86: Cleaning up the KVM clock mess, part 1 Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 01/21] KVM: x86: Update "last guest TSC" snapshot prior to enabling IRQs/preemption Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 02/21] KVM: x86: Improve accuracy of KVM clock when TSC scaling is in force Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 03/21] KVM: x86: Explicitly disable TSC scaling without CONSTANT_TSC Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 04/21] KVM: x86: Activate master clock immediately on vCPU creation Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 05/21] KVM: x86: Compute kvmclock base without pvclock_gtod_data Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 06/21] KVM: x86: Avoid NTP frequency skew for KVM clock on 32-bit host Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 07/21] KVM: x86: Drop unnecessary CPU pinning when computing/getting kvmclock Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 08/21] KVM: x86: Move "no master clock" fallback from __get_kvmclock() to get_kvmclock() Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 09/21] KVM: x86: Wrap all of __get_kvmclock_master_clock() with CONFIG_X86_64=y Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 10/21] KVM: x86: Fall back to non-master-clock if clockread fails in get_kvmclock() Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 11/21] KVM: x86: Fix KVM clock precision in get_kvmclock() with TSC scaling Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 12/21] KVM: x86: Use get_kvmclock() in kvm_get_wall_clock_epoch() Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 13/21] KVM: x86: Fix compute_guest_tsc() to handle negative time deltas Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 14/21] KVM: x86: Disable preemption, not IRQs, when getting TSC+freq pair Sean Christopherson
2026-08-26 21:45 ` sashiko-bot
2026-08-26 21:32 ` [PATCH v10 15/21] KVM: x86: Make master clock logic in guest PV clock updates 64-bit only Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 16/21] KVM: x86: Upscale TSC to "now", not master clock when updating PV clocks Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 17/21] KVM: x86: Simplify and comment kvm_get_time_scale() Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 18/21] KVM: x86: Remove implicit rdtsc() from kvm_compute_l1_tsc_offset() Sean Christopherson
2026-08-26 21:32 ` [PATCH v10 19/21] KVM: x86: Use kernel timekeeping snapshots for getting kvmclock time since boot Sean Christopherson
2026-08-26 21:33 ` [PATCH v10 20/21] KVM: x86: Use kernel timekeeping snapshot for monotonic clock Sean Christopherson
2026-08-26 21:33 ` [PATCH v10 21/21] KVM: x86: Use kernel timekeeping snapshot to get walltime+TSC Sean Christopherson
2026-08-26 21:49 ` sashiko-bot [this message]
2026-08-28 22:46 ` David Woodhouse
2026-09-01 19:33 ` Sean Christopherson
2026-09-01 19:17 ` Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260826214952.129BB1F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=kvm@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=seanjc@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.