aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-01-22 11:05:54 +0000
committerKeir Fraser <keir.fraser@citrix.com>2009-01-22 11:05:54 +0000
commit45dbcba70f350274666ba8bd1271740e4c244762 (patch)
treed50f0411eb09b341cf765ad0bc9b3a48e098c383
parent5f4c1bb65edbbb91a5d173dc9fa7f1541a2cb826 (diff)
downloadxen-45dbcba70f350274666ba8bd1271740e4c244762.tar.gz
xen-45dbcba70f350274666ba8bd1271740e4c244762.tar.bz2
xen-45dbcba70f350274666ba8bd1271740e4c244762.zip
x86: Make the num_siblings CPU parameter per-CPU.
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>
-rw-r--r--xen/arch/x86/cpu/common.c19
-rw-r--r--xen/arch/x86/cpu/mcheck/mce_intel.c3
-rw-r--r--xen/arch/x86/nmi.c2
-rw-r--r--xen/arch/x86/oprofile/nmi_int.c2
-rw-r--r--xen/arch/x86/oprofile/op_model_p4.c4
-rw-r--r--xen/arch/x86/smpboot.c10
-rw-r--r--xen/include/asm-x86/processor.h1
-rw-r--r--xen/include/asm-x86/smp.h1
8 files changed, 19 insertions, 23 deletions
diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c
index 60fb6ccb76..0d0d416769 100644
--- a/xen/arch/x86/cpu/common.c
+++ b/xen/arch/x86/cpu/common.c
@@ -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);
diff --git a/xen/arch/x86/cpu/mcheck/mce_intel.c b/xen/arch/x86/cpu/mcheck/mce_intel.c
index e096846971..1da11f6e00 100644
--- a/xen/arch/x86/cpu/mcheck/mce_intel.c
+++ b/xen/arch/x86/cpu/mcheck/mce_intel.c
@@ -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++ ) {
diff --git a/xen/arch/x86/nmi.c b/xen/arch/x86/nmi.c
index edc323cd38..8a1f056baf 100644
--- a/xen/arch/x86/nmi.c
+++ b/xen/arch/x86/nmi.c
@@ -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))
diff --git a/xen/arch/x86/oprofile/nmi_int.c b/xen/arch/x86/oprofile/nmi_int.c
index ba58f2116d..c01adab4ab 100644
--- a/xen/arch/x86/oprofile/nmi_int.c
+++ b/xen/arch/x86/oprofile/nmi_int.c
@@ -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;
diff --git a/xen/arch/x86/oprofile/op_model_p4.c b/xen/arch/x86/oprofile/op_model_p4.c
index 8fcb7ce0bc..589fdab4bf 100644
--- a/xen/arch/x86/oprofile/op_model_p4.c
+++ b/xen/arch/x86/oprofile/op_model_p4.c
@@ -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
diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c
index 8052357bb5..8eae62196c 100644
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -63,12 +63,6 @@
/* 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;
diff --git a/xen/include/asm-x86/processor.h b/xen/include/asm-x86/processor.h
index 56a417d2f8..d218e50d4f 100644
--- a/xen/include/asm-x86/processor.h
+++ b/xen/include/asm-x86/processor.h
@@ -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;
diff --git a/xen/include/asm-x86/smp.h b/xen/include/asm-x86/smp.h
index 2078d441ec..c62c53fce6 100644
--- a/xen/include/asm-x86/smp.h
+++ b/xen/include/asm-x86/smp.h
@@ -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[];