diff options
author | Oleg Nesterov <oleg@redhat.com> | 2009-04-09 11:50:36 -0400 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2009-04-08 20:20:37 -0400 |
commit | 1c99315bb36b5d776210546d438ca928dc9b1f22 (patch) | |
tree | aa43f3ffe76fd1aed66ed9e4a433c5f310fd7e74 | |
parent | 3217ab97f14c5c8f9f975ed8c40c351164b0b10e (diff) |
kthread: move sched-realeted initialization from kthreadd context
kthreadd is the single thread which implements ths "create" request, move
sched_setscheduler/etc from create_kthread() to kthread_create() to
improve the scalability.
We should be careful with sched_setscheduler(), use _nochek helper.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Pavel Emelyanov <xemul@openvz.org>
Cc: Vitaliy Gusev <vgusev@openvz.org
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
-rw-r--r-- | kernel/kthread.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/kernel/kthread.c b/kernel/kthread.c index c013bf000ce6..4ebaf8519abf 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c | |||
@@ -97,19 +97,10 @@ static void create_kthread(struct kthread_create_info *create) | |||
97 | 97 | ||
98 | /* We want our own signal handler (we take no signals by default). */ | 98 | /* We want our own signal handler (we take no signals by default). */ |
99 | pid = kernel_thread(kthread, create, CLONE_FS | CLONE_FILES | SIGCHLD); | 99 | pid = kernel_thread(kthread, create, CLONE_FS | CLONE_FILES | SIGCHLD); |
100 | if (pid < 0) { | 100 | if (pid < 0) |
101 | create->result = ERR_PTR(pid); | 101 | create->result = ERR_PTR(pid); |
102 | } else { | 102 | else |
103 | struct sched_param param = { .sched_priority = 0 }; | ||
104 | wait_for_completion(&create->started); | 103 | wait_for_completion(&create->started); |
105 | /* | ||
106 | * root may have changed our (kthreadd's) priority or CPU mask. | ||
107 | * The kernel thread should not inherit these properties. | ||
108 | */ | ||
109 | sched_setscheduler(create->result, SCHED_NORMAL, ¶m); | ||
110 | set_user_nice(create->result, KTHREAD_NICE_LEVEL); | ||
111 | set_cpus_allowed_ptr(create->result, cpu_all_mask); | ||
112 | } | ||
113 | complete(&create->done); | 104 | complete(&create->done); |
114 | } | 105 | } |
115 | 106 | ||
@@ -152,11 +143,20 @@ struct task_struct *kthread_create(int (*threadfn)(void *data), | |||
152 | wait_for_completion(&create.done); | 143 | wait_for_completion(&create.done); |
153 | 144 | ||
154 | if (!IS_ERR(create.result)) { | 145 | if (!IS_ERR(create.result)) { |
146 | struct sched_param param = { .sched_priority = 0 }; | ||
155 | va_list args; | 147 | va_list args; |
148 | |||
156 | va_start(args, namefmt); | 149 | va_start(args, namefmt); |
157 | vsnprintf(create.result->comm, sizeof(create.result->comm), | 150 | vsnprintf(create.result->comm, sizeof(create.result->comm), |
158 | namefmt, args); | 151 | namefmt, args); |
159 | va_end(args); | 152 | va_end(args); |
153 | /* | ||
154 | * root may have changed our (kthreadd's) priority or CPU mask. | ||
155 | * The kernel thread should not inherit these properties. | ||
156 | */ | ||
157 | sched_setscheduler_nocheck(create.result, SCHED_NORMAL, ¶m); | ||
158 | set_user_nice(create.result, KTHREAD_NICE_LEVEL); | ||
159 | set_cpus_allowed_ptr(create.result, cpu_all_mask); | ||
160 | } | 160 | } |
161 | return create.result; | 161 | return create.result; |
162 | } | 162 | } |