x86: Make the num_siblings CPU parameter per-CPU.
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 22 Jan 2009 11:05:54 +0000 (11:05 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 22 Jan 2009 11:05:54 +0000 (11:05 +0000)
While it is unlikely that a system has a different number of siblings
for different physical CPUs,  make this parameter per-CPU for
consistency, and deal with the (so far theoretical) case that this is
different per CPU package.

Signed-off-by: Frank van der Linden <Frank.Vanderlinden@Sun.COM>
xen/arch/x86/cpu/common.c
xen/arch/x86/cpu/mcheck/mce_intel.c
xen/arch/x86/nmi.c
xen/arch/x86/oprofile/nmi_int.c
xen/arch/x86/oprofile/op_model_p4.c
xen/arch/x86/smpboot.c
xen/include/asm-x86/processor.h
xen/include/asm-x86/smp.h

index 60fb6ccb761e7c78cd79a786d2f99a2a982ec6e7..0d0d416769b96617e4a847bed8e4b82500fa3b8a 100644 (file)
@@ -338,6 +338,7 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
        c->x86_vendor_id[0] = '\0'; /* Unset */
        c->x86_model_id[0] = '\0';  /* Unset */
        c->x86_max_cores = 1;
+       c->x86_num_siblings = 1;
        c->x86_clflush_size = 0;
        memset(&c->x86_capability, 0, sizeof c->x86_capability);
 
@@ -480,27 +481,27 @@ void __cpuinit detect_ht(struct cpuinfo_x86 *c)
        if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY))
                return;
 
-       smp_num_siblings = (ebx & 0xff0000) >> 16;
+       c->x86_num_siblings = (ebx & 0xff0000) >> 16;
 
