diff options
| author | Ivan Kokshaysky <ink@jurassic.park.msu.ru> | 2006-06-04 05:51:34 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-05 15:29:16 -0400 |
| commit | c7d2d28b9851d0ffc9924b0e36bac806d18ebf25 (patch) | |
| tree | f48fadad9a5cce62f7016cb48bc258928cb49114 | |
| parent | ba0c19ed6a61a96d4b42b81cb19d4bc81b5f728c (diff) | |
[PATCH] alpha: SMP IRQ routing fix
From: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
After removal of fixup_cpu_present_map() function Alpha ended up with an empty
cpu_present_map, so secondary CPUs on SMP systems are not being started.
Worse, on some platforms we route interrupts to secondary CPUs using
cpu_possible_map which is still populated properly. As a result, these
interrupts go nowhere so the machines like DP264 aren't able to boot even with
a primary CPU.
Fixed basically by s/cpu_present_mask/cpu_present_map/.
Thanks to Ernst Herzberg for reporting the bug and testing the fix.
Cc: Ernst Herzberg <list-lkml@net4u.de>
Cc: Richard Henderson <rth@twiddle.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | arch/alpha/kernel/alpha_ksyms.c | 1 | ||||
| -rw-r--r-- | arch/alpha/kernel/process.c | 6 | ||||
| -rw-r--r-- | arch/alpha/kernel/smp.c | 14 | ||||
| -rw-r--r-- | arch/alpha/kernel/sys_titan.c | 2 | ||||
| -rw-r--r-- | include/asm-alpha/smp.h | 4 |
5 files changed, 9 insertions, 18 deletions
diff --git a/arch/alpha/kernel/alpha_ksyms.c b/arch/alpha/kernel/alpha_ksyms.c index c645c5e14786..2b245ad731ee 100644 --- a/arch/alpha/kernel/alpha_ksyms.c +++ b/arch/alpha/kernel/alpha_ksyms.c | |||
| @@ -182,7 +182,6 @@ EXPORT_SYMBOL(smp_num_cpus); | |||
| 182 | EXPORT_SYMBOL(smp_call_function); | 182 | EXPORT_SYMBOL(smp_call_function); |
| 183 | EXPORT_SYMBOL(smp_call_function_on_cpu); | 183 | EXPORT_SYMBOL(smp_call_function_on_cpu); |
| 184 | EXPORT_SYMBOL(_atomic_dec_and_lock); | 184 | EXPORT_SYMBOL(_atomic_dec_and_lock); |
| 185 | EXPORT_SYMBOL(cpu_present_mask); | ||
| 186 | #endif /* CONFIG_SMP */ | 185 | #endif /* CONFIG_SMP */ |
| 187 | 186 | ||
| 188 | /* | 187 | /* |
diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c index 9924fd07743a..c760a831fd1a 100644 --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c | |||
| @@ -94,7 +94,7 @@ common_shutdown_1(void *generic_ptr) | |||
| 94 | if (cpuid != boot_cpuid) { | 94 | if (cpuid != boot_cpuid) { |
| 95 | flags |= 0x00040000UL; /* "remain halted" */ | 95 | flags |= 0x00040000UL; /* "remain halted" */ |
| 96 | *pflags = flags; | 96 | *pflags = flags; |
| 97 | clear_bit(cpuid, &cpu_present_mask); | 97 | cpu_clear(cpuid, cpu_present_map); |
| 98 | halt(); | 98 | halt(); |
| 99 | } | 99 | } |
| 100 | #endif | 100 | #endif |
| @@ -120,8 +120,8 @@ common_shutdown_1(void *generic_ptr) | |||
| 120 | 120 | ||
| 121 | #ifdef CONFIG_SMP | 121 | #ifdef CONFIG_SMP |
| 122 | /* Wait for the secondaries to halt. */ | 122 | /* Wait for the secondaries to halt. */ |
| 123 | cpu_clear(boot_cpuid, cpu_possible_map); | 123 | cpu_clear(boot_cpuid, cpu_present_map); |
| 124 | while (cpus_weight(cpu_possible_map)) | 124 | while (cpus_weight(cpu_present_map)) |
| 125 | barrier(); | 125 | barrier(); |
| 126 | #endif | 126 | #endif |
| 127 | 127 | ||
diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c index 185255416e85..4dc273e537fd 100644 --- a/arch/alpha/kernel/smp.c +++ b/arch/alpha/kernel/smp.c | |||
| @@ -68,7 +68,6 @@ enum ipi_message_type { | |||
| 68 | static int smp_secondary_alive __initdata = 0; | 68 | static int smp_secondary_alive __initdata = 0; |
| 69 | 69 | ||
| 70 | /* Which cpus ids came online. */ | 70 | /* Which cpus ids came online. */ |
| 71 | cpumask_t cpu_present_mask; | ||
| 72 | cpumask_t cpu_online_map; | 71 | cpumask_t cpu_online_map; |
| 73 | 72 | ||
| 74 | EXPORT_SYMBOL(cpu_online_map); | 73 | EXPORT_SYMBOL(cpu_online_map); |
| @@ -439,7 +438,7 @@ setup_smp(void) | |||
| 439 | if ((cpu->flags & 0x1cc) == 0x1cc) { | 438 | if ((cpu->flags & 0x1cc) == 0x1cc) { |
| 440 | smp_num_probed++; | 439 | smp_num_probed++; |
| 441 | /* Assume here that "whami" == index */ | 440 | /* Assume here that "whami" == index */ |
| 442 | cpu_set(i, cpu_present_mask); | 441 | cpu_set(i, cpu_present_map); |
| 443 | cpu->pal_revision = boot_cpu_palrev; | 442 | cpu->pal_revision = boot_cpu_palrev; |
| 444 | } | 443 | } |
| 445 | 444 | ||
| @@ -450,11 +449,10 @@ setup_smp(void) | |||
| 450 | } | 449 | } |
| 451 | } else { | 450 | } else { |
| 452 | smp_num_probed = 1; | 451 | smp_num_probed = 1; |
| 453 | cpu_set(boot_cpuid, cpu_present_mask); | ||
| 454 | } | 452 | } |
| 455 | 453 | ||
| 456 | printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n", | 454 | printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_map = %lx\n", |
| 457 | smp_num_probed, cpu_possible_map.bits[0]); | 455 | smp_num_probed, cpu_present_map.bits[0]); |
| 458 | } | 456 | } |
| 459 | 457 | ||
| 460 | /* | 458 | /* |
| @@ -473,7 +471,7 @@ smp_prepare_cpus(unsigned int max_cpus) | |||
| 473 | 471 | ||
| 474 | /* Nothing to do on a UP box, or when told not to. */ | 472 | /* Nothing to do on a UP box, or when told not to. */ |
| 475 | if (smp_num_probed == 1 || max_cpus == 0) { | 473 | if (smp_num_probed == 1 || max_cpus == 0) { |
| 476 | cpu_present_mask = cpumask_of_cpu(boot_cpuid); | 474 | cpu_present_map = cpumask_of_cpu(boot_cpuid); |
| 477 | printk(KERN_INFO "SMP mode deactivated.\n"); | 475 | printk(KERN_INFO "SMP mode deactivated.\n"); |
| 478 | return; | 476 | return; |
| 479 | } | 477 | } |
| @@ -486,10 +484,6 @@ smp_prepare_cpus(unsigned int max_cpus) | |||
| 486 | void __devinit | 484 | void __devinit |
| 487 | smp_prepare_boot_cpu(void) | 485 | smp_prepare_boot_cpu(void) |
| 488 | { | 486 | { |
| 489 | /* | ||
| 490 | * Mark the boot cpu (current cpu) as online | ||
| 491 | */ | ||
| 492 | cpu_set(smp_processor_id(), cpu_online_map); | ||
| 493 | } | 487 | } |
| 494 | 488 | ||
| 495 | int __devinit | 489 | int __devinit |
diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index 5f84417eeb7b..2551fb49ae09 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c | |||
| @@ -66,7 +66,7 @@ titan_update_irq_hw(unsigned long mask) | |||
| 66 | register int bcpu = boot_cpuid; | 66 | register int bcpu = boot_cpuid; |
| 67 | 67 | ||
| 68 | #ifdef CONFIG_SMP | 68 | #ifdef CONFIG_SMP |
| 69 | cpumask_t cpm = cpu_present_mask; | 69 | cpumask_t cpm = cpu_present_map; |
| 70 | volatile unsigned long *dim0, *dim1, *dim2, *dim3; | 70 | volatile unsigned long *dim0, *dim1, *dim2, *dim3; |
| 71 | unsigned long mask0, mask1, mask2, mask3, dummy; | 71 | unsigned long mask0, mask1, mask2, mask3, dummy; |
| 72 | 72 | ||
diff --git a/include/asm-alpha/smp.h b/include/asm-alpha/smp.h index 9950706abdf8..e1432102be05 100644 --- a/include/asm-alpha/smp.h +++ b/include/asm-alpha/smp.h | |||
| @@ -45,10 +45,8 @@ extern struct cpuinfo_alpha cpu_data[NR_CPUS]; | |||
| 45 | #define hard_smp_processor_id() __hard_smp_processor_id() | 45 | #define hard_smp_processor_id() __hard_smp_processor_id() |
| 46 | #define raw_smp_processor_id() (current_thread_info()->cpu) | 46 | #define raw_smp_processor_id() (current_thread_info()->cpu) |
| 47 | 47 | ||
| 48 | extern cpumask_t cpu_present_mask; | ||
| 49 | extern cpumask_t cpu_online_map; | ||
| 50 | extern int smp_num_cpus; | 48 | extern int smp_num_cpus; |
| 51 | #define cpu_possible_map cpu_present_mask | 49 | #define cpu_possible_map cpu_present_map |
| 52 | 50 | ||
| 53 | int smp_call_function_on_cpu(void (*func) (void *info), void *info,int retry, int wait, cpumask_t cpu); | 51 | int smp_call_function_on_cpu(void (*func) (void *info), void *info,int retry, int wait, cpumask_t cpu); |
| 54 | 52 | ||
