The latency tracer can call clocksource_read very early in bootup and
before the clock source variable has been initialized. This results in a
crash at boot up (even before earlyprintk is initialized). Since the
clock->read variable points to NULL.
This patch simply initializes the clock to use clocksource_jiffies, so
that any early user of clocksource_read will not crash.
Signed-off-by: Steven Rostedt <[email protected]>
Acked-by: John Stultz <[email protected]>
---
include/linux/clocksource.h | 3 +++
kernel/time/timekeeping.c | 9 +++++++--
2 files changed, 10 insertions(+), 2 deletions(-)
Index: linux-mcount.git/include/linux/clocksource.h
===================================================================
--- linux-mcount.git.orig/include/linux/clocksource.h 2008-01-23 10:26:57.000000000 -0500
+++ linux-mcount.git/include/linux/clocksource.h 2008-01-23 10:27:04.000000000 -0500
@@ -273,6 +273,9 @@ extern struct clocksource* clocksource_g
extern void clocksource_change_rating(struct clocksource *cs, int rating);
extern void clocksource_resume(void);
+/* used to initialize clock */
+extern struct clocksource clocksource_jiffies;
+
#ifdef CONFIG_GENERIC_TIME_VSYSCALL
extern void update_vsyscall(struct timespec *ts, struct clocksource *c);
extern void update_vsyscall_tz(void);
Index: linux-mcount.git/kernel/time/timekeeping.c
===================================================================
--- linux-mcount.git.orig/kernel/time/timekeeping.c 2008-01-23 10:26:57.000000000 -0500
+++ linux-mcount.git/kernel/time/timekeeping.c 2008-01-23 10:27:04.000000000 -0500
@@ -53,8 +53,13 @@ static inline void update_xtime_cache(u6
timespec_add_ns(&xtime_cache, nsec);
}
-static struct clocksource *clock; /* pointer to current clocksource */
-
+/*
+ * pointer to current clocksource
+ * Just in case we use clocksource_read before we initialize
+ * the actual clock source. Instead of calling a NULL read pointer
+ * we return jiffies.
+ */
+static struct clocksource *clock = &clocksource_jiffies;
#ifdef CONFIG_GENERIC_TIME
/**
--
Steven Rostedt wrote:
> The latency tracer can call clocksource_read very early in bootup and
> before the clock source variable has been initialized. This results in a
> crash at boot up (even before earlyprintk is initialized). Since the
> clock->read variable points to NULL.
>
> This patch simply initializes the clock to use clocksource_jiffies, so
> that any early user of clocksource_read will not crash.
There's a similar problem with reads of sched_clock() too early
on some architectures. This problem reminds me of a fix I need
to re-send to the ARM mailing list. That aside, I heartily recommend
applying this patch, whether the rest of this system gets mainlined
or not.
FWIW:
Acked-by: Tim Bird <[email protected]>
-- Tim
=============================
Tim Bird
Architecture Group Chair, CE Linux Forum
Senior Staff Engineer, Sony Corporation of America
=============================