Messages in this thread Patch in this message | | | Date | Fri, 21 May 2010 10:15:53 +0800 | From | Feng Tang <> | Subject | [PATCH 1/3] timekeeping: moving xtime's init to a later time |
| |
From 2451f205e29be57b30f0c50759c1b05a67bb97d1 Mon Sep 17 00:00:00 2001 From: Feng Tang <feng.tang@intel.com> Date: Wed, 19 May 2010 16:57:20 +0800 Subject: [PATCH 1/3] timekeeping: moving xtime's init to a later time
xtime doesn't need to be inited early, move it to a subsys_initcall, as most of its consumers come from userspace. It will also give enough time for some MMIO based wallclock devices to init
Cc: Thomas Gleixner <tglx@linutronix.de> Cc: John Stultz <johnstul@us.ibm.com> Signed-off-by: Feng Tang <feng.tang@intel.com> --- kernel/time/timekeeping.c | 28 +++++++++++++++++++++------- 1 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 39f6177..7bc32de 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -529,26 +529,37 @@ void __attribute__((weak)) read_boot_clock(struct timespec *ts) } /* - * timekeeping_init - Initializes the clocksource and common timekeeping values + * timekeeping_init - Initializes the clocksource */ void __init timekeeping_init(void) { struct clocksource *clock; unsigned long flags; - struct timespec now, boot; - - read_persistent_clock(&now); - read_boot_clock(&boot); write_seqlock_irqsave(&xtime_lock, flags); - ntp_init(); - clock = clocksource_default_clock(); if (clock->enable) clock->enable(clock); timekeeper_setup_internals(clock); + ntp_init(); + write_sequnlock_irqrestore(&xtime_lock, flags); +} + +/* + * timekeeping_late_init - Initaizes the common timekeeping values + */ +static int __init timekeeping_late_init(void) +{ + unsigned long flags; + struct timespec now, boot; + + read_persistent_clock(&now); + read_boot_clock(&boot); + + write_seqlock_irqsave(&xtime_lock, flags); + xtime.tv_sec = now.tv_sec; xtime.tv_nsec = now.tv_nsec; raw_time.tv_sec = 0; @@ -563,7 +574,10 @@ void __init timekeeping_init(void) total_sleep_time.tv_sec = 0; total_sleep_time.tv_nsec = 0; write_sequnlock_irqrestore(&xtime_lock, flags); + + return 0; } +subsys_initcall(timekeeping_late_init); /* time in seconds when suspend began */ static struct timespec timekeeping_suspend_time; -- 1.6.3.3
| |