diff options
Diffstat (limited to 'arch/mips')
-rw-r--r-- | arch/mips/Kconfig | 1 | ||||
-rw-r--r-- | arch/mips/Makefile | 2 | ||||
-rw-r--r-- | arch/mips/ath79/dev-wmac.c | 2 | ||||
-rw-r--r-- | arch/mips/configs/mtx1_defconfig | 4 | ||||
-rw-r--r-- | arch/mips/include/asm/mach-jz4740/irq.h | 2 | ||||
-rw-r--r-- | arch/mips/include/asm/mmu_context.h | 6 | ||||
-rw-r--r-- | arch/mips/include/asm/thread_info.h | 12 | ||||
-rw-r--r-- | arch/mips/kernel/Makefile | 2 | ||||
-rw-r--r-- | arch/mips/kernel/init_task.c | 35 | ||||
-rw-r--r-- | arch/mips/kernel/signal.c | 27 | ||||
-rw-r--r-- | arch/mips/kernel/signal32.c | 20 | ||||
-rw-r--r-- | arch/mips/kernel/signal_n32.c | 10 | ||||
-rw-r--r-- | arch/mips/kernel/smp.c | 56 |
13 files changed, 18 insertions, 161 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/Makefile b/arch/mips/Makefile index 4fedf5a51d96..76017c25a9e6 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile | |||
@@ -235,7 +235,7 @@ endif | |||
235 | 235 | ||
236 | OBJCOPYFLAGS += --remove-section=.reginfo | 236 | OBJCOPYFLAGS += --remove-section=.reginfo |
237 | 237 | ||
238 | head-y := arch/mips/kernel/head.o arch/mips/kernel/init_task.o | 238 | head-y := arch/mips/kernel/head.o |
239 | 239 | ||
240 | libs-y += arch/mips/lib/ | 240 | libs-y += arch/mips/lib/ |
241 | 241 | ||
diff --git a/arch/mips/ath79/dev-wmac.c b/arch/mips/ath79/dev-wmac.c index e21507052066..9c717bf98ffe 100644 --- a/arch/mips/ath79/dev-wmac.c +++ b/arch/mips/ath79/dev-wmac.c | |||
@@ -58,8 +58,8 @@ static void __init ar913x_wmac_setup(void) | |||
58 | 58 | ||
59 | static int ar933x_wmac_reset(void) | 59 | static int ar933x_wmac_reset(void) |
60 | { | 60 | { |
61 | ath79_device_reset_clear(AR933X_RESET_WMAC); | ||
62 | ath79_device_reset_set(AR933X_RESET_WMAC); | 61 | ath79_device_reset_set(AR933X_RESET_WMAC); |
62 | ath79_device_reset_clear(AR933X_RESET_WMAC); | ||
63 | 63 | ||
64 | return 0; | 64 | return 0; |
65 | } | 65 | } |
diff --git a/arch/mips/configs/mtx1_defconfig b/arch/mips/configs/mtx1_defconfig index 807c97eed8a8..46c61edcdf7b 100644 --- a/arch/mips/configs/mtx1_defconfig +++ b/arch/mips/configs/mtx1_defconfig | |||
@@ -346,11 +346,8 @@ CONFIG_CHELSIO_T1=m | |||
346 | CONFIG_IXGB=m | 346 | CONFIG_IXGB=m |
347 | CONFIG_S2IO=m | 347 | CONFIG_S2IO=m |
348 | CONFIG_MYRI10GE=m | 348 | CONFIG_MYRI10GE=m |
349 | CONFIG_TR=y | ||
350 | CONFIG_IBMOL=m | 349 | CONFIG_IBMOL=m |
351 | CONFIG_IBMLS=m | 350 | CONFIG_IBMLS=m |
352 | CONFIG_3C359=m | ||
353 | CONFIG_TMS380TR=m | ||
354 | CONFIG_TMSPCI=m | 351 | CONFIG_TMSPCI=m |
355 | CONFIG_ABYSS=m | 352 | CONFIG_ABYSS=m |
356 | CONFIG_USB_CATC=m | 353 | CONFIG_USB_CATC=m |
@@ -376,7 +373,6 @@ CONFIG_PCMCIA_SMC91C92=m | |||
376 | CONFIG_PCMCIA_XIRC2PS=m | 373 | CONFIG_PCMCIA_XIRC2PS=m |
377 | CONFIG_PCMCIA_AXNET=m | 374 | CONFIG_PCMCIA_AXNET=m |
378 | CONFIG_ARCNET_COM20020_CS=m | 375 | CONFIG_ARCNET_COM20020_CS=m |
379 | CONFIG_PCMCIA_IBMTR=m | ||
380 | CONFIG_WAN=y | 376 | CONFIG_WAN=y |
381 | CONFIG_LANMEDIA=m | 377 | CONFIG_LANMEDIA=m |
382 | CONFIG_HDLC=m | 378 | CONFIG_HDLC=m |
diff --git a/arch/mips/include/asm/mach-jz4740/irq.h b/arch/mips/include/asm/mach-jz4740/irq.h index a865c983c70a..5ad1a9c113c6 100644 --- a/arch/mips/include/asm/mach-jz4740/irq.h +++ b/arch/mips/include/asm/mach-jz4740/irq.h | |||
@@ -45,7 +45,7 @@ | |||
45 | #define JZ4740_IRQ_LCD JZ4740_IRQ(30) | 45 | #define JZ4740_IRQ_LCD JZ4740_IRQ(30) |
46 | 46 | ||
47 | /* 2nd-level interrupts */ | 47 | /* 2nd-level interrupts */ |
48 | #define JZ4740_IRQ_DMA(x) (JZ4740_IRQ(32) + (X)) | 48 | #define JZ4740_IRQ_DMA(x) (JZ4740_IRQ(32) + (x)) |
49 | 49 | ||
50 | #define JZ4740_IRQ_INTC_GPIO(x) (JZ4740_IRQ_GPIO0 - (x)) | 50 | #define JZ4740_IRQ_INTC_GPIO(x) (JZ4740_IRQ_GPIO0 - (x)) |
51 | #define JZ4740_IRQ_GPIO(x) (JZ4740_IRQ(48) + (x)) | 51 | #define JZ4740_IRQ_GPIO(x) (JZ4740_IRQ(48) + (x)) |
diff --git a/arch/mips/include/asm/mmu_context.h b/arch/mips/include/asm/mmu_context.h index 73c0d45798de..9b02cfba7449 100644 --- a/arch/mips/include/asm/mmu_context.h +++ b/arch/mips/include/asm/mmu_context.h | |||
@@ -37,12 +37,6 @@ extern void tlbmiss_handler_setup_pgd(unsigned long pgd); | |||
37 | write_c0_xcontext((unsigned long) smp_processor_id() << 51); \ | 37 | write_c0_xcontext((unsigned long) smp_processor_id() << 51); \ |
38 | } while (0) | 38 | } while (0) |
39 | 39 | ||
40 | |||
41 | static inline unsigned long get_current_pgd(void) | ||
42 | { | ||
43 | return PHYS_TO_XKSEG_CACHED((read_c0_context() >> 11) & ~0xfffUL); | ||
44 | } | ||
45 | |||
46 | #else /* CONFIG_MIPS_PGD_C0_CONTEXT: using pgd_current*/ | 40 | #else /* CONFIG_MIPS_PGD_C0_CONTEXT: using pgd_current*/ |
47 | 41 | ||
48 | /* | 42 | /* |
diff --git a/arch/mips/include/asm/thread_info.h b/arch/mips/include/asm/thread_info.h index 0d85d8e440c5..e2eca7d10598 100644 --- a/arch/mips/include/asm/thread_info.h +++ b/arch/mips/include/asm/thread_info.h | |||
@@ -85,18 +85,6 @@ register struct thread_info *__current_thread_info __asm__("$28"); | |||
85 | 85 | ||
86 | #define STACK_WARN (THREAD_SIZE / 8) | 86 | #define STACK_WARN (THREAD_SIZE / 8) |
87 | 87 | ||
88 | #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||
89 | |||
90 | #ifdef CONFIG_DEBUG_STACK_USAGE | ||
91 | #define alloc_thread_info_node(tsk, node) \ | ||
92 | kzalloc_node(THREAD_SIZE, GFP_KERNEL, node) | ||
93 | #else | ||
94 | #define alloc_thread_info_node(tsk, node) \ | ||
95 | kmalloc_node(THREAD_SIZE, GFP_KERNEL, node) | ||
96 | #endif | ||
97 | |||
98 | #define free_thread_info(info) kfree(info) | ||
99 | |||
100 | #endif /* !__ASSEMBLY__ */ | 88 | #endif /* !__ASSEMBLY__ */ |
101 | 89 | ||
102 | #define PREEMPT_ACTIVE 0x10000000 | 90 | #define PREEMPT_ACTIVE 0x10000000 |
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index 0c6877ea9004..fdaf65e1a99d 100644 --- a/arch/mips/kernel/Makefile +++ b/arch/mips/kernel/Makefile | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for the Linux/MIPS kernel. | 2 | # Makefile for the Linux/MIPS kernel. |
3 | # | 3 | # |
4 | 4 | ||
5 | extra-y := head.o init_task.o vmlinux.lds | 5 | extra-y := head.o vmlinux.lds |
6 | 6 | ||
7 | obj-y += cpu-probe.o branch.o entry.o genex.o irq.o process.o \ | 7 | obj-y += cpu-probe.o branch.o entry.o genex.o irq.o process.o \ |
8 | ptrace.o reset.o setup.o signal.o syscall.o \ | 8 | ptrace.o reset.o setup.o signal.o syscall.o \ |
diff --git a/arch/mips/kernel/init_task.c b/arch/mips/kernel/init_task.c deleted file mode 100644 index 5f9a76263c9a..000000000000 --- a/arch/mips/kernel/init_task.c +++ /dev/null | |||
@@ -1,35 +0,0 @@ | |||
1 | #include <linux/mm.h> | ||
2 | #include <linux/export.h> | ||
3 | #include <linux/sched.h> | ||
4 | #include <linux/init_task.h> | ||
5 | #include <linux/fs.h> | ||
6 | #include <linux/mqueue.h> | ||
7 | |||
8 | #include <asm/thread_info.h> | ||
9 | #include <asm/uaccess.h> | ||
10 | #include <asm/pgtable.h> | ||
11 | |||
12 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | ||
13 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | ||
14 | /* | ||
15 | * Initial thread structure. | ||
16 | * | ||
17 | * We need to make sure that this is 8192-byte aligned due to the | ||
18 | * way process stacks are handled. This is done by making sure | ||
19 | * the linker maps this in the .text segment right after head.S, | ||
20 | * and making head.S ensure the proper alignment. | ||
21 | * | ||
22 | * The things we do for performance.. | ||
23 | */ | ||
24 | union thread_union init_thread_union __init_task_data | ||
25 | __attribute__((__aligned__(THREAD_SIZE))) = | ||
26 | { INIT_THREAD_INFO(init_task) }; | ||
27 | |||
28 | /* | ||
29 | * Initial task structure. | ||
30 | * | ||
31 | * All other task structs will be allocated on slabs in fork.c | ||
32 | */ | ||
33 | struct task_struct init_task = INIT_TASK(init_task); | ||
34 | |||
35 | EXPORT_SYMBOL(init_task); | ||
diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c index 185ca00c4c84..d5a338a1739c 100644 --- a/arch/mips/kernel/signal.c +++ b/arch/mips/kernel/signal.c | |||
@@ -257,11 +257,8 @@ asmlinkage int sys_sigsuspend(nabi_no_regargs struct pt_regs regs) | |||
257 | return -EFAULT; | 257 | return -EFAULT; |
258 | sigdelsetmask(&newset, ~_BLOCKABLE); | 258 | sigdelsetmask(&newset, ~_BLOCKABLE); |
259 | 259 | ||
260 | spin_lock_irq(¤t->sighand->siglock); | ||
261 | current->saved_sigmask = current->blocked; | 260 | current->saved_sigmask = current->blocked; |
262 | current->blocked = newset; | 261 | set_current_blocked(&newset); |
263 | recalc_sigpending(); | ||
264 | spin_unlock_irq(¤t->sighand->siglock); | ||
265 | 262 | ||
266 | current->state = TASK_INTERRUPTIBLE; | 263 | current->state = TASK_INTERRUPTIBLE; |
267 | schedule(); | 264 | schedule(); |
@@ -286,11 +283,8 @@ asmlinkage int sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) | |||
286 | return -EFAULT; | 283 | return -EFAULT; |
287 | sigdelsetmask(&newset, ~_BLOCKABLE); | 284 | sigdelsetmask(&newset, ~_BLOCKABLE); |
288 | 285 | ||
289 | spin_lock_irq(¤t->sighand->siglock); | ||
290 | current->saved_sigmask = current->blocked; | 286 | current->saved_sigmask = current->blocked; |
291 | current->blocked = newset; | 287 | set_current_blocked(&newset); |
292 | recalc_sigpending(); | ||
293 | spin_unlock_irq(¤t->sighand->siglock); | ||
294 | 288 | ||
295 | current->state = TASK_INTERRUPTIBLE; | 289 | current->state = TASK_INTERRUPTIBLE; |
296 | schedule(); | 290 | schedule(); |
@@ -362,10 +356,7 @@ asmlinkage void sys_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
362 | goto badframe; | 356 | goto badframe; |
363 | 357 | ||
364 | sigdelsetmask(&blocked, ~_BLOCKABLE); | 358 | sigdelsetmask(&blocked, ~_BLOCKABLE); |
365 | spin_lock_irq(¤t->sighand->siglock); | 359 | set_current_blocked(&blocked); |
366 | current->blocked = blocked; | ||
367 | recalc_sigpending(); | ||
368 | spin_unlock_irq(¤t->sighand->siglock); | ||
369 | 360 | ||
370 | sig = restore_sigcontext(®s, &frame->sf_sc); | 361 | sig = restore_sigcontext(®s, &frame->sf_sc); |
371 | if (sig < 0) | 362 | if (sig < 0) |
@@ -401,10 +392,7 @@ asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
401 | goto badframe; | 392 | goto badframe; |
402 | 393 | ||
403 | sigdelsetmask(&set, ~_BLOCKABLE); | 394 | sigdelsetmask(&set, ~_BLOCKABLE); |
404 | spin_lock_irq(¤t->sighand->siglock); | 395 | set_current_blocked(&set); |
405 | current->blocked = set; | ||
406 | recalc_sigpending(); | ||
407 | spin_unlock_irq(¤t->sighand->siglock); | ||
408 | 396 | ||
409 | sig = restore_sigcontext(®s, &frame->rs_uc.uc_mcontext); | 397 | sig = restore_sigcontext(®s, &frame->rs_uc.uc_mcontext); |
410 | if (sig < 0) | 398 | if (sig < 0) |
@@ -580,12 +568,7 @@ static int handle_signal(unsigned long sig, siginfo_t *info, | |||
580 | if (ret) | 568 | if (ret) |
581 | return ret; | 569 | return ret; |
582 | 570 | ||
583 | spin_lock_irq(¤t->sighand->siglock); | 571 | block_sigmask(ka, sig); |
584 | sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask); | ||
585 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
586 | sigaddset(¤t->blocked, sig); | ||
587 | recalc_sigpending(); | ||
588 | spin_unlock_irq(¤t->sighand->siglock); | ||
589 | 572 | ||
590 | return ret; | 573 | return ret; |
591 | } | 574 | } |
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c index 06b5da392e24..ac3b8d89aae5 100644 --- a/arch/mips/kernel/signal32.c +++ b/arch/mips/kernel/signal32.c | |||
@@ -290,11 +290,8 @@ asmlinkage int sys32_sigsuspend(nabi_no_regargs struct pt_regs regs) | |||
290 | return -EFAULT; | 290 | return -EFAULT; |
291 | sigdelsetmask(&newset, ~_BLOCKABLE); | 291 | sigdelsetmask(&newset, ~_BLOCKABLE); |
292 | 292 | ||
293 | spin_lock_irq(¤t->sighand->siglock); | ||
294 | current->saved_sigmask = current->blocked; | 293 | current->saved_sigmask = current->blocked; |
295 | current->blocked = newset; | 294 | set_current_blocked(&newset); |
296 | recalc_sigpending(); | ||
297 | spin_unlock_irq(¤t->sighand->siglock); | ||
298 | 295 | ||
299 | current->state = TASK_INTERRUPTIBLE; | 296 | current->state = TASK_INTERRUPTIBLE; |
300 | schedule(); | 297 | schedule(); |
@@ -318,11 +315,8 @@ asmlinkage int sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) | |||
318 | return -EFAULT; | 315 | return -EFAULT; |
319 | sigdelsetmask(&newset, ~_BLOCKABLE); | 316 | sigdelsetmask(&newset, ~_BLOCKABLE); |
320 | 317 | ||
321 | spin_lock_irq(¤t->sighand->siglock); | ||
322 | current->saved_sigmask = current->blocked; | 318 | current->saved_sigmask = current->blocked; |
323 | current->blocked = newset; | 319 | set_current_blocked(&newset); |
324 | recalc_sigpending(); | ||
325 | spin_unlock_irq(¤t->sighand->siglock); | ||
326 | 320 | ||
327 | current->state = TASK_INTERRUPTIBLE; | 321 | current->state = TASK_INTERRUPTIBLE; |
328 | schedule(); | 322 | schedule(); |
@@ -488,10 +482,7 @@ asmlinkage void sys32_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
488 | goto badframe; | 482 | goto badframe; |
489 | 483 | ||
490 | sigdelsetmask(&blocked, ~_BLOCKABLE); | 484 | sigdelsetmask(&blocked, ~_BLOCKABLE); |
491 | spin_lock_irq(¤t->sighand->siglock); | 485 | set_current_blocked(&blocked); |
492 | current->blocked = blocked; | ||
493 | recalc_sigpending(); | ||
494 | spin_unlock_irq(¤t->sighand->siglock); | ||
495 | 486 | ||
496 | sig = restore_sigcontext32(®s, &frame->sf_sc); | 487 | sig = restore_sigcontext32(®s, &frame->sf_sc); |
497 | if (sig < 0) | 488 | if (sig < 0) |
@@ -529,10 +520,7 @@ asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
529 | goto badframe; | 520 | goto badframe; |
530 | 521 | ||
531 | sigdelsetmask(&set, ~_BLOCKABLE); | 522 | sigdelsetmask(&set, ~_BLOCKABLE); |
532 | spin_lock_irq(¤t->sighand->siglock); | 523 | set_current_blocked(&set); |
533 | current->blocked = set; | ||
534 | recalc_sigpending(); | ||
535 | spin_unlock_irq(¤t->sighand->siglock); | ||
536 | 524 | ||
537 | sig = restore_sigcontext32(®s, &frame->rs_uc.uc_mcontext); | 525 | sig = restore_sigcontext32(®s, &frame->rs_uc.uc_mcontext); |
538 | if (sig < 0) | 526 | if (sig < 0) |
diff --git a/arch/mips/kernel/signal_n32.c b/arch/mips/kernel/signal_n32.c index ae29e894ab8d..86eb4b04631c 100644 --- a/arch/mips/kernel/signal_n32.c +++ b/arch/mips/kernel/signal_n32.c | |||
@@ -93,11 +93,8 @@ asmlinkage int sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) | |||
93 | sigset_from_compat(&newset, &uset); | 93 | sigset_from_compat(&newset, &uset); |
94 | sigdelsetmask(&newset, ~_BLOCKABLE); | 94 | sigdelsetmask(&newset, ~_BLOCKABLE); |
95 | 95 | ||
96 | spin_lock_irq(¤t->sighand->siglock); | ||
97 | current->saved_sigmask = current->blocked; | 96 | current->saved_sigmask = current->blocked; |
98 | current->blocked = newset; | 97 | set_current_blocked(&newset); |
99 | recalc_sigpending(); | ||
100 | spin_unlock_irq(¤t->sighand->siglock); | ||
101 | 98 | ||
102 | current->state = TASK_INTERRUPTIBLE; | 99 | current->state = TASK_INTERRUPTIBLE; |
103 | schedule(); | 100 | schedule(); |
@@ -121,10 +118,7 @@ asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
121 | goto badframe; | 118 | goto badframe; |
122 | 119 | ||
123 | sigdelsetmask(&set, ~_BLOCKABLE); | 120 | sigdelsetmask(&set, ~_BLOCKABLE); |
124 | spin_lock_irq(¤t->sighand->siglock); | 121 | set_current_blocked(&set); |
125 | current->blocked = set; | ||
126 | recalc_sigpending(); | ||
127 | spin_unlock_irq(¤t->sighand->siglock); | ||
128 | 122 | ||
129 | sig = restore_sigcontext(®s, &frame->rs_uc.uc_mcontext); | 123 | sig = restore_sigcontext(®s, &frame->rs_uc.uc_mcontext); |
130 | if (sig < 0) | 124 | if (sig < 0) |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index ba9376bf52a1..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 | /* | 189 | int __cpuinit __cpu_up(unsigned int cpu, struct task_struct *tidle) |
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) | ||
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 ... |