From: David Woodhouse <[email protected]> If kvm_get_walltime_and_clockread() fails unexpectedly (the WARN case), restart the seqcount loop rather than falling back to a raw rdtsc() which would set KVM_CLOCK_TSC_STABLE without KVM_CLOCK_REALTIME.
That code path could never actually be reached in practice: on 64-bit hosts, use_master_clock can only be true when the clocksource is TSC-based, and on 32-bit hosts, use_master_clock is never set. But the fallback to raw rdtsc() was misleading and the resulting flags combination was inconsistent. Signed-off-by: David Woodhouse <[email protected]> --- arch/x86/kvm/x86.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 9b395c00ccf2..f2653eaccdf8 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -3225,7 +3225,8 @@ static void get_kvmclock(struct kvm *kvm, struct kvm_clock_data *data) data->realtime = ts.tv_nsec + NSEC_PER_SEC * ts.tv_sec; data->flags |= KVM_CLOCK_REALTIME | KVM_CLOCK_HOST_TSC; } else if (WARN_ON_ONCE(!read_seqcount_retry(&ka->pvclock_sc, seq))) { - data->host_tsc = rdtsc(); + put_cpu(); + continue; } #else data->host_tsc = rdtsc(); -- 2.51.0

