diff options
-rw-r--r-- | arch/mips/Kconfig | 1 | ||||
-rw-r--r-- | arch/mips/kernel/smp.c | 54 |
2 files changed, 2 insertions, 53 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index ce30e2f91d77..186fc8cf9ee0 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -29,6 +29,7 @@ config MIPS | |||
29 | select HAVE_MEMBLOCK | 29 | select HAVE_MEMBLOCK |
30 | select HAVE_MEMBLOCK_NODE_MAP | 30 | select HAVE_MEMBLOCK_NODE_MAP |
31 | select ARCH_DISCARD_MEMBLOCK | 31 | select ARCH_DISCARD_MEMBLOCK |
32 | select GENERIC_SMP_IDLE_THREAD | ||
32 | 33 | ||
33 | menu "Machine selection" | 34 | menu "Machine selection" |
34 | 35 | ||
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index 41079b256092..71a95f55a649 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
@@ -186,61 +186,9 @@ void __devinit smp_prepare_boot_cpu(void) | |||
186 | cpu_set(0, cpu_callin_map); | 186 | cpu_set(0, cpu_callin_map); |
187 | } | 187 | } |
188 | 188 | ||
189 | /* | ||
190 | * Called once for each "cpu_possible(cpu)". Needs to spin up the cpu | ||
191 | * and keep control until "cpu_online(cpu)" is set. Note: cpu is | ||
192 | * physical, not logical. | ||
193 | */ | ||
194 | static struct task_struct *cpu_idle_thread[NR_CPUS]; | ||
195 | |||
196 | struct create_idle { | ||
197 | struct work_struct work; | ||
198 | struct task_struct *idle; | ||
199 | struct completion done; | ||
200 | int cpu; | ||
201 | }; | ||
202 | |||
203 | static void __cpuinit do_fork_idle(struct work_struct *work) | ||
204 | { | ||
205 | struct create_idle *c_idle = | ||
206 | container_of(work, struct create_idle, work); | ||
207 | |||
208 | c_idle->idle = fork_idle(c_idle->cpu); | ||
209 | complete(&c_idle->done); | ||
210 | } | ||
211 | |||
212 | int __cpuinit __cpu_up(unsigned int cpu, struct task_struct *tidle) | 189 | int __cpuinit __cpu_up(unsigned int cpu, struct task_struct *tidle) |
213 | { | 190 | { |
214 | struct task_struct *idle; | 191 | mp_ops->boot_secondary(cpu, tidle); |
215 | |||
216 | /* | ||
217 | * Processor goes to start_secondary(), sets online flag | ||
218 | * The following code is purely to make sure | ||
219 | * Linux can schedule processes on this slave. | ||
220 | */ | ||
221 | if (!cpu_idle_thread[cpu]) { | ||
222 | /* | ||
223 | * Schedule work item to avoid forking user task | ||
224 | * Ported from arch/x86/kernel/smpboot.c | ||
225 | */ | ||
226 | struct create_idle c_idle = { | ||
227 | .cpu = cpu, | ||
228 | .done = COMPLETION_INITIALIZER_ONSTACK(c_idle.done), | ||
229 | }; | ||
230 | |||
231 | INIT_WORK_ONSTACK(&c_idle.work, do_fork_idle); | ||
232 | schedule_work(&c_idle.work); | ||
233 | wait_for_completion(&c_idle.done); | ||
234 | idle = cpu_idle_thread[cpu] = c_idle.idle; | ||
235 | |||
236 | if (IS_ERR(idle)) | ||
237 | panic(KERN_ERR "Fork failed for CPU %d", cpu); | ||
238 | } else { | ||
239 | idle = cpu_idle_thread[cpu]; | ||
240 | init_idle(idle, cpu); | ||
241 | } | ||
242 | |||
243 | mp_ops->boot_secondary(cpu, idle); | ||
244 | 192 | ||
245 | /* | 193 | /* |
246 | * Trust is futile. We should really have timeouts ... | 194 | * Trust is futile. We should really have timeouts ... |