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: Lofstedt, Marta <marta.lofstedt@intel.com> Signed-off-by: Peter 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: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
f9fccdb9ef
commit
2e44b7ddf8
|
@ -23,10 +23,6 @@ extern u64 sched_clock_cpu(int cpu);
|
|||
extern void sched_clock_init(void);
|
||||
|
||||
#ifndef CONFIG_HAVE_UNSTABLE_SCHED_CLOCK
|
||||
static inline void sched_clock_init_late(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void sched_clock_tick(void)
|
||||
{
|
||||
}
|
||||
|
@ -53,7 +49,6 @@ static inline u64 local_clock(void)
|
|||
return sched_clock();
|
||||
}
|
||||
#else
|
||||
extern void sched_clock_init_late(void);
|
||||
extern int sched_clock_stable(void);
|
||||
extern void clear_sched_clock_stable(void);
|
||||
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
#include <linux/workqueue.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/tick.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
/*
|
||||
* Scheduler clock - returns current time in nanosec units.
|
||||
|
@ -202,7 +203,11 @@ void clear_sched_clock_stable(void)
|
|||
__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;
|
||||
/*
|
||||
|
@ -216,7 +221,10 @@ void sched_clock_init_late(void)
|
|||
|
||||
if (__sched_clock_stable_early)
|
||||
__set_sched_clock_stable();
|
||||
|
||||
return 0;
|
||||
}
|
||||
late_initcall(sched_clock_init_late);
|
||||
|
||||
/*
|
||||
* min, max except they take wrapping into account
|
||||
|
|
|
@ -5984,7 +5984,6 @@ void __init sched_init_smp(void)
|
|||
init_sched_dl_class();
|
||||
|
||||
sched_init_smt();
|
||||
sched_clock_init_late();
|
||||
|
||||
sched_smp_initialized = true;
|
||||
}
|
||||
|
@ -6000,7 +5999,6 @@ early_initcall(migration_init);
|
|||
void __init sched_init_smp(void)
|
||||
{
|
||||
sched_init_granularity();
|
||||
sched_clock_init_late();
|
||||
}
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
|
|
Loading…
Reference in New Issue