diff options
| author | Steven Whitehouse <swhiteho@redhat.com> | 2006-09-28 08:29:59 -0400 |
|---|---|---|
| committer | Steven Whitehouse <swhiteho@redhat.com> | 2006-09-28 08:29:59 -0400 |
| commit | 185a257f2f73bcd89050ad02da5bedbc28fc43fa (patch) | |
| tree | 5e32586114534ed3f2165614cba3d578f5d87307 /arch/i386/kernel/smpboot.c | |
| parent | 3f1a9aaeffd8d1cbc5ab9776c45cbd66af1c9699 (diff) | |
| parent | a77c64c1a641950626181b4857abb701d8f38ccc (diff) | |
Merge branch 'master' into gfs2
Diffstat (limited to 'arch/i386/kernel/smpboot.c')
| -rw-r--r-- | arch/i386/kernel/smpboot.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c index f948419c888a..020d873b7d21 100644 --- a/arch/i386/kernel/smpboot.c +++ b/arch/i386/kernel/smpboot.c | |||
| @@ -177,6 +177,9 @@ static void __devinit smp_store_cpu_info(int id) | |||
| 177 | */ | 177 | */ |
| 178 | if ((c->x86_vendor == X86_VENDOR_AMD) && (c->x86 == 6)) { | 178 | if ((c->x86_vendor == X86_VENDOR_AMD) && (c->x86 == 6)) { |
| 179 | 179 | ||
| 180 | if (num_possible_cpus() == 1) | ||
| 181 | goto valid_k7; | ||
| 182 | |||
| 180 | /* Athlon 660/661 is valid. */ | 183 | /* Athlon 660/661 is valid. */ |
| 181 | if ((c->x86_model==6) && ((c->x86_mask==0) || (c->x86_mask==1))) | 184 | if ((c->x86_model==6) && ((c->x86_mask==0) || (c->x86_mask==1))) |
| 182 | goto valid_k7; | 185 | goto valid_k7; |
| @@ -642,9 +645,13 @@ static void map_cpu_to_logical_apicid(void) | |||
| 642 | { | 645 | { |
| 643 | int cpu = smp_processor_id(); | 646 | int cpu = smp_processor_id(); |
| 644 | int apicid = logical_smp_processor_id(); | 647 | int apicid = logical_smp_processor_id(); |
| 648 | int node = apicid_to_node(apicid); | ||
| 649 | |||
| 650 | if (!node_online(node)) | ||
| 651 | node = first_online_node; | ||
| 645 | 652 | ||
| 646 | cpu_2_logical_apicid[cpu] = apicid; | 653 | cpu_2_logical_apicid[cpu] = apicid; |
| 647 | map_cpu_to_node(cpu, apicid_to_node(apicid)); | 654 | map_cpu_to_node(cpu, node); |
| 648 | } | 655 | } |
| 649 | 656 | ||
| 650 | static void unmap_cpu_to_logical_apicid(int cpu) | 657 | static void unmap_cpu_to_logical_apicid(int cpu) |
| @@ -1372,7 +1379,8 @@ int __cpu_disable(void) | |||
| 1372 | */ | 1379 | */ |
| 1373 | if (cpu == 0) | 1380 | if (cpu == 0) |
| 1374 | return -EBUSY; | 1381 | return -EBUSY; |
| 1375 | 1382 | if (nmi_watchdog == NMI_LOCAL_APIC) | |
| 1383 | stop_apic_nmi_watchdog(NULL); | ||
| 1376 | clear_local_APIC(); | 1384 | clear_local_APIC(); |
| 1377 | /* Allow any queued timer interrupts to get serviced */ | 1385 | /* Allow any queued timer interrupts to get serviced */ |
| 1378 | local_irq_enable(); | 1386 | local_irq_enable(); |
| @@ -1486,3 +1494,16 @@ void __init smp_intr_init(void) | |||
| 1486 | /* IPI for generic function call */ | 1494 | /* IPI for generic function call */ |
| 1487 | set_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt); | 1495 | set_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt); |
| 1488 | } | 1496 | } |
| 1497 | |||
| 1498 | /* | ||
| 1499 | * If the BIOS enumerates physical processors before logical, | ||
| 1500 | * maxcpus=N at enumeration-time can be used to disable HT. | ||
| 1501 | */ | ||
| 1502 | static int __init parse_maxcpus(char *arg) | ||
| 1503 | { | ||
| 1504 | extern unsigned int maxcpus; | ||
| 1505 | |||
| 1506 | maxcpus = simple_strtoul(arg, NULL, 0); | ||
| 1507 | return 0; | ||
| 1508 | } | ||
| 1509 | early_param("maxcpus", parse_maxcpus); | ||
