From: Oleg Nesterov <oleg@redhat.com>
To: akpm@linux-foundation.org
Cc: linux-kernel@vger.kernel.org, roland@redhat.com, mingo@elte.hu,
rnalumasu@gmail.com
Subject: Re: + do_wait-wakeup-optimization.patch added to -mm tree
Date: Sun, 23 Nov 2008 22:39:29 +0100 [thread overview]
Message-ID: <20081123213929.GA9097@redhat.com> (raw)
In-Reply-To: <200811212015.mALKFMs4019558@imap1.linux-foundation.org>
> From: Roland McGrath <roland@redhat.com>
>
> +static int needs_wakeup(struct task_struct *task, struct do_wait_queue_entry *w)
> +{
> + if ((w->options & __WNOTHREAD) && task->parent != w->wq.private)
> + return 0;
> +
> + if (eligible_child(w->type, w->pid, w->options,
> + task, task->exit_signal))
> + return 1;
> +
> + if (thread_group_leader(task)) {
> + /*
> + * In a group leader, do_notify_parent() may have
> + * just reset task->exit_signal because SIGCHLD was
> + * ignored, but that doesn't prevent the wakeup.
> + */
> + if (!task_detached(task) ||
> + !eligible_child(w->type, w->pid, w->options,
> + task, SIGCHLD))
> + return 0;
> + } else {
> + /*
> + * In a non-leader, this might be the release_task()
> + * case, where it's the leader rather than task
> + * whose parent is being woken.
> + */
> + if (!eligible_child(w->type, w->pid, w->options,
> + task->group_leader,
> + task_detached(task->group_leader) ?
> + SIGCHLD : task->group_leader->exit_signal))
> + return 0;
> + }
> +
> + return 1;
> +}
Unless I missed something, this is not right.
This "task" is current, iow it is the caller of do_notify_parent(). Sometime
it is OK (release_task, exit_notify), but in general not, afaics.
Let's suppose the ptracer finds the EXIT_ZOMBIE tracee and notifies its
->real_parent which sleeps in do_wait(). In that case the usage of
eligible_child(task == ptracer) above is bogus, and checking for
group_leader is not rifgt too.
> +static int do_wait_wake_function(wait_queue_t *curr, unsigned mode, int sync,
> + void *key)
> +{
> + struct task_struct *task = current;
I think we can fix (and simplify) this code if we change __wake_up_parent(),
it should call __wake_up(key => p), so we can do
struct task_struct *task = key;
> + if (!needs_wakeup(task, w))
> + return 0;
> +
> + return default_wake_function(curr, mode, sync, key);
perhaps autoremove_wake_function() makes more sense.
Oleg.
next prev parent reply other threads:[~2008-11-23 20:39 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-11-21 20:15 + do_wait-wakeup-optimization.patch added to -mm tree akpm
2008-11-23 21:39 ` Oleg Nesterov [this message]
2008-11-23 21:55 ` do_wait() vs do_notify_parent_cldstop() theoretical race? Oleg Nesterov
2008-11-24 7:31 ` Roland McGrath
2008-12-04 1:05 ` Roland McGrath
2008-11-24 7:26 ` + do_wait-wakeup-optimization.patch added to -mm tree Roland McGrath
2008-12-04 15:26 ` Oleg Nesterov
2008-12-04 20:59 ` Roland McGrath
2008-12-04 1:06 ` Roland McGrath
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=20081123213929.GA9097@redhat.com \
--to=oleg@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=rnalumasu@gmail.com \
--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.