From: David Woodhouse When the system clocksource is kvmclock or Hyper-V (not the TSC directly), vmclock_get_crosststamp() previously fell through to a separate get_cycles() call, losing the atomic pairing between the system time snapshot and the TSC reading. Now that ktime_get_snapshot_id() populates raw_cycles with the underlying TSC value for derived clocksources, use it when available. This gives a perfect (system_time, tsc) pairing for the device time calculation. The SUPPORT_KVMCLOCK wrapper is still needed to convert the TSC into kvmclock nanoseconds for system_counter->cycles, because otherwise get_device_system_crosststamp() can't interpret the result. Signed-off-by: David Woodhouse Assisted-by: Kiro:claude-opus-4.6-1m --- drivers/ptp/ptp_vmclock.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/ptp/ptp_vmclock.c b/drivers/ptp/ptp_vmclock.c index cb18c15a4697..aacbf8f48f13 100644 --- a/drivers/ptp/ptp_vmclock.c +++ b/drivers/ptp/ptp_vmclock.c @@ -140,6 +140,10 @@ static int vmclock_get_crosststamp(struct vmclock_state *st, if (sts->pre_sts.cs_id == st->cs_id) { cycle = sts->pre_sts.cycles; sts->post_sts = sts->pre_sts; + } else if (sts->pre_sts.raw_csid == st->cs_id && + sts->pre_sts.raw_cycles) { + cycle = sts->pre_sts.raw_cycles; + sts->post_sts = sts->pre_sts; } else { cycle = get_cycles(); ptp_read_system_postts(sts); -- 2.54.0