-       if (smp_num_siblings == 1) {
+       if (c->x86_num_siblings == 1) {
                printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");
-       } else if (smp_num_siblings > 1 ) {
+       } else if (c->x86_num_siblings > 1 ) {
 
-               if (smp_num_siblings > NR_CPUS) {
-                       printk(KERN_WARNING "CPU: Unsupported number of the siblings %d", smp_num_siblings);
-                       smp_num_siblings = 1;
+               if (c->x86_num_siblings > NR_CPUS) {
+                       printk(KERN_WARNING "CPU: Unsupported number of the siblings %d", c->x86_num_siblings);
+                       c->x86_num_siblings = 1;
                        return;
                }
 
-               index_msb = get_count_order(smp_num_siblings);
+               index_msb = get_count_order(c->x86_num_siblings);
                phys_proc_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb);
 
                printk(KERN_INFO  "CPU: Physical Processor ID: %d\n",
                       phys_proc_id[cpu]);
 
-               smp_num_siblings = smp_num_siblings / c->x86_max_cores;
+               c->x86_num_siblings = c->x86_num_siblings / c->x86_max_cores;
 
-               index_msb = get_count_order(smp_num_siblings) ;
+               index_msb = get_count_order(c->x86_num_siblings) ;
 
                core_bits = get_count_order(c->x86_max_cores);
 
index e09684697189357b5cef329a6405f9501019575b..1da11f6e0033c5a4210bb1afedfbf0d7aeb4e832 100644 (file)
@@ -186,7 +186,8 @@ static struct mc_info *machine_check_poll(int calltype)
     mcg.mc_socketid = phys_proc_id[cpu];
     mcg.mc_coreid = cpu_core_id[cpu];
     mcg.mc_apicid = cpu_physical_id(cpu);
-    mcg.mc_core_threadid = mcg.mc_apicid & ( 1 << (smp_num_siblings - 1)); 
+    mcg.mc_core_threadid =
+        mcg.mc_apicid & ( 1 << (cpu_data[cpu].x86_num_siblings - 1)); 
     rdmsrl(MSR_IA32_MCG_STATUS, mcg.mc_gstatus);
 
     for ( i = 0; i < nr_mce_banks; i++ ) {
index edc323cd3849790d8dfa75bc8f9d9a7e364384dd..8a1f056baf08e8b91710b2d40964cae58278c6da 100644 (file)
@@ -286,7 +286,7 @@ static int __pminit setup_p4_watchdog(void)
 
     nmi_perfctr_msr = MSR_P4_IQ_PERFCTR0;
     nmi_p4_cccr_val = P4_NMI_IQ_CCCR0;
-    if ( smp_num_siblings == 2 )
+    if ( boot_cpu_data.x86_num_siblings == 2 )
         nmi_p4_cccr_val |= P4_CCCR_OVF_PMI1;
 
     if (!(misc_enable & MSR_IA32_MISC_ENABLE_PEBS_UNAVAIL))
index ba58f2116d3fa41a6830f1b2990206b2c01f9840..c01adab4ab116d9ef841e0fb53ea460d8b21a491 100644 (file)
@@ -326,7 +326,7 @@ static int __init p4_init(char ** cpu_type)
        model = &op_p4_spec;
        return 1;
 #else
-       switch (smp_num_siblings) {
+       switch (current_cpu_data.x86_num_siblings) {
                case 1:
                        *cpu_type = "i386/p4";
                        model = &op_p4_spec;
index 8fcb7ce0bc6edf661bffc134fccba080508da898..589fdab4bf940886ed15163a763e2ae1088bd6a6 100644 (file)
@@ -41,7 +41,7 @@ static unsigned int num_counters = NUM_COUNTERS_NON_HT;
 static inline void setup_num_counters(void)
 {
 #ifdef CONFIG_SMP
-       if (smp_num_siblings == 2)
+       if (boot_cpu_data.x86_num_siblings == 2)        /* XXX */
                num_counters = NUM_COUNTERS_HT2;
 #endif
 }
@@ -49,7 +49,7 @@ static inline void setup_num_counters(void)
 static int inline addr_increment(void)
 {
 #ifdef CONFIG_SMP
-       return smp_num_siblings == 2 ? 2 : 1;
+       return boot_cpu_data.x86_num_siblings == 2 ? 2 : 1;
 #else
        return 1;
 #endif
index 8052357bb54a61b17b7dea01013ac4cb5fc17190..8eae62196cc9a36bb113ba9c109646313b8abd95 100644 (file)
 /* Set if we find a B stepping CPU */
 static int __devinitdata smp_b_stepping;
 
-/* Number of siblings per CPU package */
-int smp_num_siblings = 1;
-#ifdef CONFIG_X86_HT
-EXPORT_SYMBOL(smp_num_siblings);
-#endif
-
 /* Package ID of each logical CPU */
 int phys_proc_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID};
 
@@ -423,7 +417,7 @@ set_cpu_sibling_map(int cpu)
 
        cpu_set(cpu, cpu_sibling_setup_map);
 
-       if (smp_num_siblings > 1) {
+       if (c[cpu].x86_num_siblings > 1) {
                for_each_cpu_mask(i, cpu_sibling_setup_map) {
                        if (phys_proc_id[cpu] == phys_proc_id[i] &&
                            cpu_core_id[cpu] == cpu_core_id[i]) {
@@ -437,7 +431,7 @@ set_cpu_sibling_map(int cpu)
                cpu_set(cpu, cpu_sibling_map[cpu]);
        }
 
-       if (current_cpu_data.x86_max_cores == 1) {
+       if (c[cpu].x86_max_cores == 1) {
                cpu_core_map[cpu] = cpu_sibling_map[cpu];
                c[cpu].booted_cores = 1;
                return;
index 56a417d2f8db25aa50bbf9150aa6b6442977e687..d218e50d4f5fb51e087557723a1246aad3cdc1b0 100644 (file)
@@ -169,6 +169,7 @@ struct cpuinfo_x86 {
     int  x86_power;
     __u32 x86_max_cores; /* cpuid returned max cores value */
     __u32 booted_cores;  /* number of cores as seen by OS */
+    __u32 x86_num_siblings; /* cpuid logical cpus per chip value */
     __u32 apicid;
     unsigned short x86_clflush_size;
 } __cacheline_aligned;
index 2078d441ec62f766ebaa90015e3e7f82c691fe12..c62c53fce6c4f2354bbd171b72908cd05a94571c 100644 (file)
@@ -32,7 +32,6 @@
  
 extern void smp_alloc_memory(void);
 extern int pic_mode;
-extern int smp_num_siblings;
 extern cpumask_t cpu_sibling_map[];
 extern cpumask_t cpu_core_map[];