]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ptp: vmclock: Use hw_cycles from snapshot for precise TSC pairing
authorDavid Woodhouse <dwmw@amazon.co.uk>
Thu, 4 Jun 2026 09:35:18 +0000 (10:35 +0100)
committerThomas Gleixner <tglx@kernel.org>
Fri, 5 Jun 2026 12:25:03 +0000 (14:25 +0200)
When the system clocksource is kvmclock or Hyper-V (not the TSC directly),
vmclock_get_crosststamp() falls 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 hw_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 against the
system clock.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Assisted-by: Kiro:claude-opus-4.6-1m
Link: https://patch.msgid.link/20260604095755.64849-4-dwmw2@infradead.org
drivers/ptp/ptp_vmclock.c

index d6a5a533164aafb43f05c5dab9512c256738adc2..eebdcd5ebc08085db803df60ca1add43602018d3 100644 (file)
@@ -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.hw_csid == st->cs_id &&
+                                  sts->pre_sts.hw_cycles) {
+                               cycle = sts->pre_sts.hw_cycles;
+                               sts->post_sts = sts->pre_sts;
                        } else {
                                cycle = get_cycles();
                                ptp_read_system_postts(sts);