]> xenbits.xensource.com Git - people/vhanquez/xen.git/commitdiff
x86: fix cpu_sibling_map initialization when topology CPUID leaf is present
authorJan Beulich <jbeulich@novell.com>
Mon, 14 Mar 2011 17:08:00 +0000 (17:08 +0000)
committerJan Beulich <jbeulich@novell.com>
Mon, 14 Mar 2011 17:08:00 +0000 (17:08 +0000)
c/s 21811:12f0618400de broke this by not properly initializing struct
cpuinfo_x86's x86_num_siblings member (other than Linux, where this is
a global variable, it is being maintained per CPU by Xen).

Hyper-threaded CPUs with CPUID leaf 0xb present had therefore all
cpu_sibling_map-s with just a single bit set, thus improperly feeding
the scheduler.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
xen-unstable changeset:   23037:a29b35408950
xen-unstable date:        Mon Mar 14 17:05:21 2011 +0000

xen/arch/x86/cpu/common.c

index 1add6b68ad1661af9cf3c2db81983be433c7db43..9223075691de7f0adb4605e38d720060a930626d 100644 (file)
@@ -512,7 +512,7 @@ void __cpuinit detect_extended_topology(struct cpuinfo_x86 *c)
 {
        unsigned int eax, ebx, ecx, edx, sub_index;
        unsigned int ht_mask_width, core_plus_mask_width;
-       unsigned int core_select_mask, core_level_siblings, smp_num_siblings;
+       unsigned int core_select_mask, core_level_siblings;
        unsigned int initial_apicid;
        int cpu = smp_processor_id();
 
@@ -530,7 +530,7 @@ void __cpuinit detect_extended_topology(struct cpuinfo_x86 *c)
        initial_apicid = edx;
 
        /* Populate HT related information from sub-leaf level 0 */
-       core_level_siblings = smp_num_siblings = LEVEL_MAX_SIBLINGS(ebx);
+       core_level_siblings = c->x86_num_siblings = LEVEL_MAX_SIBLINGS(ebx);
        core_plus_mask_width = ht_mask_width = BITS_SHIFT_NEXT_LEVEL(eax);
 
        sub_index = 1;
@@ -554,7 +554,7 @@ void __cpuinit detect_extended_topology(struct cpuinfo_x86 *c)
        phys_proc_id[cpu] = phys_pkg_id(initial_apicid, core_plus_mask_width);
 
        c->apicid = phys_pkg_id(initial_apicid, 0);
-       c->x86_max_cores = (core_level_siblings / smp_num_siblings);
+       c->x86_max_cores = (core_level_siblings / c->x86_num_siblings);
 
        if ( opt_cpu_info )
        {