patch-2.4.26 linux-2.4.26/arch/x86_64/kernel/smpboot.c
Next file: linux-2.4.26/arch/x86_64/kernel/swiotlb.c
Previous file: linux-2.4.26/arch/x86_64/kernel/setup64.c
Back to the patch index
Back to the overall index
- Lines: 91
- Date:
2004-04-14 06:05:28.000000000 -0700
- Orig file:
linux-2.4.25/arch/x86_64/kernel/smpboot.c
- Orig date:
2003-11-28 10:26:19.000000000 -0800
diff -urN linux-2.4.25/arch/x86_64/kernel/smpboot.c linux-2.4.26/arch/x86_64/kernel/smpboot.c
@@ -53,13 +53,18 @@
#include <asm/acpi.h>
/* Setup configured maximum number of CPUs to activate */
-static int max_cpus = -1;
+unsigned int max_cpus = NR_CPUS;
static int cpu_mask = -1;
/* Total count of live CPUs */
int smp_num_cpus = 1;
+/* Number of siblings per CPU package */
+int smp_num_siblings = 1;
+int __initdata phys_proc_id[NR_CPUS]; /* Package ID of each logical CPU */
+int cpu_sibling_map[NR_CPUS] __cacheline_aligned;
+
/* Bitmask of currently online CPUs */
unsigned long cpu_online_map;
@@ -84,10 +89,6 @@
*
* Command-line option of "nosmp" or "maxcpus=0" will disable SMP
* activation entirely (the MPS table probe still happens, though).
- *
- * Command-line option of "maxcpus=<NUM>", where <NUM> is an integer
- * greater than 0, limits the maximum number of CPUs activated in
- * SMP mode to <NUM>.
*/
static int __init nosmp(char *str)
@@ -98,15 +99,6 @@
__setup("nosmp", nosmp);
-static int __init maxcpus(char *str)
-{
- get_option(&str, &max_cpus);
- return 1;
-}
-
-__setup("maxcpus=", maxcpus);
-
-
static int __init cpumask(char *str)
{
get_option(&str, &cpu_mask);
@@ -936,8 +928,6 @@
continue;
if (((1<<apicid) & cpu_mask) == 0)
continue;
- if ((max_cpus >= 0) && (max_cpus <= cpucount+1))
- continue;
cpu = do_boot_cpu(apicid);
@@ -992,6 +982,34 @@
Dprintk("Boot done.\n");
/*
+ * If Hyper-Threading is avaialble, construct cpu_sibling_map[], so
+ * that we can tell the sibling CPU efficiently.
+ */
+ if (test_bit(X86_FEATURE_HT, boot_cpu_data.x86_capability)
+ && smp_num_siblings > 1) {
+ for (cpu = 0; cpu < NR_CPUS; cpu++)
+ cpu_sibling_map[cpu] = NO_PROC_ID;
+
+ for (cpu = 0; cpu < smp_num_cpus; cpu++) {
+ int i;
+
+ for (i = 0; i < smp_num_cpus; i++) {
+ if (i == cpu)
+ continue;
+ if (phys_proc_id[cpu] == phys_proc_id[i]) {
+ cpu_sibling_map[cpu] = i;
+ printk("cpu_sibling_map[%d] = %d\n", cpu, cpu_sibling_map[cpu]);
+ break;
+ }
+ }
+ if (cpu_sibling_map[cpu] == NO_PROC_ID) {
+ smp_num_siblings = 1;
+ printk(KERN_WARNING "WARNING: No sibling found for CPU %d.\n", cpu);
+ }
+ }
+ }
+
+ /*
* Here we can be sure that there is an IO-APIC in the system. Let's
* go and set it up:
*/
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)