|
@@ -121,6 +121,7 @@ static struct clocksource *curr_clocksource;
|
|
|
static LIST_HEAD(clocksource_list);
|
|
|
static DEFINE_MUTEX(clocksource_mutex);
|
|
|
static char override_name[32];
|
|
|
+static int finished_booting;
|
|
|
|
|
|
#ifdef CONFIG_CLOCKSOURCE_WATCHDOG
|
|
|
static void clocksource_watchdog_work(struct work_struct *work);
|
|
@@ -155,7 +156,8 @@ static void __clocksource_unstable(struct clocksource *cs)
|
|
|
{
|
|
|
cs->flags &= ~(CLOCK_SOURCE_VALID_FOR_HRES | CLOCK_SOURCE_WATCHDOG);
|
|
|
cs->flags |= CLOCK_SOURCE_UNSTABLE;
|
|
|
- schedule_work(&watchdog_work);
|
|
|
+ if (finished_booting)
|
|
|
+ schedule_work(&watchdog_work);
|
|
|
}
|
|
|
|
|
|
static void clocksource_unstable(struct clocksource *cs, int64_t delta)
|
|
@@ -207,7 +209,8 @@ static void clocksource_watchdog(unsigned long data)
|
|
|
|
|
|
/* Clocksource already marked unstable? */
|
|
|
if (cs->flags & CLOCK_SOURCE_UNSTABLE) {
|
|
|
- schedule_work(&watchdog_work);
|
|
|
+ if (finished_booting)
|
|
|
+ schedule_work(&watchdog_work);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
@@ -380,6 +383,7 @@ static void clocksource_enqueue_watchdog(struct clocksource *cs)
|
|
|
|
|
|
static inline void clocksource_dequeue_watchdog(struct clocksource *cs) { }
|
|
|
static inline void clocksource_resume_watchdog(void) { }
|
|
|
+static inline int clocksource_watchdog_kthread(void *data) { return 0; }
|
|
|
|
|
|
#endif /* CONFIG_CLOCKSOURCE_WATCHDOG */
|
|
|
|
|
@@ -415,8 +419,6 @@ void clocksource_touch_watchdog(void)
|
|
|
|
|
|
#ifdef CONFIG_GENERIC_TIME
|
|
|
|
|
|
-static int finished_booting;
|
|
|
-
|
|
|
/**
|
|
|
* clocksource_select - Select the best clocksource available
|
|
|
*
|
|
@@ -461,6 +463,12 @@ static void clocksource_select(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#else /* CONFIG_GENERIC_TIME */
|
|
|
+
|
|
|
+static inline void clocksource_select(void) { }
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
/*
|
|
|
* clocksource_done_booting - Called near the end of core bootup
|
|
|
*
|
|
@@ -471,6 +479,12 @@ static void clocksource_select(void)
|
|
|
static int __init clocksource_done_booting(void)
|
|
|
{
|
|
|
finished_booting = 1;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Run the watchdog first to eliminate unstable clock sources
|
|
|
+ */
|
|
|
+ clocksource_watchdog_kthread(NULL);
|
|
|
+
|
|
|
mutex_lock(&clocksource_mutex);
|
|
|
clocksource_select();
|
|
|
mutex_unlock(&clocksource_mutex);
|
|
@@ -478,12 +492,6 @@ static int __init clocksource_done_booting(void)
|
|
|
}
|
|
|
fs_initcall(clocksource_done_booting);
|
|
|
|
|
|
-#else /* CONFIG_GENERIC_TIME */
|
|
|
-
|
|
|
-static inline void clocksource_select(void) { }
|
|
|
-
|
|
|
-#endif
|
|
|
-
|
|
|
/*
|
|
|
* Enqueue the clocksource sorted by rating
|
|
|
*/
|