get_cycles() is not really well defined and similar to other usaage of the
underlying hardware CPU counters the PTP vmclock should use an explicit
interface as well.

Implement ptp_vmclock_read_cpu_counter() in arm64 and x86 and simplify the
Kconfig selection while at it.

No functional change.

Signed-off-by: Thomas Gleixner <[email protected]>
Cc: David Woodhouse <[email protected]>
---
 arch/arm64/Kconfig                   |    1 +
 arch/arm64/include/asm/ptp_vmclock.h |   12 ++++++++++++
 arch/x86/Kconfig                     |    1 +
 arch/x86/include/asm/ptp_vmclock.h   |   12 ++++++++++++
 drivers/ptp/Kconfig                  |    6 ++++--
 drivers/ptp/ptp_vmclock.c            |    6 ++++--
 6 files changed, 34 insertions(+), 4 deletions(-)

--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -112,6 +112,7 @@ config ARM64
        select ARCH_SUPPORTS_SCHED_SMT
        select ARCH_SUPPORTS_SCHED_CLUSTER
        select ARCH_SUPPORTS_SCHED_MC
+       select ARCH_SUPPORTS_PTP_VMCLOCK if ARCH_SUPPORTS_INT128
        select ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH
        select ARCH_WANT_COMPAT_IPC_PARSE_VERSION if COMPAT
        select ARCH_WANT_DEFAULT_BPF_JIT
--- /dev/null
+++ b/arch/arm64/include/asm/ptp_vmclock.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef __ASM_PTP_VMCLOCK_H
+#define __ASM_PTP_VMCLOCK_H
+
+#include <asm/arch_timer.h>
+
+static inline u64 ptp_vmclock_read_cpu_counter(void)
+{
+       return arch_timer_read_counter();
+}
+
+#endif
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -135,6 +135,7 @@ config X86
        select ARCH_SUPPORTS_RT
        select ARCH_SUPPORTS_AUTOFDO_CLANG
        select ARCH_SUPPORTS_PROPELLER_CLANG    if X86_64
+       select ARCH_SUPPORTS_PTP_VMCLOCK        if X86_TSC
        select ARCH_USE_BUILTIN_BSWAP
        select ARCH_USE_CMPXCHG_LOCKREF         if X86_CX8
        select ARCH_USE_MEMTEST
--- /dev/null
+++ b/arch/x86/include/asm/ptp_vmclock.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef __ASM_PTP_VMCLOCK_H
+#define __ASM_PTP_VMCLOCK_H
+
+#include <asm/tsc.h>
+
+static inline u64 ptp_vmclock_read_cpu_counter(void)
+{
+       return cpu_feature_enabled(X86_FEATURE_TSC) ? rdtsc() : 0;
+}
+
+#endif
--- a/drivers/ptp/Kconfig
+++ b/drivers/ptp/Kconfig
@@ -131,10 +131,12 @@ config PTP_1588_CLOCK_KVM
          To compile this driver as a module, choose M here: the module
          will be called ptp_kvm.
 
+config ARCH_SUPPORTS_PTP_VMCLOCK
+       bool
+
 config PTP_1588_CLOCK_VMCLOCK
        tristate "Virtual machine PTP clock"
-       depends on X86_TSC || ARM_ARCH_TIMER
-       depends on PTP_1588_CLOCK && ARCH_SUPPORTS_INT128
+       depends on PTP_1588_CLOCK && ARCH_SUPPORTS_PTP_VMCLOCK
        default PTP_1588_CLOCK_KVM
        help
          This driver adds support for using a virtual precision clock
--- a/drivers/ptp/ptp_vmclock.c
+++ b/drivers/ptp/ptp_vmclock.c
@@ -28,6 +28,8 @@
 
 #include <linux/ptp_clock_kernel.h>
 
+#include <asm/ptp_vmclock.h>
+
 #ifdef CONFIG_X86
 #include <asm/pvclock.h>
 #include <asm/kvmclock.h>
@@ -144,11 +146,11 @@ static int vmclock_get_crosststamp(struc
                        if (systime_snapshot.cs_id == st->cs_id) {
                                cycle = systime_snapshot.cycles;
                        } else {
-                               cycle = get_cycles();
+                               cycle = ptp_vmclock_read_cpu_counter();
                                ptp_read_system_postts(sts);
                        }
                } else {
-                       cycle = get_cycles();
+                       cycle = ptp_vmclock_read_cpu_counter();
                }
 
                delta = cycle - le64_to_cpu(st->clk->counter_value);


Reply via email to