All of lore.kernel.org
 help / color / mirror / Atom feed
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.


  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 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.