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);

