diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-07-02 12:52:58 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-07-02 12:52:58 -0400 |
commit | 123f94f22e3d283dfe68742b269c245b0501ad82 (patch) | |
tree | 1d40043b0909f309cf77204ea87be9e61f143e79 /init/main.c | |
parent | 4b78c119f0ba715b4e29b190bf4d7bce810ea0d6 (diff) | |
parent | 8c215bd3890c347dfb6a2db4779755f8b9c298a9 (diff) |
Merge branch 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
sched: Cure nr_iowait_cpu() users
init: Fix comment
init, sched: Fix race between init and kthreadd
Diffstat (limited to 'init/main.c')
-rw-r--r-- | init/main.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/init/main.c b/init/main.c index ac2e4a5f59ee..a42fdf4aeba9 100644 --- a/init/main.c +++ b/init/main.c | |||
@@ -424,18 +424,26 @@ static void __init setup_command_line(char *command_line) | |||
424 | * gcc-3.4 accidentally inlines this function, so use noinline. | 424 | * gcc-3.4 accidentally inlines this function, so use noinline. |
425 | */ | 425 | */ |
426 | 426 | ||
427 | static __initdata DECLARE_COMPLETION(kthreadd_done); | ||
428 | |||
427 | static noinline void __init_refok rest_init(void) | 429 | static noinline void __init_refok rest_init(void) |
428 | __releases(kernel_lock) | 430 | __releases(kernel_lock) |
429 | { | 431 | { |
430 | int pid; | 432 | int pid; |
431 | 433 | ||
432 | rcu_scheduler_starting(); | 434 | rcu_scheduler_starting(); |
435 | /* | ||
436 | * We need to spawn init first so that it obtains pid 1, however | ||
437 | * the init task will end up wanting to create kthreads, which, if | ||
438 | * we schedule it before we create kthreadd, will OOPS. | ||
439 | */ | ||
433 | kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); | 440 | kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); |
434 | numa_default_policy(); | 441 | numa_default_policy(); |
435 | pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); | 442 | pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); |
436 | rcu_read_lock(); | 443 | rcu_read_lock(); |
437 | kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns); | 444 | kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns); |
438 | rcu_read_unlock(); | 445 | rcu_read_unlock(); |
446 | complete(&kthreadd_done); | ||
439 | unlock_kernel(); | 447 | unlock_kernel(); |
440 | 448 | ||
441 | /* | 449 | /* |
@@ -857,6 +865,10 @@ static noinline int init_post(void) | |||
857 | 865 | ||
858 | static int __init kernel_init(void * unused) | 866 | static int __init kernel_init(void * unused) |
859 | { | 867 | { |
868 | /* | ||
869 | * Wait until kthreadd is all set-up. | ||
870 | */ | ||
871 | wait_for_completion(&kthreadd_done); | ||
860 | lock_kernel(); | 872 | lock_kernel(); |
861 | 873 | ||
862 | /* | 874 | /* |