[GIT pull] timers/cleanups for v7.3-rc1

Thomas Gleixner posted 1 patch 1 month, 1 week ago
arch/Kconfig                        |  3 +++
arch/alpha/include/asm/timex.h      |  4 ----
arch/arc/include/asm/timex.h        | 15 ---------------
arch/arm/Kconfig                    |  1 +
arch/arm/include/asm/delay.h        |  1 -
arch/arm/include/asm/timex.h        |  5 ++++-
arch/arm/lib/delay.c                | 10 ++++------
arch/arm/mach-omap1/Kconfig         |  2 +-
arch/hexagon/Kconfig                |  1 +
arch/hexagon/include/asm/timex.h    | 23 -----------------------
arch/hexagon/kernel/time.c          |  8 +++++++-
arch/m68k/include/asm/timex.h       | 15 ---------------
arch/microblaze/include/asm/timex.h | 13 -------------
arch/mips/include/asm/timex.h       |  8 --------
arch/openrisc/Kconfig               |  1 +
arch/openrisc/include/asm/timex.h   |  5 -----
arch/openrisc/lib/delay.c           |  9 ++++-----
arch/parisc/include/asm/timex.h     |  2 --
arch/powerpc/include/asm/timex.h    |  2 --
arch/riscv/Kconfig                  |  1 +
arch/riscv/include/asm/timex.h      |  8 --------
arch/riscv/lib/delay.c              |  7 ++++++-
arch/s390/include/asm/timex.h       |  2 --
arch/sh/include/asm/timex.h         | 24 ------------------------
arch/sparc/Kconfig                  |  1 +
arch/sparc/include/asm/timex.h      |  2 +-
arch/sparc/include/asm/timex_32.h   | 14 --------------
arch/sparc/include/asm/timex_64.h   |  4 ----
arch/sparc/kernel/time_64.c         |  4 ++--
arch/um/include/asm/timex.h         |  9 ---------
arch/x86/Kconfig                    |  1 +
arch/x86/include/asm/timex.h        |  5 -----
arch/x86/kernel/setup.c             |  2 +-
arch/x86/lib/delay.c                |  8 +++-----
include/asm-generic/timex.h         |  7 -------
include/linux/delay.h               |  2 ++
include/linux/timex.h               |  2 --
init/calibrate.c                    | 19 +++++++++----------
38 files changed, 53 insertions(+), 197 deletions(-)
delete mode 100644 arch/arc/include/asm/timex.h
delete mode 100644 arch/hexagon/include/asm/timex.h
delete mode 100644 arch/microblaze/include/asm/timex.h
delete mode 100644 arch/sh/include/asm/timex.h
delete mode 100644 arch/sparc/include/asm/timex_32.h
delete mode 100644 arch/um/include/asm/timex.h
[GIT pull] timers/cleanups for v7.3-rc1
Posted by Thomas Gleixner 1 month, 1 week ago
Linus,

please pull the latest timers/cleanups branch from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers-cleanups-2026-08-17

up to:  dfc256dac54c: calibrate: Rework delay timer calibration

Treewide timer related cleanups:

  - Remove the leftover CLOCK_TICK_RATE which has been scheduled for
    removal more than a decade ago along with some now empty asm/timex.h
    files.

  - Consolidate delay timer calibration

    The construct of having a define in a header requires that
    architectures provided asm/timex.h for no reason. Also the function
    name for reading the delay timer is confusing at best.

    Use a config switch to enable that functionality and rename the
    function to delay_read_timer() to make the purpose clear.

    This removes some more now empty asm/timex.h files as well.

Thanks,

	tglx

------------------>
Thomas Gleixner (3):
      x86: Use PIT_TICK_RATE instead of CLOCK_TICK_RATE
      treewide: Remove CLOCK_TICK_RATE
      calibrate: Rework delay timer calibration


 arch/Kconfig                        |  3 +++
 arch/alpha/include/asm/timex.h      |  4 ----
 arch/arc/include/asm/timex.h        | 15 ---------------
 arch/arm/Kconfig                    |  1 +
 arch/arm/include/asm/delay.h        |  1 -
 arch/arm/include/asm/timex.h        |  5 ++++-
 arch/arm/lib/delay.c                | 10 ++++------
 arch/arm/mach-omap1/Kconfig         |  2 +-
 arch/hexagon/Kconfig                |  1 +
 arch/hexagon/include/asm/timex.h    | 23 -----------------------
 arch/hexagon/kernel/time.c          |  8 +++++++-
 arch/m68k/include/asm/timex.h       | 15 ---------------
 arch/microblaze/include/asm/timex.h | 13 -------------
 arch/mips/include/asm/timex.h       |  8 --------
 arch/openrisc/Kconfig               |  1 +
 arch/openrisc/include/asm/timex.h   |  5 -----
 arch/openrisc/lib/delay.c           |  9 ++++-----
 arch/parisc/include/asm/timex.h     |  2 --
 arch/powerpc/include/asm/timex.h    |  2 --
 arch/riscv/Kconfig                  |  1 +
 arch/riscv/include/asm/timex.h      |  8 --------
 arch/riscv/lib/delay.c              |  7 ++++++-
 arch/s390/include/asm/timex.h       |  2 --
 arch/sh/include/asm/timex.h         | 24 ------------------------
 arch/sparc/Kconfig                  |  1 +
 arch/sparc/include/asm/timex.h      |  2 +-
 arch/sparc/include/asm/timex_32.h   | 14 --------------
 arch/sparc/include/asm/timex_64.h   |  4 ----
 arch/sparc/kernel/time_64.c         |  4 ++--
 arch/um/include/asm/timex.h         |  9 ---------
 arch/x86/Kconfig                    |  1 +
 arch/x86/include/asm/timex.h        |  5 -----
 arch/x86/kernel/setup.c             |  2 +-
 arch/x86/lib/delay.c                |  8 +++-----
 include/asm-generic/timex.h         |  7 -------
 include/linux/delay.h               |  2 ++
 include/linux/timex.h               |  2 --
 init/calibrate.c                    | 19 +++++++++----------
 38 files changed, 53 insertions(+), 197 deletions(-)
 delete mode 100644 arch/arc/include/asm/timex.h
 delete mode 100644 arch/hexagon/include/asm/timex.h
 delete mode 100644 arch/microblaze/include/asm/timex.h
 delete mode 100644 arch/sh/include/asm/timex.h
 delete mode 100644 arch/sparc/include/asm/timex_32.h
 delete mode 100644 arch/um/include/asm/timex.h

