All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Américo Wang" <xiyou.wangcong@gmail.com>
To: Oleg Nesterov <oleg@redhat.com>
Cc: Ingo Molnar <mingo@elte.hu>,
	arjan@infradead.org, jeremy@goop.org, mschmidt@redhat.com,
	mingo@redhat.com, hpa@zytor.com, linux-kernel@vger.kernel.org,
	tj@kernel.org, tglx@linutronix.de,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-tip-commits@vger.kernel.org
Subject: Re: [PATCH] kthreads: Fix startup synchronization boot crash
Date: Tue, 1 Sep 2009 23:08:48 +0800	[thread overview]
Message-ID: <20090901150848.GB5394@hack> (raw)
In-Reply-To: <20090901133709.GA24041@redhat.com>

On Tue, Sep 01, 2009 at 03:37:09PM +0200, Oleg Nesterov wrote:
>On 09/01, Ingo Molnar wrote:
>>
>> * Oleg Nesterov <oleg@redhat.com> wrote:
>>
>> > Yes, this should work. But I _think_ we can make the better fix...
>> >
>> > I'll try to make the patch soon. Afaics we don't need
>> > kthreadd_task_init_done.
>>
>> ok.
>
>Just in case, the patch is ready. I need to re-check my thinking
>and test it somehow...
>
>- remove kthreadd_task initialization from rest_init()
>
>- change kthreadd() to initialize kthreadd_task = current
>
>- change the main loop in kthreadd() to take kthread_create_lock
>  before the first schedule() (just shift schedule() down)


This is the only part that I can't understand, why moving it down?


>
>This way, if kthreadd_task needs the wakeup, kthread_create()
>must see kthreadd_task != NULL after unlock(kthread_create_lock).
>
>If kthread_create() sees kthreadd_task == NULL we can just sleep
>on create.done, kthreadd() must notice the new request before
>it calls schedule().
>
>Note that with this change it is possible to use kthread_create()
>at any time, but the caller will sleep until rest_init() creates
>kthreadd.
>


What a nice patch!

Thanks!

>Oleg.
>
> init/main.c      |    5 +----
> kernel/kthread.c |   30 ++++++++++++++++++------------
> 2 files changed, 19 insertions(+), 16 deletions(-)
>
>
>--- a/init/main.c
>+++ b/init/main.c
>@@ -449,12 +449,9 @@ static void __init setup_command_line(ch
> static noinline void __init_refok rest_init(void)
> 	__releases(kernel_lock)
> {
>-	int pid;
>-
> 	kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
> 	numa_default_policy();
>-	pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
>-	kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
>+	kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
> 	unlock_kernel();
> 
> 	/*
>--- a/kernel/kthread.c
>+++ b/kernel/kthread.c
>@@ -128,8 +128,14 @@ struct task_struct *kthread_create(int (
> 	spin_lock(&kthread_create_lock);
> 	list_add_tail(&create.list, &kthread_create_list);
> 	spin_unlock(&kthread_create_lock);
>-
>-	wake_up_process(kthreadd_task);
>+	/*
>+	 * If kthreadd was not created yet, kthreadd() must see the result
>+	 * of list_add_tail() later, it takes kthread_create_lock before the
>+	 * first schedule(). If kthreadd() locked kthread_create_lock at
>+	 * least once, we must see kthreadd_task != NULL.
>+	 */
>+	if (likely(kthreadd_task))
>+		wake_up_process(kthreadd_task);
> 	wait_for_completion(&create.done);
> 
> 	if (!IS_ERR(create.result)) {
>@@ -216,23 +222,18 @@ EXPORT_SYMBOL(kthread_stop);
> 
> int kthreadd(void *unused)
> {
>-	struct task_struct *tsk = current;
>+	kthreadd_task = current;
> 
> 	/* Setup a clean context for our children to inherit. */
>-	set_task_comm(tsk, "kthreadd");
>-	ignore_signals(tsk);
>-	set_user_nice(tsk, KTHREAD_NICE_LEVEL);
>-	set_cpus_allowed_ptr(tsk, cpu_all_mask);
>+	set_task_comm(kthreadd_task, "kthreadd");
>+	ignore_signals(kthreadd_task);
>+	set_user_nice(kthreadd_task, KTHREAD_NICE_LEVEL);
>+	set_cpus_allowed_ptr(kthreadd_task, cpu_all_mask);
> 	set_mems_allowed(node_possible_map);
> 
> 	current->flags |= PF_NOFREEZE | PF_FREEZER_NOSIG;
> 
> 	for (;;) {
>-		set_current_state(TASK_INTERRUPTIBLE);
>-		if (list_empty(&kthread_create_list))
>-			schedule();
>-		__set_current_state(TASK_RUNNING);
>-
> 		spin_lock(&kthread_create_lock);
> 		while (!list_empty(&kthread_create_list)) {
> 			struct kthread_create_info *create;
>@@ -247,6 +248,11 @@ int kthreadd(void *unused)
> 			spin_lock(&kthread_create_lock);
> 		}
> 		spin_unlock(&kthread_create_lock);
>+
>+		set_current_state(TASK_INTERRUPTIBLE);
>+		if (list_empty(&kthread_create_list))
>+			schedule();
>+		__set_current_state(TASK_RUNNING);
> 	}
> 
> 	return 0;
>
>--
>To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>the body of a message to majordomo@vger.kernel.org
>More majordomo info at  http://vger.kernel.org/majordomo-info.html
>Please read the FAQ at  http://www.tux.org/lkml/

-- 
Live like a child, think like the god.
 

  parent reply	other threads:[~2009-09-01 15:05 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-08-29 16:27 [PATCH] x86: detect stack protector for i386 builds on x86_64 Michal Schmidt
2009-08-30 13:39 ` Américo Wang
2009-08-30 18:43 ` [tip:x86/asm] x86: Detect " tip-bot for Michal Schmidt
2009-09-01 10:03   ` Ingo Molnar
2009-09-01 11:39     ` [PATCH] kthreads: Fix startup synchronization boot crash Ingo Molnar
2009-09-01 13:04       ` Oleg Nesterov
2009-09-01 13:14         ` Ingo Molnar
2009-09-01 13:37           ` Oleg Nesterov
2009-09-01 13:59             ` Ingo Molnar
2009-09-01 14:55               ` Oleg Nesterov
2009-09-01 15:54                 ` Ingo Molnar
2009-09-01 16:00                   ` Oleg Nesterov
2009-09-02 13:06                     ` Ingo Molnar
2009-09-01 16:52                 ` [PATCH 0/1] kthreads: simplify !kthreadd_task logic, kill kthreadd_task_init_done Oleg Nesterov
2009-09-01 16:53                   ` [PATCH 1/1] " Oleg Nesterov
2009-09-01 23:22                   ` [PATCH 0/1] " Eric W. Biederman
2009-09-02  9:13                     ` Oleg Nesterov
2009-09-04  7:37                       ` Ingo Molnar
2009-09-18 16:32                         ` Wu Fei
2009-09-18 18:54                           ` Oleg Nesterov
2009-09-18 19:17                             ` Linus Torvalds
2009-09-18 21:12                               ` Oleg Nesterov
2009-09-18 21:15                                 ` Oleg Nesterov
2009-09-18 22:06                                 ` Linus Torvalds
2009-09-18 23:11                                   ` Eric W. Biederman
2009-09-18 23:22                                   ` Oleg Nesterov
2009-09-18 23:38                                     ` Linus Torvalds
2009-09-01 15:08             ` Américo Wang [this message]
2009-09-01 15:19               ` [PATCH] kthreads: Fix startup synchronization boot crash Oleg Nesterov
2009-08-31  6:21 ` [PATCH] x86: detect stack protector for i386 builds on x86_64 Tejun Heo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090901150848.GB5394@hack \
    --to=xiyou.wangcong@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=arjan@infradead.org \
    --cc=hpa@zytor.com \
    --cc=jeremy@goop.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=mingo@redhat.com \
    --cc=mschmidt@redhat.com \
    --cc=oleg@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.