From: Oleg Nesterov <oleg@redhat.com>
To: "Américo Wang" <xiyou.wangcong@gmail.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 17:19:26 +0200 [thread overview]
Message-ID: <20090901151926.GA32484@redhat.com> (raw)
In-Reply-To: <20090901150848.GB5394@hack>
On 09/01, Américo Wang wrote:
>
> 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 kthreadd() always takes kthread_create_lock before it
schedules.
IOW. Before the patch, kthreadd() does
for (;;) {
if (list_empty(kthread_create_list))
schedule();
lock(kthread_create_lock);
while (!list_empty(&kthread_create_list))
... create kthreads ...
unlock(kthread_create_lock);
}
This means kthread_create() can't do
if (!kthreadd_task)
wake_up_process(kthreadd_task);
we can read kthreadd_task before kthreadd() sets kthreadd_task = current,
and it is possible that kthreadd() has already checked list_empty() == T.
But if we shift schedule() down, so that kthreadd() does
for (;;) {
lock(kthread_create_lock);
while (!list_empty(&kthread_create_list))
... create kthreads ...
unlock(kthread_create_lock);
if (list_empty(kthread_create_list))
schedule();
}
Then we can rely on kthread_create_lock: either kthreadd must see the
addition to create_list, or kthreadd() must see kthreadd_task != NULL.
Because both checks, !kthreadd_task and list_empty(), are done after
lock+unlock of the same lock. The 2nd task which takes the lock must
see the changes which were done by the 1st task which locked this lock.
Do you see any holes?
Oleg.
next prev parent reply other threads:[~2009-09-01 15:24 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 ` [PATCH] kthreads: Fix startup synchronization boot crash Américo Wang
2009-09-01 15:19 ` Oleg Nesterov [this message]
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=20090901151926.GA32484@redhat.com \
--to=oleg@redhat.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=tglx@linutronix.de \
--cc=tj@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=xiyou.wangcong@gmail.com \
/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.