diff --git a/arch/Kconfig b/arch/Kconfig
index fa7507ac8e13..3d8550b12312 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -363,6 +363,9 @@ config ARCH_HAS_DMA_CLEAR_UNCACHED
 config ARCH_HAS_CPU_FINALIZE_INIT
 	bool
 
+config ARCH_HAS_DELAY_TIMER
+	bool
+
 # The architecture has a per-task state that includes the mm's PASID
 config ARCH_HAS_CPU_PASID
 	bool
diff --git a/arch/alpha/include/asm/timex.h b/arch/alpha/include/asm/timex.h
index f89798da8a14..5a71ba6136b9 100644
--- a/arch/alpha/include/asm/timex.h
+++ b/arch/alpha/include/asm/timex.h
@@ -7,10 +7,6 @@
 #ifndef _ASMALPHA_TIMEX_H
 #define _ASMALPHA_TIMEX_H
 
-/* With only one or two oddballs, we use the RTC as the ticker, selecting
-   the 32.768kHz reference clock, which nicely divides down to our HZ.  */
-#define CLOCK_TICK_RATE	32768
-
 /*
  * Standard way to access the cycle counter.
  * Currently only used on SMP for scheduling.
diff --git a/arch/arc/include/asm/timex.h b/arch/arc/include/asm/timex.h
deleted file mode 100644
index 48b3482bc97f..000000000000
--- a/arch/arc/include/asm/timex.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
- */
-
-#ifndef _ASM_ARC_TIMEX_H
-#define _ASM_ARC_TIMEX_H
-
-#define CLOCK_TICK_RATE	80000000 /* slated to be removed */
-
-#include <asm-generic/timex.h>
-
-/* XXX: get_cycles() to be implemented with RTSC insn */
-
-#endif /* _ASM_ARC_TIMEX_H */
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 9187240a02db..7788949992f4 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -11,6 +11,7 @@ config ARM
 	select ARCH_HAS_CPU_FINALIZE_INIT if MMU
 	select ARCH_HAS_CURRENT_STACK_POINTER
 	select ARCH_HAS_DEBUG_VIRTUAL if MMU
+	select ARCH_HAS_DELAY_TIMER
 	select ARCH_HAS_DMA_ALLOC if MMU
 	select ARCH_HAS_DMA_OPS
 	select ARCH_HAS_DMA_WRITE_COMBINE if !ARM_DMA_MEM_BUFFERABLE
diff --git a/arch/arm/include/asm/delay.h b/arch/arm/include/asm/delay.h
index 1d069e558d8d..d2231deb90fa 100644
--- a/arch/arm/include/asm/delay.h
+++ b/arch/arm/include/asm/delay.h
@@ -91,7 +91,6 @@ extern void __loop_udelay(unsigned long usecs);
 extern void __loop_const_udelay(unsigned long);
 
 /* Delay-loop timer registration. */
-#define ARCH_HAS_READ_CURRENT_TIMER
 extern void register_current_timer_delay(const struct delay_timer *timer);
 
 #endif /* __ASSEMBLY__ */
diff --git a/arch/arm/include/asm/timex.h b/arch/arm/include/asm/timex.h
index 6d1337c169cd..94e40c19cfc5 100644
--- a/arch/arm/include/asm/timex.h
+++ b/arch/arm/include/asm/timex.h
@@ -10,7 +10,10 @@
 #define _ASMARM_TIMEX_H
 
 typedef unsigned long cycles_t;
-#define get_cycles()	({ cycles_t c; read_current_timer(&c) ? 0 : c; })
+// Temporary workaround until timex.h is cleaned up
+bool delay_read_timer(unsigned long *t);
+
+#define get_cycles()	({ cycles_t c; delay_read_timer(&c) ? 0 : c; })
 #define random_get_entropy() (((unsigned long)get_cycles()) ?: random_get_entropy_fallback())
 
 #endif
