From: Oleg Nesterov <oleg@redhat.com>
To: Roland McGrath <roland@redhat.com>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org
Subject: eligible_child() && __WCLONE && task_detached() (Was: mmotm 2009-08-24-16-24 uploaded)
Date: Fri, 28 Aug 2009 19:17:24 +0200 [thread overview]
Message-ID: <20090828171724.GA17445@redhat.com> (raw)
In-Reply-To: <20090827105209.GA8469@redhat.com>
eligible_child:
/* Wait for all children (clone and not) if __WALL is set;
* otherwise, wait for clone children *only* if __WCLONE is
* set; otherwise, wait for non-clone children *only*. (Note:
* A "clone" child here is one that reports to its parent
* using a signal other than SIGCHLD.) */
if (((p->exit_signal != SIGCHLD) ^ !!(wo->wo_flags & __WCLONE))
&& !(wo->wo_flags & __WALL))
return 0;
I just can't understand what is the supposed behaviour when p is
sub-thread and p->exit_signal == -1.
This only matters when the caller is ptracer, and p is tracee. In
this case ptracer should use __WCLONE or __WALL, this doesn't look
very logical. Firstly, the comment says
* A "clone" child here is one that reports to its parent
* using a signal other than SIGCHLD.
but, unless ptraced, sub-thread reports nothing to ->parent.
IOW, perhaps this check should be
if (!task_detached(p) && !(wo->wo_flags & __WALL) &&
(p->exit_signal != SIGCHLD) ^ !!(wo->wo_flags & __WCLONE))
return 0;
?
When task_detached(p) == T, "p->exit_signal != SIGCHLD" looks like a
false positive to me. Because -1 is not a siganl, this is a marker
which indicates the deatached task - sub-thread or EXIT_DEAD. It _seems_
to me this check was added when threads were processes, and it was
possible to wait/reap a thread, not process.
In short. If ptracer calls wait4(ptraced_sub_thread), is it really
supposed it must use __WCLONE || __WALL?
(this check also breaks child_wait_callback() logic in
do_wait-wakeup-optimization-change-__wake_up_parent-to-use-filtered-wakeup.patch
but we can fix this in many ways. Just I am not sure _what_ should be
fixed)
Oleg.
On 08/27, Oleg Nesterov wrote:
>
> On 08/27, KAMEZAWA Hiroyuki wrote:
> >
> > On Thu, 27 Aug 2009 12:08:46 +0200
> > Oleg Nesterov <oleg@redhat.com> wrote:
> >
> > >
> > > OK, I seem to understand what happens. Could you try the patch below?
> > >
> >
> > worked.
>
> Thanks. I need to think a bit, then I send the fix.
>
> > IMHO, it's necessary to "wake up parent with -ECHILD if all children dies"
>
> Of course! It was supposed to do. More precisely, we should wake up when
> any child which cuould be interesting to ->parent dies. No need to check
> "all children died" case specially. If parent sleeps on ->wait_chldexit
> there must be at least on eligible child.
>
> The problem is, do_notify_parent() changes ->exit_signal _before_ it calls
> __wake_up_parent(). This changes the result of eligible_child().
>
> Oleg.
next prev parent reply other threads:[~2009-08-28 17:21 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-24 23:28 mmotm 2009-08-24-16-24 uploaded akpm
2009-08-25 10:02 ` KAMEZAWA Hiroyuki
2009-08-26 4:52 ` Amerigo Wang
2009-08-26 6:54 ` KAMEZAWA Hiroyuki
2009-08-26 3:15 ` KAMEZAWA Hiroyuki
2009-08-26 3:36 ` Andrew Morton
2009-08-26 3:44 ` KAMEZAWA Hiroyuki
2009-08-27 5:44 ` KAMEZAWA Hiroyuki
2009-08-27 6:17 ` Hiroshi Shimamoto
2009-08-27 6:31 ` KAMEZAWA Hiroyuki
2009-08-27 7:05 ` KAMEZAWA Hiroyuki
2009-08-27 9:34 ` Oleg Nesterov
2009-08-27 9:43 ` KAMEZAWA Hiroyuki
2009-08-27 10:08 ` Oleg Nesterov
2009-08-27 10:31 ` KAMEZAWA Hiroyuki
2009-08-27 10:52 ` Oleg Nesterov
2009-08-28 17:17 ` Oleg Nesterov [this message]
2009-08-28 19:16 ` eligible_child() && __WCLONE && task_detached() (Was: mmotm 2009-08-24-16-24 uploaded) Roland McGrath
2009-09-01 12:22 ` [PATCH -mm 0/2] fix do_wait(!__WALL) hang " Oleg Nesterov
2009-09-01 12:23 ` [PATCH -mm 1/2] do_wait-wakeup-optimization: fix child_wait_callback()->eligible_child() usage Oleg Nesterov
2009-09-10 0:36 ` KAMEZAWA Hiroyuki
2009-09-01 12:24 ` [PATCH -mm 2/2] do_wait-wakeup-optimization: simplify task_pid_type() Oleg Nesterov
2009-08-27 10:17 ` mmotm 2009-08-24-16-24 uploaded KAMEZAWA Hiroyuki
2009-08-27 9:37 ` KAMEZAWA Hiroyuki
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=20090828171724.GA17445@redhat.com \
--to=oleg@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=roland@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome