Commit cdd140bd authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Linus Torvalds
Browse files

kthreads: simplify the startup synchronization

We use two completions two create the kernel thread, this is a bit ugly.
kthread() wakes up create_kthread() via ->started, then create_kthread()
wakes up the caller kthread_create() via ->done.  But kthread() does not
need to wait for kthread(), it can just return.  Instead kthread() itself
can wake up the caller of kthread_create().

Kill kthread_create_info->started, ->done is enough.  This improves the
scalability a bit and sijmplifies the code.

The only problem if kernel_thread() fails, in that case create_kthread()
must do complete(&create->done).
Signed-off-by: default avatarOleg Nesterov <>
Cc: Christoph Hellwig <>
Cc: "Eric W. Biederman" <>
Cc: Ingo Molnar <>
Cc: Pavel Emelyanov <>
Cc: Rusty Russell <>
Cc: Vitaliy Gusev <
Signed-off-by: default avatarAndrew Morton <>
Signed-off-by: default avatarLinus Torvalds <>
parent e1eb1ebc
......@@ -27,7 +27,6 @@ struct kthread_create_info
/* Information passed to kthread() from kthreadd. */
int (*threadfn)(void *data);
void *data;
struct completion started;
/* Result passed back to kthread_create() from kthreadd. */
struct task_struct *result;
......@@ -75,7 +74,7 @@ static int kthread(void *_create)
/* OK, tell user we're spawned, wait for stop or wakeup */
create->result = current;
if (!kthread_should_stop())
......@@ -95,11 +94,10 @@ static void create_kthread(struct kthread_create_info *create)
/* We want our own signal handler (we take no signals by default). */
pid = kernel_thread(kthread, create, CLONE_FS | CLONE_FILES | SIGCHLD);
if (pid < 0)
if (pid < 0) {
create->result = ERR_PTR(pid);
......@@ -130,7 +128,6 @@ struct task_struct *kthread_create(int (*threadfn)(void *data),
create.threadfn = threadfn; = data;
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment