mips: vdso: Use generic VDSO clock mode storage
authorThomas Gleixner <tglx@linutronix.de>
Fri, 7 Feb 2020 12:38:57 +0000 (13:38 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Mon, 17 Feb 2020 19:12:16 +0000 (20:12 +0100)
Switch to the generic VDSO clock mode storage.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
Link: https://lkml.kernel.org/r/20200207124403.244684017@linutronix.de
arch/mips/Kconfig
arch/mips/include/asm/clocksource.h
arch/mips/include/asm/vdso/gettimeofday.h
arch/mips/include/asm/vdso/vsyscall.h
arch/mips/kernel/csrc-r4k.c
drivers/clocksource/mips-gic-timer.c

index 797d7f1..23b5c05 100644 (file)
@@ -4,7 +4,6 @@ config MIPS
        default y
        select ARCH_32BIT_OFF_T if !64BIT
        select ARCH_BINFMT_ELF_STATE if MIPS_FP_SUPPORT
-       select ARCH_CLOCKSOURCE_DATA
        select ARCH_HAS_FORTIFY_SOURCE
        select ARCH_HAS_KCOV
        select ARCH_HAS_PTE_SPECIAL if !(32BIT && CPU_HAS_RIXI)
@@ -38,6 +37,7 @@ config MIPS
        select GENERIC_SCHED_CLOCK if !CAVIUM_OCTEON_SOC
        select GENERIC_SMP_IDLE_THREAD
        select GENERIC_TIME_VSYSCALL
+       select GENERIC_VDSO_CLOCK_MODE
        select GUP_GET_PTE_LOW_HIGH if CPU_MIPS32 && PHYS_ADDR_T_64BIT
        select HANDLE_DOMAIN_IRQ
        select HAVE_ARCH_COMPILER_H
index cab9ae9..de659ca 100644 (file)
@@ -3,23 +3,11 @@
  * Copyright (C) 2015 Imagination Technologies
  * Author: Alex Smith <alex.smith@imgtec.com>
  */
-
 #ifndef __ASM_CLOCKSOURCE_H
 #define __ASM_CLOCKSOURCE_H
 
-#include <linux/types.h>
-
-/* VDSO clocksources. */
-#define VDSO_CLOCK_NONE                0       /* No suitable clocksource. */
-#define VDSO_CLOCK_R4K         1       /* Use the coprocessor 0 count. */
-#define VDSO_CLOCK_GIC         2       /* Use the GIC. */
-
-/**
- * struct arch_clocksource_data - Architecture-specific clocksource information.
- * @vdso_clock_mode: Method the VDSO should use to access the clocksource.
- */
-struct arch_clocksource_data {
-       u8 vdso_clock_mode;
-};
+#define VDSO_ARCH_CLOCKMODES   \
+       VDSO_CLOCKMODE_R4K,     \
+       VDSO_CLOCKMODE_GIC
 
 #endif /* __ASM_CLOCKSOURCE_H */
index a9f846b..88c3de1 100644 (file)
@@ -24,8 +24,6 @@
 
 #define VDSO_HAS_CLOCK_GETRES          1
 
-#define __VDSO_USE_SYSCALL             ULLONG_MAX
-
 static __always_inline long gettimeofday_fallback(
                                struct __kernel_old_timeval *_tv,
                                struct timezone *_tz)
@@ -175,28 +173,20 @@ static __always_inline u64 read_gic_count(const struct vdso_data *data)
 
 static __always_inline u64 __arch_get_hw_counter(s32 clock_mode)
 {
-#ifdef CONFIG_CLKSRC_MIPS_GIC
-       const struct vdso_data *data = get_vdso_data();
-#endif
-       u64 cycle_now;
-
-       switch (clock_mode) {
 #ifdef CONFIG_CSRC_R4K
-       case VDSO_CLOCK_R4K:
-               cycle_now = read_r4k_count();
-               break;
+       if (clock_mode == VDSO_CLOCKMODE_R4K)
+               return read_r4k_count();
 #endif
 #ifdef CONFIG_CLKSRC_MIPS_GIC
-       case VDSO_CLOCK_GIC:
-               cycle_now = read_gic_count(data);
-               break;
+       if (clock_mode == VDSO_CLOCKMODE_GIC)
+               return read_gic_count(get_vdso_data());
 #endif
-       default:
-               cycle_now = __VDSO_USE_SYSCALL;
-               break;
-       }
-
-       return cycle_now;
+       /*
+        * Core checks mode already. So this raced against a concurrent
+        * update. Return something. Core will do another round see the
+        * change and fallback to syscall.
+        */
+       return 0;
 }
 
 static inline bool mips_vdso_hres_capable(void)
index 00d41b9..47168aa 100644 (file)
@@ -19,15 +19,6 @@ struct vdso_data *__mips_get_k_vdso_data(void)
 }
 #define __arch_get_k_vdso_data __mips_get_k_vdso_data
 
-static __always_inline
-int __mips_get_clock_mode(struct timekeeper *tk)
-{
-       u32 clock_mode = tk->tkr_mono.clock->archdata.vdso_clock_mode;
-
-       return clock_mode;
-}
-#define __arch_get_clock_mode __mips_get_clock_mode
-
 /* The asm-generic header needs to be included after the definitions above */
 #include <asm-generic/vdso/vsyscall.h>
 
index eed099f..437dda6 100644 (file)
@@ -78,7 +78,7 @@ int __init init_r4k_clocksource(void)
         * by the VDSO (HWREna is configured by configure_hwrena()).
         */
        if (cpu_has_mips_r2_r6 && rdhwr_count_usable())
-               clocksource_mips.archdata.vdso_clock_mode = VDSO_CLOCK_R4K;
+               clocksource_mips.vdso_clock_mode = VDSO_CLOCKMODE_R4K;
 
        clocksource_register_hz(&clocksource_mips, mips_hpt_frequency);
 
index 37671a5..8b5f8ae 100644 (file)
@@ -155,10 +155,10 @@ static u64 gic_hpt_read(struct clocksource *cs)
 }
 
 static struct clocksource gic_clocksource = {
-       .name           = "GIC",
-       .read           = gic_hpt_read,
-       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
-       .archdata       = { .vdso_clock_mode = VDSO_CLOCK_GIC },
+       .name                   = "GIC",
+       .read                   = gic_hpt_read,
+       .flags                  = CLOCK_SOURCE_IS_CONTINUOUS,
+       .vdso_clock_mode        = VDSO_CLOCKMODE_GIC,
 };
 
 static int __init __gic_clocksource_init(void)