diff options
author | Bob Breuer <breuerr@mc.net> | 2006-03-24 01:36:19 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2006-03-24 01:36:19 -0500 |
commit | a54123e27779049d27d21e6c8adfee73aa2c0734 (patch) | |
tree | 265849e706e4ebe3b75127ebe6e3cbfe2a78850a /arch/sparc/kernel/sun4d_smp.c | |
parent | 674a396c6d2ba0341ebdd7c1c9950f32f018e2dd (diff) |
[SPARC]: Try to start getting SMP back into shape.
Todo items:
- IRQ_INPROGRESS flag - use sparc64 irq buckets, or generic irq_desc?
- sun4d
- re-indent large chunks of sun4m_smp.c
- some places assume sequential cpu numbering (i.e. 0,1 instead of 0,2)
Last I checked (with 2.6.14), random programs segfault with dual
HyperSPARC. And with SuperSPARC II's, it seems stable but will
eventually die from a write lock error (wrong lock owner or something).
I haven't tried the HyperSPARC + highmem combination recently, so that
may still be a problem.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc/kernel/sun4d_smp.c')
-rw-r--r-- | arch/sparc/kernel/sun4d_smp.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/arch/sparc/kernel/sun4d_smp.c b/arch/sparc/kernel/sun4d_smp.c index 41bb9596be48..b141b7ee6717 100644 --- a/arch/sparc/kernel/sun4d_smp.c +++ b/arch/sparc/kernel/sun4d_smp.c | |||
@@ -46,14 +46,16 @@ extern volatile int smp_processors_ready; | |||
46 | extern int smp_num_cpus; | 46 | extern int smp_num_cpus; |
47 | static int smp_highest_cpu; | 47 | static int smp_highest_cpu; |
48 | extern volatile unsigned long cpu_callin_map[NR_CPUS]; | 48 | extern volatile unsigned long cpu_callin_map[NR_CPUS]; |
49 | extern struct cpuinfo_sparc cpu_data[NR_CPUS]; | 49 | extern cpuinfo_sparc cpu_data[NR_CPUS]; |
50 | extern unsigned char boot_cpu_id; | 50 | extern unsigned char boot_cpu_id; |
51 | extern int smp_activated; | 51 | extern int smp_activated; |
52 | extern volatile int __cpu_number_map[NR_CPUS]; | 52 | extern volatile int __cpu_number_map[NR_CPUS]; |
53 | extern volatile int __cpu_logical_map[NR_CPUS]; | 53 | extern volatile int __cpu_logical_map[NR_CPUS]; |
54 | extern volatile unsigned long ipi_count; | 54 | extern volatile unsigned long ipi_count; |
55 | extern volatile int smp_process_available; | 55 | extern volatile int smp_process_available; |
56 | extern volatile int smp_commenced; | 56 | |
57 | extern cpumask_t smp_commenced_mask; | ||
58 | |||
57 | extern int __smp4d_processor_id(void); | 59 | extern int __smp4d_processor_id(void); |
58 | 60 | ||
59 | /* #define SMP_DEBUG */ | 61 | /* #define SMP_DEBUG */ |
@@ -136,7 +138,7 @@ void __init smp4d_callin(void) | |||
136 | 138 | ||
137 | local_irq_enable(); /* We don't allow PIL 14 yet */ | 139 | local_irq_enable(); /* We don't allow PIL 14 yet */ |
138 | 140 | ||
139 | while(!smp_commenced) | 141 | while (!cpu_isset(cpuid, smp_commenced_mask)) |
140 | barrier(); | 142 | barrier(); |
141 | 143 | ||
142 | spin_lock_irqsave(&sun4d_imsk_lock, flags); | 144 | spin_lock_irqsave(&sun4d_imsk_lock, flags); |