x86/debug: Fix/improve the show_msr=<cpus> debug print out
authorYinghai Lu <yinghai@kernel.org>
Sun, 12 Feb 2012 17:53:57 +0000 (09:53 -0800)
committerIngo Molnar <mingo@elte.hu>
Sun, 12 Feb 2012 18:12:21 +0000 (19:12 +0100)
Found out that show_msr=<cpus> is broken, when I asked a
user to use it to capture debug info about broken MTRR's
whose MTRR settings are probably different between CPUs.

Only the first CPUs MSRs are printed, but that is not
enough to track down the suspected bug.

For years we called print_cpu_msr from print_cpu_info(),
but this commit:

| commit 2eaad1fddd7450a48ad464229775f97fbfe8af36
| Author: Mike Travis <travis@sgi.com>
| Date:   Thu Dec 10 17:19:36 2009 -0800
|
|    x86: Limit the number of processor bootup messages

removed the print_cpu_info() call from all APs.

Put it back - it will only print MSRs when the user
specifically requests them via show_msr=<cpus>.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: Mike Travis <travis@sgi.com>
Link: http://lkml.kernel.org/r/1329069237-11483-1-git-send-email-yinghai@kernel.org
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/include/asm/processor.h
arch/x86/kernel/cpu/common.c
arch/x86/kernel/smpboot.c

index aa9088c26931ae349c0bc6fbfece5fe0b10edfb9..8bb062bbcbecfd63c35ad19c6eabca224f8a58b3 100644 (file)
@@ -162,6 +162,7 @@ extern void early_cpu_init(void);
 extern void identify_boot_cpu(void);
 extern void identify_secondary_cpu(struct cpuinfo_x86 *);
 extern void print_cpu_info(struct cpuinfo_x86 *);
+void print_cpu_msr(struct cpuinfo_x86 *);
 extern void init_scattered_cpuid_features(struct cpuinfo_x86 *c);
 extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c);
 extern unsigned short num_cache_leaves;
index d43cad74f1661c2180cc1f9277b9553b3de7cf63..8b6a3bb57d8e57eb5cc6c482298e0d51af27ce3c 100644 (file)
@@ -933,7 +933,7 @@ static const struct msr_range msr_range_array[] __cpuinitconst = {
        { 0xc0011000, 0xc001103b},
 };
 
-static void __cpuinit print_cpu_msr(void)
+static void __cpuinit __print_cpu_msr(void)
 {
        unsigned index_min, index_max;
        unsigned index;
@@ -997,13 +997,13 @@ void __cpuinit print_cpu_info(struct cpuinfo_x86 *c)
        else
                printk(KERN_CONT "\n");
 
-#ifdef CONFIG_SMP
+       __print_cpu_msr();
+}
+
+void __cpuinit print_cpu_msr(struct cpuinfo_x86 *c)
+{
        if (c->cpu_index < show_msr)
-               print_cpu_msr();
-#else
-       if (show_msr)
-               print_cpu_msr();
-#endif
+               __print_cpu_msr();
 }
 
 static __init int setup_disablecpuid(char *arg)
index 66d250c00d115bbaae4c7ab0917ce9c0dfe89643..257049d7c657cc56b40fc37e57aca7c402a90b70 100644 (file)
@@ -791,9 +791,10 @@ do_rest:
                        schedule();
                }
 
-               if (cpumask_test_cpu(cpu, cpu_callin_mask))
+               if (cpumask_test_cpu(cpu, cpu_callin_mask)) {
+                       print_cpu_msr(&cpu_data(cpu));
                        pr_debug("CPU%d: has booted.\n", cpu);
-               else {
+               else {
                        boot_error = 1;
                        if (*(volatile u32 *)TRAMPOLINE_SYM(trampoline_status)
                            == 0xA5A5A5A5)
This page took 0.027998 seconds and 5 git commands to generate.