Merge branch 'x86-cpufeature-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[firefly-linux-kernel-4.4.55.git] / arch / x86 / kernel / cpu / common.c
index 724d221107ebc92c0551e7c233520345d657fd59..ef58886ba61c860bc6c08d0fbd16d327b4c70ff4 100644 (file)
@@ -346,8 +346,8 @@ static void filter_cpuid_features(struct cpuinfo_x86 *c, bool warn)
                        continue;
 
                printk(KERN_WARNING
-                      "CPU: CPU feature %s disabled, no CPUID level 0x%x\n",
-                               x86_cap_flags[df->feature], df->level);
+                      "CPU: CPU feature " X86_CAP_FMT " disabled, no CPUID level 0x%x\n",
+                               x86_cap_flag(df->feature), df->level);
        }
 }
 
@@ -1266,6 +1266,19 @@ static void dbg_restore_debug_regs(void)
 #define dbg_restore_debug_regs()
 #endif /* ! CONFIG_KGDB */
 
+static void wait_for_master_cpu(int cpu)
+{
+#ifdef CONFIG_SMP
+       /*
+        * wait for ACK from master CPU before continuing
+        * with AP initialization
+        */
+       WARN_ON(cpumask_test_and_set_cpu(cpu, cpu_initialized_mask));
+       while (!cpumask_test_cpu(cpu, cpu_callout_mask))
+               cpu_relax();
+#endif
+}
+
 /*
  * cpu_init() initializes state that is per-CPU. Some data is already
  * initialized (naturally) in the bootstrap process, such as the GDT
@@ -1281,16 +1294,17 @@ void cpu_init(void)
        struct task_struct *me;
        struct tss_struct *t;
        unsigned long v;
-       int cpu;
+       int cpu = stack_smp_processor_id();
        int i;
 
+       wait_for_master_cpu(cpu);
+
        /*
         * Load microcode on this cpu if a valid microcode is available.
         * This is early microcode loading procedure.
         */
        load_ucode_ap();
 
-       cpu = stack_smp_processor_id();
        t = &per_cpu(init_tss, cpu);
        oist = &per_cpu(orig_ist, cpu);
 
@@ -1302,9 +1316,6 @@ void cpu_init(void)
 
        me = current;
 
-       if (cpumask_test_and_set_cpu(cpu, cpu_initialized_mask))
-               panic("CPU#%d already initialized!\n", cpu);
-
        pr_debug("Initializing CPU#%d\n", cpu);
 
        clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE);
@@ -1381,13 +1392,9 @@ void cpu_init(void)
        struct tss_struct *t = &per_cpu(init_tss, cpu);
        struct thread_struct *thread = &curr->thread;
 
-       show_ucode_info_early();
+       wait_for_master_cpu(cpu);
 
-       if (cpumask_test_and_set_cpu(cpu, cpu_initialized_mask)) {
-               printk(KERN_WARNING "CPU#%d already initialized!\n", cpu);
-               for (;;)
-                       local_irq_enable();
-       }
+       show_ucode_info_early();
 
        printk(KERN_INFO "Initializing CPU#%d\n", cpu);