All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Move smp_num_siblings to the per-cpu data
@ 2009-01-20 23:36 Frank van der Linden
  2009-01-21 11:50 ` Keir Fraser
  0 siblings, 1 reply; 3+ messages in thread
From: Frank van der Linden @ 2009-01-20 23:36 UTC (permalink / raw)
  To: xen-devel

[-- Attachment #1: Type: text/plain, Size: 343 bytes --]

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>

[-- Attachment #2: cpu-siblings --]
[-- Type: text/plain, Size: 5722 bytes --]

diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c
--- a/xen/arch/x86/cpu/common.c
+++ b/xen/arch/x86/cpu/common.c
@@ -338,6 +338,7 @@ void __cpuinit identify_cpu(struct cpuin
 	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_
 	if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY))
 		return;
 
-	smp_num_siblings = (ebx & 0xff0000) >> 16;
-
-	if (smp_num_siblings == 1) {
+	c->x86_num_siblings = (ebx & 0xff0000) >> 16;
+
+	if (c->x86_num_siblings == 1) {
 		printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");
-	} else if (smp_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;
+	} else if (c->x86_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;
-
-		index_msb = get_count_order(smp_num_siblings) ;
+		c->x86_num_siblings = c->x86_num_siblings / c->x86_max_cores;
+
+		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
--- 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_pol
     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
--- a/xen/arch/x86/nmi.c
+++ b/xen/arch/x86/nmi.c
@@ -286,7 +286,7 @@ static int __pminit setup_p4_watchdog(vo
 
     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
--- 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_ty
 	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
--- a/xen/arch/x86/oprofile/op_model_p4.c
+++ b/xen/arch/x86/oprofile/op_model_p4.c
@@ -41,7 +41,7 @@ static inline void setup_num_counters(vo
 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 int inline addr_increment(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
--- 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
--- 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
--- 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[];
 

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Move smp_num_siblings to the per-cpu data
  2009-01-20 23:36 [PATCH] Move smp_num_siblings to the per-cpu data Frank van der Linden
@ 2009-01-21 11:50 ` Keir Fraser
  2009-01-21 16:18   ` Frank Van Der Linden
  0 siblings, 1 reply; 3+ messages in thread
From: Keir Fraser @ 2009-01-21 11:50 UTC (permalink / raw)
  To: Frank van der Linden, xen-devel

On 20/01/2009 23:36, "Frank van der Linden" <Frank.Vanderlinden@Sun.COM>
wrote:

> 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>

It's a pretty odd thing to decide to knock together one day. Do you have an
underlying near-term motive for adding this flexibility?

 -- Keir

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Move smp_num_siblings to the per-cpu data
  2009-01-21 11:50 ` Keir Fraser
@ 2009-01-21 16:18   ` Frank Van Der Linden
  0 siblings, 0 replies; 3+ messages in thread
From: Frank Van Der Linden @ 2009-01-21 16:18 UTC (permalink / raw)
  To: Keir Fraser; +Cc: xen-devel

Keir Fraser wrote:
> On 20/01/2009 23:36, "Frank van der Linden" <Frank.Vanderlinden@Sun.COM>
> wrote:
>
>   
>> 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>
>>     
>
> It's a pretty odd thing to decide to knock together one day. Do you have an
> underlying near-term motive for adding this flexibility?
>
>  -- Keir
>
>
>   
I originally did this as part of an extension to the MCE support 
hypercall. We needed some detailed physical CPU information, plus some 
MSR info. When implementing this, and extracting infro from cpu_data[], 
I noticed the smp_num_siblings inconsistency, so I changed it.

The other changes will be submitted as a separate patch, after they've 
been discussed with AMD & Intel.

- Frank

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2009-01-21 16:18 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-01-20 23:36 [PATCH] Move smp_num_siblings to the per-cpu data Frank van der Linden
2009-01-21 11:50 ` Keir Fraser
2009-01-21 16:18   ` Frank Van Der Linden

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.