mirror of https://lore.kernel.org/lkml/
 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome