timekeeping: add CONFIG_LEGACY_TIMER_TICK
authorArnd Bergmann <arnd@arndb.de>
Thu, 24 Sep 2020 13:21:43 +0000 (15:21 +0200)
committerArnd Bergmann <arnd@arndb.de>
Fri, 30 Oct 2020 20:57:04 +0000 (21:57 +0100)
All platforms that currently do not use generic clockevents roughly call
the same set of functions in their timer interrupts: xtime_update(),
update_process_times() and profile_tick(), sometimes in a different
sequence.

Add a helper function that performs all three of them, to make the
callers more uniform and simplify the interface.

Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
include/linux/timekeeping.h
kernel/time/Kconfig
kernel/time/Makefile
kernel/time/tick-legacy.c [new file with mode: 0644]

index 7f7e4a3f4394a201231cc643ec77a220ba6720d3..3670cb1670ffec559e217c79849dc5c2bf5e9ae3 100644 (file)
@@ -12,6 +12,7 @@ extern int timekeeping_suspended;
 /* Architecture timer tick functions: */
 extern void update_process_times(int user);
 extern void xtime_update(unsigned long ticks);
+extern void legacy_timer_tick(unsigned long ticks);
 
 /*
  * Get and set timeofday
index 51d298ccbe05be776e1b5f2b8341e73a1d8b7bd7..c6867f29d279b55080c7272c87334d3a2c7ae813 100644 (file)
@@ -57,6 +57,13 @@ config POSIX_CPU_TIMERS_TASK_WORK
        bool
        default y if POSIX_TIMERS && HAVE_POSIX_CPU_TIMERS_TASK_WORK
 
+config LEGACY_TIMER_TICK
+       bool
+       help
+         The legacy timer tick helper is used by platforms that
+         lack support for the generic clockevent framework.
+         New platforms should use generic clockevents instead.
+
 if GENERIC_CLOCKEVENTS
 menu "Timers subsystem"
 
index c8f00168afe843f8041ddddf94ccb23c77a2a690..1fb1c1ef6a19b86a0fb0dadfa5b65291c072372c 100644 (file)
@@ -16,6 +16,7 @@ ifeq ($(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST),y)
 endif
 obj-$(CONFIG_GENERIC_SCHED_CLOCK)              += sched_clock.o
 obj-$(CONFIG_TICK_ONESHOT)                     += tick-oneshot.o tick-sched.o
+obj-$(CONFIG_LEGACY_TIMER_TICK)                        += tick-legacy.o
 obj-$(CONFIG_HAVE_GENERIC_VDSO)                        += vsyscall.o
 obj-$(CONFIG_DEBUG_FS)                         += timekeeping_debug.o
 obj-$(CONFIG_TEST_UDELAY)                      += test_udelay.o
diff --git a/kernel/time/tick-legacy.c b/kernel/time/tick-legacy.c
new file mode 100644 (file)
index 0000000..73c5a0a
--- /dev/null
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Timer tick function for architectures that lack generic clockevents,
+ * consolidated here from m68k/ia64/parisc/arm.
+ */
+
+#include <linux/irq.h>
+#include <linux/profile.h>
+#include <linux/timekeeper_internal.h>
+
+#include "tick-internal.h"
+
+void legacy_timer_tick(unsigned long ticks)
+{
+       if (ticks)
+               xtime_update(ticks);
+       update_process_times(user_mode(get_irq_regs()));
+       profile_tick(CPU_PROFILING);
+}