aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/cpu/common.c
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2017-01-19 08:36:33 -0500
committerIngo Molnar <mingo@kernel.org>2017-01-19 20:38:46 -0500
commitacb04058de49458010c44bb35b849d45113fd668 (patch)
tree6011ca77b47f21fcd5e65e5a2f02dddadd3f950c /arch/x86/kernel/cpu/common.c
parent02cfdc95a0104fa5812d855d1e4ec687312aaa6f (diff)
sched/clock: Fix hotplug crash
Mike reported that he could trigger the WARN_ON_ONCE() in set_sched_clock_stable() using hotplug. This exposed a fundamental problem with the interface, we should never mark the TSC stable if we ever find it to be unstable. Therefore set_sched_clock_stable() is a broken interface. The reason it existed is that not having it is a pain, it means all relevant architecture code needs to call clear_sched_clock_stable() where appropriate. Of the three architectures that select HAVE_UNSTABLE_SCHED_CLOCK ia64 and parisc are trivial in that they never called set_sched_clock_stable(), so add an unconditional call to clear_sched_clock_stable() to them. For x86 the story is a lot more involved, and what this patch tries to do is ensure we preserve the status quo. So even is Cyrix or Transmeta have usable TSC they never called set_sched_clock_stable() so they now get an explicit mark unstable. Reported-by: Mike Galbraith <efault@gmx.de> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Fixes: 9881b024b7d7 ("sched/clock: Delay switching sched_clock to stable") Link: http://lkml.kernel.org/r/20170119133633.GB6536@twins.programming.kicks-ass.net Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/x86/kernel/cpu/common.c')
-rw-r--r--arch/x86/kernel/cpu/common.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index dc1697ca5191..3457186275a0 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -83,6 +83,7 @@ static void default_init(struct cpuinfo_x86 *c)
83 strcpy(c->x86_model_id, "386"); 83 strcpy(c->x86_model_id, "386");
84 } 84 }
85#endif 85#endif
86 clear_sched_clock_stable();
86} 87}
87 88
88static const struct cpu_dev default_cpu = { 89static const struct cpu_dev default_cpu = {
@@ -1055,6 +1056,8 @@ static void identify_cpu(struct cpuinfo_x86 *c)
1055 */ 1056 */
1056 if (this_cpu->c_init) 1057 if (this_cpu->c_init)
1057 this_cpu->c_init(c); 1058 this_cpu->c_init(c);
1059 else
1060 clear_sched_clock_stable();
1058 1061
1059 /* Disable the PN if appropriate */ 1062 /* Disable the PN if appropriate */
1060 squash_the_stupid_serial_number(c); 1063 squash_the_stupid_serial_number(c);