On Tue, Jul 28, 2026, David Woodhouse wrote:
> When the clock read fails (e.g. clocksource transitioning away from TSC),
> fall back to that path rather than proceeding with uninitialised data or
> spinning in the seqcount loop.

This is not restructuring, it is a logical change.  It's a good logical change,
but it needs to be isolated.  This is what I have locally (spoiler alert; I'm
working backwards a bit):

From: David Woodhouse <[email protected]>
Date: Tue, 28 Jul 2026 15:26:35 -0700
Subject: [PATCH] KVM: x86: Fall back to non-master-clock if clockread fails in
 get_kvmclock()

When computing kvmclock and the it's currently in master-clock mode, fall
back to the non-master-clock path if the clock read fils, e.g. if the
kernel's clocksource transitioning away from TSC but ka->use_master_clock
hasn't been udated yet.  The rdtsc() fall back was added (well, kept) in
commit c68dc1b577ea ("KVM: x86: Report host tsc and realtime values in
KVM_GET_CLOCK") purely to avoid uninitialized variables and compilation
problems on 32-bit kernels (already addressed).  In hindsight, keeping the
rdtsc() was a hack and a mistake.

Link: 
https://lore.kernel.org/all/caoq_qsgvqs_pujo8f10gg5xw+tkt+5gdx+kjf1j3cipo4ma...@mail.gmail.com
Signed-off-by: David Woodhouse <[email protected]>
[sean: isolate from refactoring changes, write changelog]
Signed-off-by: Sean Christopherson <[email protected]>
---
 arch/x86/kvm/x86.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index a0ed0969fcb3..895d3cf7bfcf 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1657,14 +1657,13 @@ static bool __get_kvmclock_master_clock(struct kvm *kvm,
        if (!tsc_hz)
                return false;
 
-       if (kvm_get_walltime_and_clockread(&ts, &data->host_tsc)) {
-               data->realtime = ts.tv_nsec + NSEC_PER_SEC * ts.tv_sec;
-               data->flags |= KVM_CLOCK_REALTIME | KVM_CLOCK_HOST_TSC;
-       } else {
-               data->host_tsc = rdtsc();
-       }
+       if (!kvm_get_walltime_and_clockread(&ts, &data->host_tsc))
+               return false;
+
+       data->realtime = ts.tv_nsec + NSEC_PER_SEC * ts.tv_sec;
+       data->flags |= KVM_CLOCK_REALTIME | KVM_CLOCK_HOST_TSC |
+                      KVM_CLOCK_TSC_STABLE;
 
-       data->flags |= KVM_CLOCK_TSC_STABLE;
        hv_clock.tsc_timestamp = ka->master_cycle_now;
        hv_clock.system_time = ka->master_kernel_ns + ka->kvmclock_offset;
        kvm_get_time_scale(NSEC_PER_SEC,  tsc_hz,

base-commit: f8c5e70f5ed58dc9d39db90ecaba0ce76ac52189
--

Reply via email to