diff --git a/arch/arm/lib/delay.c b/arch/arm/lib/delay.c
index b7fe84f68bf1..7e9304012a68 100644
--- a/arch/arm/lib/delay.c
+++ b/arch/arm/lib/delay.c
@@ -12,7 +12,6 @@
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/timex.h>
 
 /*
  * Default to the loop-based delay implementation.
@@ -27,15 +26,14 @@ static const struct delay_timer *delay_timer;
 static bool delay_calibrated;
 static u64 delay_res;
 
-int read_current_timer(unsigned long *timer_val)
+bool delay_read_timer(unsigned long *timer_val)
 {
 	if (!delay_timer)
-		return -ENXIO;
-
+		return false;
 	*timer_val = delay_timer->read_current_timer();
-	return 0;
+	return true;
 }
-EXPORT_SYMBOL_GPL(read_current_timer);
+EXPORT_SYMBOL_GPL(delay_read_timer);
 
 static inline u64 cyc_to_ns(u64 cyc, u32 mult, u32 shift)
 {
diff --git a/arch/arm/mach-omap1/Kconfig b/arch/arm/mach-omap1/Kconfig
index b114f7ca2173..2a724aa6674c 100644
--- a/arch/arm/mach-omap1/Kconfig
+++ b/arch/arm/mach-omap1/Kconfig
@@ -74,7 +74,7 @@ config OMAP_32K_TIMER
 	  currently only available for OMAP16XX, 24XX, 34XX, OMAP4/5 and DRA7XX.
 
 	  On OMAP2PLUS this value is only used for CONFIG_HZ and
-	  CLOCK_TICK_RATE compile time calculation.
+	  timer frequency compile time calculation.
 	  The actual timer selection is done in the board file
 	  through the (DT_)MACHINE_START structure.
 
diff --git a/arch/hexagon/Kconfig b/arch/hexagon/Kconfig
index d987ba368ed6..b48491140013 100644
--- a/arch/hexagon/Kconfig
+++ b/arch/hexagon/Kconfig
@@ -5,6 +5,7 @@ comment "Linux Kernel Configuration for Hexagon"
 config HEXAGON
 	def_bool y
 	select ARCH_32BIT_OFF_T
+	select ARCH_HAS_DELAY_TIMER
 	select ARCH_HAS_SYNC_DMA_FOR_DEVICE
 	select ARCH_NO_PREEMPT
 	select ARCH_WANT_FRAME_POINTERS
diff --git a/arch/hexagon/include/asm/timex.h b/arch/hexagon/include/asm/timex.h
deleted file mode 100644
index dfe69e118b2b..000000000000
--- a/arch/hexagon/include/asm/timex.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
- */
-
-#ifndef _ASM_TIMEX_H
-#define _ASM_TIMEX_H
-
-#include <asm-generic/timex.h>
-#include <asm/hexagon_vm.h>
-
-/* Using TCX0 as our clock.  CLOCK_TICK_RATE scheduled to be removed. */
-#define CLOCK_TICK_RATE              19200
-
-#define ARCH_HAS_READ_CURRENT_TIMER
-
-static inline int read_current_timer(unsigned long *timer_val)
-{
-	*timer_val = __vmgettime();
-	return 0;
-}
-
-#endif
diff --git a/arch/hexagon/kernel/time.c b/arch/hexagon/kernel/time.c
index 6f851e1cd4ee..05c5d6c96d96 100644
--- a/arch/hexagon/kernel/time.c
+++ b/arch/hexagon/kernel/time.c
@@ -6,6 +6,7 @@
  */
 
 #include <linux/init.h>
+#include <linux/delay.h>
 #include <linux/clockchips.h>
 #include <linux/clocksource.h>
 #include <linux/interrupt.h>
@@ -17,7 +18,6 @@
 #include <linux/of_irq.h>
 #include <linux/module.h>
 
-#include <asm/delay.h>
 #include <asm/hexagon_vm.h>
 #include <asm/time.h>
 
@@ -231,3 +231,9 @@ void __udelay(unsigned long usecs)
 		cpu_relax(); /*  not sure how this improves readability  */
 }
 EXPORT_SYMBOL(__udelay);
+
+bool delay_read_timer(unsigned long *timer_val)
+{
+	*timer_val = __vmgettime();
+	return true;
+}
diff --git a/arch/m68k/include/asm/timex.h b/arch/m68k/include/asm/timex.h
index f4a7a340f4ca..b58115f3a282 100644
--- a/arch/m68k/include/asm/timex.h
+++ b/arch/m68k/include/asm/timex.h
@@ -7,21 +7,6 @@
 #ifndef _ASMm68K_TIMEX_H
 #define _ASMm68K_TIMEX_H
 
-#ifdef CONFIG_COLDFIRE
-/*
- * CLOCK_TICK_RATE should give the underlying frequency of the tick timer
- * to make ntp work best.  For Coldfires, that's the main clock.
- */
-#include <asm/coldfire.h>
-#define CLOCK_TICK_RATE	MCF_CLK
-#else
-/*
- * This default CLOCK_TICK_RATE is probably wrong for many 68k boards
- * Users of those boards will need to check and modify accordingly
- */
-#define CLOCK_TICK_RATE	1193180 /* Underlying HZ */
-#endif
-
 typedef unsigned long cycles_t;
 
 static inline cycles_t get_cycles(void)
diff --git a/arch/microblaze/include/asm/timex.h b/arch/microblaze/include/asm/timex.h
deleted file mode 100644
index e99cc29cbe57..000000000000
--- a/arch/microblaze/include/asm/timex.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (C) 2006 Atmark Techno, Inc.
- */
-
-#ifndef _ASM_MICROBLAZE_TIMEX_H
-#define _ASM_MICROBLAZE_TIMEX_H
-
-#include <asm-generic/timex.h>
-
-#define CLOCK_TICK_RATE 1000 /* Timer input freq. */
-
-#endif /* _ASM_TIMEX_H */
diff --git a/arch/mips/include/asm/timex.h b/arch/mips/include/asm/timex.h
index 7ef06dcdc46e..daedc62f0fb8 100644
--- a/arch/mips/include/asm/timex.h
+++ b/arch/mips/include/asm/timex.h
@@ -18,14 +18,6 @@
 #include <asm/mipsregs.h>
 #include <asm/cpu-type.h>
 
