diff options
author | john stultz <johnstul@us.ibm.com> | 2007-03-05 03:30:50 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-03-05 10:57:53 -0500 |
commit | 6bb74df481223731af6c7e0ff3adb31f6442cfcd (patch) | |
tree | 2aa0b0cfa55cb4b9a9236bd94b723d83eb0bdaa8 /kernel/time/clocksource.c | |
parent | 4540768011352d38afb89d400eacb3e261507b70 (diff) |
[PATCH] clocksource init adjustments (fix bug #7426)
This patch resolves the issue found here:
http://bugme.osdl.org/show_bug.cgi?id=7426
The basic summary is:
Currently we register most of i386/x86_64 clocksources at module_init
time. Then we enable clocksource selection at late_initcall time. This
causes some problems for drivers that use gettimeofday for init
calibration routines (specifically the es1968 driver in this case),
where durring module_init, the only clocksource available is the low-res
jiffies clocksource. This may cause slight calibration errors, due to
the small sampling time used.
It should be noted that drivers that require fine grained time may not
function on architectures that do not have better then jiffies
resolution timekeeping (there are a few). However, this does not
discount the reasonable need for such fine-grained timekeeping at init
time.
Thus the solution here is to register clocksources earlier (ideally when
the hardware is being initialized), and then we enable clocksource
selection at fs_initcall (before device_initcall).
This patch should probably get some testing time in -mm, since
clocksource selection is one of the most important issues for correct
timekeeping, and I've only been able to test this on a few of my own
boxes.
Signed-off-by: John Stultz <johnstul@us.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: "David S. Miller" <davem@davemloft.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/time/clocksource.c')
-rw-r--r-- | kernel/time/clocksource.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index 193a0793af95..5b0e46b56fd0 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c | |||
@@ -55,16 +55,18 @@ static DEFINE_SPINLOCK(clocksource_lock); | |||
55 | static char override_name[32]; | 55 | static char override_name[32]; |
56 | static int finished_booting; | 56 | static int finished_booting; |
57 | 57 | ||
58 | /* clocksource_done_booting - Called near the end of bootup | 58 | /* clocksource_done_booting - Called near the end of core bootup |
59 | * | 59 | * |
60 | * Hack to avoid lots of clocksource churn at boot time | 60 | * Hack to avoid lots of clocksource churn at boot time. |
61 | * We use fs_initcall because we want this to start before | ||
62 | * device_initcall but after subsys_initcall. | ||
61 | */ | 63 | */ |
62 | static int __init clocksource_done_booting(void) | 64 | static int __init clocksource_done_booting(void) |
63 | { | 65 | { |
64 | finished_booting = 1; | 66 | finished_booting = 1; |
65 | return 0; | 67 | return 0; |
66 | } | 68 | } |
67 | late_initcall(clocksource_done_booting); | 69 | fs_initcall(clocksource_done_booting); |
68 | 70 | ||
69 | #ifdef CONFIG_CLOCKSOURCE_WATCHDOG | 71 | #ifdef CONFIG_CLOCKSOURCE_WATCHDOG |
70 | static LIST_HEAD(watchdog_list); | 72 | static LIST_HEAD(watchdog_list); |