From: David Woodhouse <[email protected]>

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 <[email protected]>
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


Reply via email to