-/*
- * This is the clock rate of the i8253 PIT.  A MIPS system may not have
- * a PIT by the symbol is used all over the kernel including some APIs.
- * So keeping it defined to the number for the PIT is the only sane thing
- * for now.
- */
-#define CLOCK_TICK_RATE 1193182
-
 /*
  * Standard way to access the cycle counter.
  * Currently only used on SMP for scheduling.
diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig
index 9156635dd264..5eb995c13074 100644
--- a/arch/openrisc/Kconfig
+++ b/arch/openrisc/Kconfig
@@ -7,6 +7,7 @@
 config OPENRISC
 	def_bool y
 	select ARCH_32BIT_OFF_T
+	select ARCH_HAS_DELAY_TIMER
 	select ARCH_HAS_DMA_SET_UNCACHED
 	select ARCH_HAS_DMA_CLEAR_UNCACHED
 	select ARCH_HAS_SYNC_DMA_FOR_DEVICE
diff --git a/arch/openrisc/include/asm/timex.h b/arch/openrisc/include/asm/timex.h
index 5487fa93dd9b..574e80e6d1f3 100644
--- a/arch/openrisc/include/asm/timex.h
+++ b/arch/openrisc/include/asm/timex.h
@@ -25,9 +25,4 @@ static inline cycles_t get_cycles(void)
 }
 #define get_cycles get_cycles
 
-/* This isn't really used any more */
-#define CLOCK_TICK_RATE 1000
-
-#define ARCH_HAS_READ_CURRENT_TIMER
-
 #endif
diff --git a/arch/openrisc/lib/delay.c b/arch/openrisc/lib/delay.c
index 5e89e4131304..661f9f8f6292 100644
--- a/arch/openrisc/lib/delay.c
+++ b/arch/openrisc/lib/delay.c
@@ -13,18 +13,17 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/delay.h>
 #include <linux/export.h>
 #include <linux/init.h>
-#include <linux/timex.h>
+
 #include <asm/param.h>
-#include <asm/delay.h>
-#include <asm/timex.h>
 #include <asm/processor.h>
 
-int read_current_timer(unsigned long *timer_value)
+bool delay_read_timer(unsigned long *timer_value)
 {
 	*timer_value = get_cycles();
-	return 0;
+	return true;
 }
 
 void __delay(unsigned long cycles)
diff --git a/arch/parisc/include/asm/timex.h b/arch/parisc/include/asm/timex.h
index b4622cb06a75..453468ba4e3a 100644
--- a/arch/parisc/include/asm/timex.h
+++ b/arch/parisc/include/asm/timex.h
@@ -9,8 +9,6 @@
 
 #include <asm/special_insns.h>
 
-#define CLOCK_TICK_RATE	1193180 /* Underlying HZ */
-
 typedef unsigned long cycles_t;
 
 static inline cycles_t get_cycles(void)
diff --git a/arch/powerpc/include/asm/timex.h b/arch/powerpc/include/asm/timex.h
index 14b4489de52c..b48b78e47958 100644
--- a/arch/powerpc/include/asm/timex.h
+++ b/arch/powerpc/include/asm/timex.h
@@ -11,8 +11,6 @@
 #include <asm/cputable.h>
 #include <asm/vdso/timebase.h>
 
-#define CLOCK_TICK_RATE	1024000 /* Underlying HZ */
-
 typedef unsigned long cycles_t;
 
 static inline cycles_t get_cycles(void)
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index c0a6992933e4..a0635743cf8f 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -29,6 +29,7 @@ config RISCV
 	select ARCH_HAS_DEBUG_VIRTUAL if MMU
 	select ARCH_HAS_DEBUG_VM_PGTABLE
 	select ARCH_HAS_DEBUG_WX
+	select ARCH_HAS_DELAY_TIMER
 	select ARCH_HAS_ELF_CORE_EFLAGS if BINFMT_ELF && ELF_CORE
 	select ARCH_HAS_FAST_MULTIPLIER
 	select ARCH_HAS_FORTIFY_SOURCE
diff --git a/arch/riscv/include/asm/timex.h b/arch/riscv/include/asm/timex.h
index a06697846e69..76c9417fdba3 100644
--- a/arch/riscv/include/asm/timex.h
+++ b/arch/riscv/include/asm/timex.h
@@ -80,12 +80,4 @@ static inline u64 get_cycles64(void)
 	return ((u64)hi << 32) | lo;
 }
 #endif /* CONFIG_64BIT */
-
-#define ARCH_HAS_READ_CURRENT_TIMER
-static inline int read_current_timer(unsigned long *timer_val)
-{
-	*timer_val = get_cycles();
-	return 0;
-}
-
 #endif /* _ASM_RISCV_TIMEX_H */
diff --git a/arch/riscv/lib/delay.c b/arch/riscv/lib/delay.c
index 49d510ba75fd..bd9b3825656f 100644
--- a/arch/riscv/lib/delay.c
+++ b/arch/riscv/lib/delay.c
@@ -6,7 +6,6 @@
 #include <linux/delay.h>
 #include <linux/math.h>
 #include <linux/param.h>
-#include <linux/timex.h>
 #include <linux/types.h>
 #include <linux/export.h>
 
@@ -109,3 +108,9 @@ void ndelay(unsigned long nsecs)
 	__delay(ncycles >> NDELAY_SHIFT);
 }
 EXPORT_SYMBOL(ndelay);
