Commit 2e44b7dd authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar

sched/clock: Use late_initcall() instead of sched_init_smp()

Core2 marks its TSC unstable in ACPI Processor Idle, which is probed
after sched_init_smp(). Luckily it appears both acpi_processor and
intel_idle (which has a similar check) are mandatory built-in.

This means we can delay switching to stable until after these drivers
have ran (if they were modules, this would be impossible).

Delay the stable switch to late_initcall() to allow these drivers to
mark TSC unstable and avoid difficult stable->unstable transitions.
Reported-by: default avatarLofstedt, Marta <marta.lofstedt@intel.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rafael J . Wysocki <rafael.j.wysocki@intel.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-kernel@vger.kernel.org
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent f9fccdb9
...@@ -23,10 +23,6 @@ extern u64 sched_clock_cpu(int cpu); ...@@ -23,10 +23,6 @@ extern u64 sched_clock_cpu(int cpu);
extern void sched_clock_init(void); extern void sched_clock_init(void);
#ifndef CONFIG_HAVE_UNSTABLE_SCHED_CLOCK #ifndef CONFIG_HAVE_UNSTABLE_SCHED_CLOCK
static inline void sched_clock_init_late(void)
{
}
static inline void sched_clock_tick(void) static inline void sched_clock_tick(void)
{ {
} }
...@@ -53,7 +49,6 @@ static inline u64 local_clock(void) ...@@ -53,7 +49,6 @@ static inline u64 local_clock(void)
return sched_clock(); return sched_clock();
} }
#else #else
extern void sched_clock_init_late(void);
extern int sched_clock_stable(void); extern int sched_clock_stable(void);
extern void clear_sched_clock_stable(void); extern void clear_sched_clock_stable(void);
......
...@@ -64,6 +64,7 @@ ...@@ -64,6 +64,7 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/tick.h> #include <linux/tick.h>
#include <linux/init.h>
/* /*
* Scheduler clock - returns current time in nanosec units. * Scheduler clock - returns current time in nanosec units.
...@@ -202,7 +203,11 @@ void clear_sched_clock_stable(void) ...@@ -202,7 +203,11 @@ void clear_sched_clock_stable(void)
__clear_sched_clock_stable(); __clear_sched_clock_stable();
} }
void sched_clock_init_late(void) /*
* We run this as late_initcall() such that it runs after all built-in drivers,
* notably: acpi_processor and intel_idle, which can mark the TSC as unstable.
*/
static int __init sched_clock_init_late(void)
{ {
sched_clock_running = 2; sched_clock_running = 2;
/* /*
...@@ -216,7 +221,10 @@ void sched_clock_init_late(void) ...@@ -216,7 +221,10 @@ void sched_clock_init_late(void)
if (__sched_clock_stable_early) if (__sched_clock_stable_early)
__set_sched_clock_stable(); __set_sched_clock_stable();
return 0;
} }
late_initcall(sched_clock_init_late);
/* /*
* min, max except they take wrapping into account * min, max except they take wrapping into account
......
...@@ -5984,7 +5984,6 @@ void __init sched_init_smp(void) ...@@ -5984,7 +5984,6 @@ void __init sched_init_smp(void)
init_sched_dl_class(); init_sched_dl_class();
sched_init_smt(); sched_init_smt();
sched_clock_init_late();
sched_smp_initialized = true; sched_smp_initialized = true;
} }
...@@ -6000,7 +5999,6 @@ early_initcall(migration_init); ...@@ -6000,7 +5999,6 @@ early_initcall(migration_init);
void __init sched_init_smp(void) void __init sched_init_smp(void)
{ {
sched_init_granularity(); sched_init_granularity();
sched_clock_init_late();
} }
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment