lkml.org 
[lkml]   [2009]   [Jun]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
Subject[RFC patch] disable the assumption of apic_is_clustered_box for cores >= 6
From
Hello,

We have to disable the assumption of apic_is_clustered_box that assumes high
4bits of 8 bit APIC ID was cluster id, which is just the function's guess.
On a normal 4-socket system with >6cores Processor and HT enabled, we hit the
limitation of the guess and failed. Have to disable the guess on any
cores > 6 system.

Without this patch, we can't use good TSC on any SMP system with 48+ logical CPU

**The patch is enclosed in text attachment*
**Using web client to send the patch* *
**below is for review, please apply attached patch*/

Thanks,
Luming

apic/apic.c | 15 ++++++++++++++-
cpu/intel.c | 2 +-
2 files changed, 15 insertions(+), 2 deletions(-)

--- linux-2.6.30-rc6/arch/x86/kernel/apic/apic.c.0 2009-06-29
19:54:15.000000000 -0600
+++ linux-2.6.30-rc6/arch/x86/kernel/apic/apic.c 2009-06-29
20:14:15.000000000 -0600
@@ -2119,6 +2119,16 @@
#endif /* CONFIG_PM */

#ifdef CONFIG_X86_64
+extern int __cpuinit intel_num_cpu_cores(struct cpuinfo_x86 *c);
+
+__cpuinit int __detect_cores(void)
+{
+ if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
+ boot_cpu_data.x86_max_cores =
+ intel_num_cpu_cores(&boot_cpu_data);
+ return boot_cpu_data.x86_max_cores;
+}
+
/*
* apic_is_clustered_box() -- Check if we can expect good TSC
*
@@ -2190,7 +2200,10 @@
* May have to revisit this when multi-core + hyperthreaded CPUs come
* out, but AFAIK this will work even for them.
*/
- return (clusters > 2);
+ if (clusters > 2)
+ return (__detect_cores() >= 6) ? 0 : 1;
+ else
+ return 0;
}
#endif

--- linux-2.6.30-rc6/arch/x86/kernel/cpu/intel.c.0 2009-06-29
19:53:29.000000000 -0600
+++ linux-2.6.30-rc6/arch/x86/kernel/cpu/intel.c 2009-06-29
08:46:12.000000000 -0600
@@ -250,7 +250,7 @@
/*
* find out the number of processor cores on the die
*/
-static int __cpuinit intel_num_cpu_cores(struct cpuinfo_x86 *c)
+int __cpuinit intel_num_cpu_cores(struct cpuinfo_x86 *c)
{
unsigned int eax, ebx, ecx, edx;
[unhandled content-type:application/octet-stream]
\
 
 \ /
  Last update: 2009-06-30 04:55    [W:0.035 / U:2.768 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site