+
+bool delay_read_timer(unsigned long *timer_val)
+{
+	*timer_val = get_cycles();
+	return true;
+}
diff --git a/arch/s390/include/asm/timex.h b/arch/s390/include/asm/timex.h
index ac3ab6c29912..23421b6eb225 100644
--- a/arch/s390/include/asm/timex.h
+++ b/arch/s390/include/asm/timex.h
@@ -159,8 +159,6 @@ static inline void local_tick_enable(unsigned long comp)
 	set_clock_comparator(get_lowcore()->clock_comparator);
 }
 
-#define CLOCK_TICK_RATE		1193180 /* Underlying HZ */
-
 typedef unsigned long cycles_t;
 
 static __always_inline unsigned long get_tod_clock(void)
diff --git a/arch/sh/include/asm/timex.h b/arch/sh/include/asm/timex.h
deleted file mode 100644
index f53f95bf4288..000000000000
--- a/arch/sh/include/asm/timex.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * linux/include/asm-sh/timex.h
- *
- * sh architecture timex specifications
- */
-#ifndef __ASM_SH_TIMEX_H
-#define __ASM_SH_TIMEX_H
-
-/*
- * Only parts using the legacy CPG code for their clock framework
- * implementation need to define their own Pclk value. If provided, this
- * can be used for accurately setting CLOCK_TICK_RATE, otherwise we
- * simply fall back on the i8253 PIT value.
- */
-#ifdef CONFIG_SH_PCLK_FREQ
-#define CLOCK_TICK_RATE		(CONFIG_SH_PCLK_FREQ / 4) /* Underlying HZ */
-#else
-#define CLOCK_TICK_RATE		1193180
-#endif
-
-#include <asm-generic/timex.h>
-
-#endif /* __ASM_SH_TIMEX_H */
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig
index 0e9c906c4b5d..a979a4be79a9 100644
--- a/arch/sparc/Kconfig
+++ b/arch/sparc/Kconfig
@@ -70,6 +70,7 @@ config SPARC32
 config SPARC64
 	def_bool 64BIT
 	select ALTERNATE_USER_ADDRESS_SPACE
+	select ARCH_HAS_DELAY_TIMER
 	select HAVE_FUNCTION_TRACER
 	select HAVE_FUNCTION_GRAPH_TRACER
 	select HAVE_KRETPROBES
diff --git a/arch/sparc/include/asm/timex.h b/arch/sparc/include/asm/timex.h
index 9aac26b1f45f..f0f980581590 100644
--- a/arch/sparc/include/asm/timex.h
+++ b/arch/sparc/include/asm/timex.h
@@ -4,6 +4,6 @@
 #if defined(__sparc__) && defined(__arch64__)
 #include <asm/timex_64.h>
 #else
-#include <asm/timex_32.h>
+#include <asm-generic/timex.h>
 #endif
 #endif
diff --git a/arch/sparc/include/asm/timex_32.h b/arch/sparc/include/asm/timex_32.h
deleted file mode 100644
index f86326a6f89e..000000000000
--- a/arch/sparc/include/asm/timex_32.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * linux/include/asm/timex.h
- *
- * sparc architecture timex specifications
- */
-#ifndef _ASMsparc_TIMEX_H
-#define _ASMsparc_TIMEX_H
-
-#define CLOCK_TICK_RATE	1193180 /* Underlying HZ */
-
-#include <asm-generic/timex.h>
-
-#endif
diff --git a/arch/sparc/include/asm/timex_64.h b/arch/sparc/include/asm/timex_64.h
index 076c44f6845d..fa004ef3bb9a 100644
--- a/arch/sparc/include/asm/timex_64.h
+++ b/arch/sparc/include/asm/timex_64.h
@@ -9,12 +9,8 @@
 
 #include <asm/timer.h>
 
-#define CLOCK_TICK_RATE	1193180 /* Underlying HZ */
-
 /* Getting on the cycle counter on sparc64. */
 typedef unsigned long cycles_t;
 #define get_cycles()	tick_ops->get_tick()
 
-#define ARCH_HAS_READ_CURRENT_TIMER
-
 #endif
diff --git a/arch/sparc/kernel/time_64.c b/arch/sparc/kernel/time_64.c
index 87b267043ccd..b1c54ab4b15b 100644
--- a/arch/sparc/kernel/time_64.c
+++ b/arch/sparc/kernel/time_64.c
@@ -894,8 +894,8 @@ unsigned long long sched_clock(void)
 	return ((get_tick() * quotient) >> SPARC64_NSEC_PER_CYC_SHIFT) - offset;
 }
 
-int read_current_timer(unsigned long *timer_val)
+bool delay_read_timer(unsigned long *timer_val)
 {
 	*timer_val = get_tick();
-	return 0;
+	return true;
 }
diff --git a/arch/um/include/asm/timex.h b/arch/um/include/asm/timex.h
deleted file mode 100644
index 9f27176adb26..000000000000
--- a/arch/um/include/asm/timex.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef __UM_TIMEX_H
-#define __UM_TIMEX_H
-
-#define CLOCK_TICK_RATE (HZ)
-
-#include <asm-generic/timex.h>
-
-#endif
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index bdad90f210e4..ec9e1d4c85b1 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -80,6 +80,7 @@ config X86
 	select ARCH_HAS_CURRENT_STACK_POINTER
 	select ARCH_HAS_DEBUG_VIRTUAL
 	select ARCH_HAS_DEBUG_VM_PGTABLE	if !X86_PAE
+	select ARCH_HAS_DELAY_TIMER
 	select ARCH_HAS_DEVMEM_IS_ALLOWED
 	select ARCH_HAS_DMA_OPS			if GART_IOMMU || XEN
 	select ARCH_HAS_EARLY_DEBUG		if KGDB
