Merge branch 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 21 Oct 2010 20:18:36 +0000 (13:18 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 21 Oct 2010 20:18:36 +0000 (13:18 -0700)
* 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, cpu: Fix X86_FEATURE_NOPL
  x86, cpu: Re-run get_cpu_cap() after adjusting the CPUID level

1  2 
arch/x86/kernel/cpu/common.c
arch/x86/kernel/cpu/cpu.h

@@@ -665,7 -665,7 +665,7 @@@ static void __init early_identify_cpu(s
                this_cpu->c_early_init(c);
  
  #ifdef CONFIG_SMP
 -      c->cpu_index = boot_cpu_id;
 +      c->cpu_index = 0;
  #endif
        filter_cpuid_features(c, false);
  }
@@@ -704,16 -704,21 +704,21 @@@ void __init early_cpu_init(void
  }
  
  /*
-  * The NOPL instruction is supposed to exist on all CPUs with
-  * family >= 6; unfortunately, that's not true in practice because
-  * of early VIA chips and (more importantly) broken virtualizers that
-  * are not easy to detect.  In the latter case it doesn't even *fail*
-  * reliably, so probing for it doesn't even work.  Disable it completely
+  * The NOPL instruction is supposed to exist on all CPUs of family >= 6;
+  * unfortunately, that's not true in practice because of early VIA
+  * chips and (more importantly) broken virtualizers that are not easy
+  * to detect. In the latter case it doesn't even *fail* reliably, so
+  * probing for it doesn't even work. Disable it completely on 32-bit
   * unless we can find a reliable way to detect all the broken cases.
+  * Enable it explicitly on 64-bit for non-constant inputs of cpu_has().
   */
  static void __cpuinit detect_nopl(struct cpuinfo_x86 *c)
  {
+ #ifdef CONFIG_X86_32
        clear_cpu_cap(c, X86_FEATURE_NOPL);
+ #else
+       set_cpu_cap(c, X86_FEATURE_NOPL);
+ #endif
  }
  
  static void __cpuinit generic_identify(struct cpuinfo_x86 *c)
@@@ -32,7 -32,7 +32,8 @@@ struct cpu_dev 
  extern const struct cpu_dev *const __x86_cpu_dev_start[],
                            *const __x86_cpu_dev_end[];
  
+ extern void get_cpu_cap(struct cpuinfo_x86 *c);
  extern void cpu_detect_cache_sizes(struct cpuinfo_x86 *c);
 +extern void get_cpu_cap(struct cpuinfo_x86 *c);
  
  #endif