diff --git a/arch/x86/include/asm/timex.h b/arch/x86/include/asm/timex.h
index 6e57e3c0fdd2..f397072cf294 100644
--- a/arch/x86/include/asm/timex.h
+++ b/arch/x86/include/asm/timex.h
@@ -13,9 +13,4 @@ static inline unsigned long random_get_entropy(void)
 }
 #define random_get_entropy random_get_entropy
 
-/* Assume we use the PIT time source for the clock tick */
-#define CLOCK_TICK_RATE		PIT_TICK_RATE
-
-#define ARCH_HAS_READ_CURRENT_TIMER
-
 #endif /* _ASM_X86_TIMEX_H */
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 46882ce79c3a..0e75eb07990b 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -1268,7 +1268,7 @@ void __init setup_arch(char **cmdline_p)
 
 	mcheck_init();
 
-	register_refined_jiffies(CLOCK_TICK_RATE);
+	register_refined_jiffies(PIT_TICK_RATE);
 
 #ifdef CONFIG_EFI
 	if (efi_enabled(EFI_BOOT))
diff --git a/arch/x86/lib/delay.c b/arch/x86/lib/delay.c
index eb2d2e1cbddd..70ad000e91e7 100644
--- a/arch/x86/lib/delay.c
+++ b/arch/x86/lib/delay.c
@@ -14,12 +14,10 @@
 
 #include <linux/export.h>
 #include <linux/sched.h>
-#include <linux/timex.h>
 #include <linux/preempt.h>
 #include <linux/delay.h>
 
 #include <asm/processor.h>
-#include <asm/delay.h>
 #include <asm/timer.h>
 #include <asm/mwait.h>
 
@@ -189,13 +187,13 @@ void use_mwaitx_delay(void)
 	delay_fn = delay_halt;
 }
 
-int read_current_timer(unsigned long *timer_val)
+bool delay_read_timer(unsigned long *timer_val)
 {
 	if (delay_fn == delay_tsc) {
 		*timer_val = rdtsc();
-		return 0;
+		return true;
 	}
-	return -1;
+	return false;
 }
 
 void __delay(unsigned long loops)
diff --git a/include/asm-generic/timex.h b/include/asm-generic/timex.h
index 50ba9b5ce983..2032fda7052c 100644
--- a/include/asm-generic/timex.h
+++ b/include/asm-generic/timex.h
@@ -13,11 +13,4 @@ static inline cycles_t get_cycles(void)
 }
 #endif
 
-/*
- * Architectures are encouraged to implement read_current_timer
- * and define this in order to avoid the expensive delay loop
- * calibration during boot.
- */
-#undef ARCH_HAS_READ_CURRENT_TIMER
-
 #endif /* __ASM_GENERIC_TIMEX_H */
diff --git a/include/linux/delay.h b/include/linux/delay.h
index 68b2a69dd24d..82409e55b6ae 100644
--- a/include/linux/delay.h
+++ b/include/linux/delay.h
@@ -17,6 +17,8 @@ extern unsigned long loops_per_jiffy;
 
 #include <asm/delay.h>
 
+bool delay_read_timer(unsigned long *t);
+
 /*
  * Using udelay() for intervals greater than a few milliseconds can
  * risk overflow for high loops_per_jiffy (high bogomips) machines. The
diff --git a/include/linux/timex.h b/include/linux/timex.h
index 4ee32eff3f22..7014ccc638fc 100644
--- a/include/linux/timex.h
+++ b/include/linux/timex.h
@@ -156,8 +156,6 @@ extern int do_clock_adjtime(const clockid_t which_clock, struct __kernel_timex *
 
 extern void hardpps(const struct timespec64 *, const struct timespec64 *);
 
-int read_current_timer(unsigned long *timer_val);
-
 /* The clock frequency of the i8253/i8254 PIT */
 #define PIT_TICK_RATE 1193182ul
 
diff --git a/init/calibrate.c b/init/calibrate.c
index 63be4c65bc52..2bfe97034e42 100644
--- a/init/calibrate.c
+++ b/init/calibrate.c
@@ -13,7 +13,6 @@
 #include <linux/printk.h>
 #include <linux/smp.h>
 #include <linux/stddef.h>
-#include <linux/timex.h>
 
 unsigned long lpj_fine;
 unsigned long preset_lpj;
@@ -25,9 +24,9 @@ static int __init lpj_setup(char *str)
 
 __setup("lpj=", lpj_setup);
 
-#ifdef ARCH_HAS_READ_CURRENT_TIMER
+#ifdef CONFIG_ARCH_HAS_DELAY_TIMER
 
-/* This routine uses the read_current_timer() routine and gets the
+/* This routine uses the delay_read_timer() routine and gets the
  * loops per jiffy directly, instead of guessing it using delay().
  * Also, this code tries to handle non-maskable asynchronous events
  * (like SMIs)
@@ -48,13 +47,13 @@ static unsigned long calibrate_delay_direct(void)
 	int min = -1;
 	int i;
 
-	if (read_current_timer(&pre_start) < 0 )
+	if (!delay_read_timer(&pre_start))
 		return 0;
 
 	/*
 	 * A simple loop like
 	 *	while ( jiffies < start_jiffies+1)
-	 *		start = read_current_timer();
+	 *		start = delay_read_timer();
 	 * will not do. As we don't really know whether jiffy switch
 	 * happened first or timer_value was read first. And some asynchronous
 	 * event can happen between these two events introducing errors in lpj.
@@ -72,22 +71,22 @@ static unsigned long calibrate_delay_direct(void)
 
 	for (i = 0; i < MAX_DIRECT_CALIBRATION_RETRIES; i++) {
 		pre_start = 0;
-		read_current_timer(&start);
+		delay_read_timer(&start);
 		start_jiffies = jiffies;
 		while (time_before_eq(jiffies, start_jiffies + 1)) {
 			pre_start = start;
-			read_current_timer(&start);
+			delay_read_timer(&start);
 		}
-		read_current_timer(&post_start);
+		delay_read_timer(&post_start);
 
 		pre_end = 0;
 		end = post_start;
 		while (time_before_eq(jiffies, start_jiffies + 1 +
 					       DELAY_CALIBRATION_TICKS)) {
 			pre_end = end;
-			read_current_timer(&end);
+			delay_read_timer(&end);
 		}
-		read_current_timer(&post_end);
+		delay_read_timer(&post_end);
 
 		timer_rate_max = (post_end - pre_start) /
 					DELAY_CALIBRATION_TICKS;
Re: [GIT pull] timers/cleanups for v7.3-rc1
Posted by Nathan Chancellor 1 month, 1 week ago
Hi Thomas,

On Mon, Aug 17, 2026 at 01:23:52PM +0200, Thomas Gleixner wrote:
>       calibrate: Rework delay timer calibration
...
> diff --git a/arch/arm/include/asm/timex.h b/arch/arm/include/asm/timex.h
> index 6d1337c169cd..94e40c19cfc5 100644
> --- a/arch/arm/include/asm/timex.h
> +++ b/arch/arm/include/asm/timex.h
> @@ -10,7 +10,10 @@
>  #define _ASMARM_TIMEX_H
>  
>  typedef unsigned long cycles_t;
> -#define get_cycles()	({ cycles_t c; read_current_timer(&c) ? 0 : c; })
> +// Temporary workaround until timex.h is cleaned up
> +bool delay_read_timer(unsigned long *t);
> +
> +#define get_cycles()	({ cycles_t c; delay_read_timer(&c) ? 0 : c; })
>  #define random_get_entropy() (((unsigned long)get_cycles()) ?: random_get_entropy_fallback())
>  
>  #endif
> diff --git a/arch/arm/lib/delay.c b/arch/arm/lib/delay.c
> index b7fe84f68bf1..7e9304012a68 100644
> --- a/arch/arm/lib/delay.c
> +++ b/arch/arm/lib/delay.c
> @@ -12,7 +12,6 @@
>  #include <linux/init.h>
>  #include <linux/kernel.h>
>  #include <linux/module.h>
> -#include <linux/timex.h>
>  
>  /*
>   * Default to the loop-based delay implementation.
> @@ -27,15 +26,14 @@ static const struct delay_timer *delay_timer;
>  static bool delay_calibrated;
>  static u64 delay_res;
>  
> -int read_current_timer(unsigned long *timer_val)
> +bool delay_read_timer(unsigned long *timer_val)
>  {
>  	if (!delay_timer)
> -		return -ENXIO;
> -
> +		return false;
>  	*timer_val = delay_timer->read_current_timer();
> -	return 0;
> +	return true;
>  }
> -EXPORT_SYMBOL_GPL(read_current_timer);
> +EXPORT_SYMBOL_GPL(delay_read_timer);
>  
>  static inline u64 cyc_to_ns(u64 cyc, u32 mult, u32 shift)
>  {

I bisected a hang that I see after getting to userspace when virtually
testing some ARM configurations to commit dfc256dac54c ("calibrate:
Rework delay timer calibration"). It looks like the branches in
get_cycles() were not updated for the changed meaning of the return of
delay_read_timer()? This appears to resolve it for me but I am not sure
if I am missing something.

diff --git a/arch/arm/include/asm/timex.h b/arch/arm/include/asm/timex.h
index 94e40c19cfc5..4d31eab9dba2 100644
--- a/arch/arm/include/asm/timex.h
+++ b/arch/arm/include/asm/timex.h
@@ -13,7 +13,7 @@ typedef unsigned long cycles_t;
 // Temporary workaround until timex.h is cleaned up
 bool delay_read_timer(unsigned long *t);
 
-#define get_cycles()	({ cycles_t c; delay_read_timer(&c) ? 0 : c; })
+#define get_cycles()	({ cycles_t c; delay_read_timer(&c) ? c : 0; })
 #define random_get_entropy() (((unsigned long)get_cycles()) ?: random_get_entropy_fallback())
 
 #endif
--

# bad: [f4cdf7ca9a1fdcca413157df19753f388a5a224e] Merge tag 'media/v7.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
# good: [8d3ae59288f1e7d58d76558a6ee96d533bc5019f] Linux 7.2
git bisect start 'f4cdf7ca9a1fdcca413157df19753f388a5a224e' 'v7.2'
# bad: [cbe8aadf1551f3f4a853f24b3b96d9f0eea49c53] Merge tag 'soc-dt-7.3' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
git bisect bad cbe8aadf1551f3f4a853f24b3b96d9f0eea49c53
# good: [762fffa407d8d24288513538cf5d17c2c5425258] Merge tag 'irq-core-2026-08-17' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
git bisect good 762fffa407d8d24288513538cf5d17c2c5425258
# good: [0b02b8f941911895775b56c428e01b117ce9d2f3] Merge tag 'spacemit-dt-for-7.3-1' of https://git.kernel.org/pub/scm/linux/kernel/git/spacemit/linux into soc/dt
git bisect good 0b02b8f941911895775b56c428e01b117ce9d2f3
# good: [f809cedd3f614e4596aae23756ed44085fee1691] Merge tag 'qcom-arm32-for-7.3' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux into soc/dt
git bisect good f809cedd3f614e4596aae23756ed44085fee1691
# bad: [3b4128b9f374b4219eb716f4ad8a307bc7eb3d84] Merge tag 'timers-core-2026-08-17' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
git bisect bad 3b4128b9f374b4219eb716f4ad8a307bc7eb3d84
# bad: [030c9f813b8e48d2b066983c94cf6294968f9496] Merge tag 'timers-cleanups-2026-08-17' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
git bisect bad 030c9f813b8e48d2b066983c94cf6294968f9496
# good: [8b5d31123f41957fe265deeb03ee87fe62f155a8] Merge tag 'irq-drivers-2026-08-17' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
git bisect good 8b5d31123f41957fe265deeb03ee87fe62f155a8
# good: [6c4a1b972643d72bd26f674677df8b5a6a3fe94f] selftests/futex: Provide thread creation and synchronization helpers
git bisect good 6c4a1b972643d72bd26f674677df8b5a6a3fe94f
# good: [66344732b058e75f7ef25dcd0fbb483f9c000633] smp: Remove preempt_disable() from smp_call_function()
git bisect good 66344732b058e75f7ef25dcd0fbb483f9c000633
# good: [0dd1a54f44348d9cf6bae57a2b5cb0b53826a2c7] Merge tag 'smp-core-2026-08-17' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
git bisect good 0dd1a54f44348d9cf6bae57a2b5cb0b53826a2c7
# good: [3ed403bbc967a3138b8e37566510e9b062751372] treewide: Remove CLOCK_TICK_RATE
git bisect good 3ed403bbc967a3138b8e37566510e9b062751372
# bad: [dfc256dac54c8b692110bf905c64cb130e15963d] calibrate: Rework delay timer calibration
git bisect bad dfc256dac54c8b692110bf905c64cb130e15963d
# first 'bad' commit: [dfc256dac54c8b692110bf905c64cb130e15963d] calibrate: Rework delay timer calibration

-- 
Cheers,
Nathan
Re: [GIT pull] timers/cleanups for v7.3-rc1
Posted by Thomas Gleixner 1 month, 1 week ago
On Wed, Aug 19 2026 at 11:48, Nathan Chancellor wrote:
>> -int read_current_timer(unsigned long *timer_val)
>> +bool delay_read_timer(unsigned long *timer_val)
>>  {
>>  	if (!delay_timer)
>> -		return -ENXIO;
>> -
>> +		return false;
>>  	*timer_val = delay_timer->read_current_timer();
>> -	return 0;
>> +	return true;
>>  }
>> -EXPORT_SYMBOL_GPL(read_current_timer);
>> +EXPORT_SYMBOL_GPL(delay_read_timer);
>>  
>>  static inline u64 cyc_to_ns(u64 cyc, u32 mult, u32 shift)
>>  {
>
> I bisected a hang that I see after getting to userspace when virtually
> testing some ARM configurations to commit dfc256dac54c ("calibrate:
> Rework delay timer calibration"). It looks like the branches in
> get_cycles() were not updated for the changed meaning of the return of
> delay_read_timer()? This appears to resolve it for me but I am not sure
> if I am missing something.
>
> diff --git a/arch/arm/include/asm/timex.h b/arch/arm/include/asm/timex.h
> index 94e40c19cfc5..4d31eab9dba2 100644
> --- a/arch/arm/include/asm/timex.h
> +++ b/arch/arm/include/asm/timex.h
> @@ -13,7 +13,7 @@ typedef unsigned long cycles_t;
>  // Temporary workaround until timex.h is cleaned up
>  bool delay_read_timer(unsigned long *t);
>  
> -#define get_cycles()	({ cycles_t c; delay_read_timer(&c) ? 0 : c; })
> +#define get_cycles()	({ cycles_t c; delay_read_timer(&c) ? c : 0; })

Duh, yes. Stupid me.

Can you please send a patch wuth a proper change log and a Fixes tag?

Thanks,

        tglx
Re: [GIT pull] timers/cleanups for v7.3-rc1
Posted by Nathan Chancellor 1 month, 1 week ago
On Wed, Aug 19, 2026 at 10:59:36PM +0200, Thomas Gleixner wrote:
> Duh, yes. Stupid me.

It happens :)

> Can you please send a patch wuth a proper change log and a Fixes tag?

Done, let me know if there are any problems:

  https://lore.kernel.org/20260819-fix-arm-get_cycles-v1-1-208bf07ac540@kernel.org/

-- 
Cheers,
Nathan
Re: [GIT pull] timers/cleanups for v7.3-rc1
Posted by Ingo Molnar 1 month ago
* Nathan Chancellor <nathan@kernel.org> wrote:

> On Wed, Aug 19, 2026 at 10:59:36PM +0200, Thomas Gleixner wrote:
> > Duh, yes. Stupid me.
> 
> It happens :)
> 
> > Can you please send a patch wuth a proper change log and a Fixes tag?
> 
> Done, let me know if there are any problems:
> 
>   https://lore.kernel.org/20260819-fix-arm-get_cycles-v1-1-208bf07ac540@kernel.org/

JFYI, this fix is now upstream.

Thanks,

	Ingo
Re: [GIT pull] timers/cleanups for v7.3-rc1
Posted by pr-tracker-bot@kernel.org 1 month, 1 week ago
The pull request you sent on Mon, 17 Aug 2026 13:23:52 +0200:

> git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers-cleanups-2026-08-17

has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/030c9f813b8e48d2b066983c94cf6294968f9496

Thank you!

-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/prtracker.html