From: Guillaume Morin <guillaume@morinfr.org>
To: Oleg Nesterov <oleg@redhat.com>
Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org,
matt.helsley@gmail.com, davem@davemloft.net,
guillaume@morinfr.org
Subject: Re: + exitc-call-proc_exit_connector-after-exit_state-is-set.patch added to -mm tree
Date: Thu, 27 Feb 2014 15:48:27 +0100 [thread overview]
Message-ID: <20140227144826.GA13313@bender.morinfr.org> (raw)
In-Reply-To: <20140225151043.GA24546@redhat.com>
On 25 Feb 16:10, Oleg Nesterov wrote:
> > pid_t pid = fork();
> > if (pid > 0) {
> > register_interest_for_pid(pid);
> > if (waitpid(pid, NULL, WNOHANG) > 0)
> > {
> > /* We might have raced with exit() */
> > }
>
> Just in case... Even with this patch the code above is still "racy" if the
> child is multi-threaded. Plus it should obviously filter-out subthreads.
> And afaics there is no way to make it reliable, even if you change the
> code above so that waitpid() is called only after the last thread exits
> WNOHANG still can fail.
> Not that I am not arguing with this change. Although I hope that someone
> can confirm that netlink_broadcast() is safe even if release_task(current)
> was already called, so that the caller has no pids, sighand, is not visible
> via /proc/, etc.
I was too succinct, I think. What I am trying to do is to close a race
when a short-lived *process* dies before register_interest_for_pid()
interprets the connector message correctly, (i.e realizes this is an
exit message for a pid that the parent created).
For example, let's say that the parent has an independent thread that
just reads from the netlink socket or uses a BPF filter to see only the
events it cares about. In that case, it's possible that the exit
connector message will be discarded (either by a reader thread or the
BPF filter) before the parent realizes it should care about messages
about a new pid (the child pid)
You clarified for me that a ptraced process is a case where this race
could still happen. That's a good point. Fortunately, in the case of a
short-lived process, this is not a common scenario.
If we ignore the ptrace() case, I am not sure I see the problem with
multithreaded processes. Even if the main thread exits right away, what is
important is that:
- *either* the exit connector message of the last thread that dies is be
seen after register_interest_for_pid completes
- *or* that waitpid(WNOHANG) succeeds right after
register_interest_for_pid()
You seem to say it's possible for all threads to have completed
exit_notify() and sent their exit message to the connector before
register_interest_for_pid() does its job and still have waitpid(WNOHANG)
fails. Is it correct? If so, could you give a bit more details on how
this could happen?
My understanding is that if all threads exited before waitpid() is
called, exit->state will be set to EXIT_ZOMBIE for the pid and that
delay_group_leader() will be false (because all sub-threads have
exited), so that waitpid(WNOHANG) will successfully reap the process.
What am I missing?
Guillaume.
--
Guillaume Morin <guillaume@morinfr.org>
next prev parent reply other threads:[~2014-02-27 14:48 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-24 21:53 + exitc-call-proc_exit_connector-after-exit_state-is-set.patch added to -mm tree akpm
2014-02-25 15:10 ` Oleg Nesterov
2014-02-27 14:48 ` Guillaume Morin [this message]
2014-02-27 16:47 ` Oleg Nesterov
2014-02-27 18:26 ` Guillaume Morin
2014-02-27 19:06 ` Oleg Nesterov
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=20140227144826.GA13313@bender.morinfr.org \
--to=guillaume@morinfr.org \
--cc=akpm@linux-foundation.org \
--cc=davem@davemloft.net \
--cc=linux-kernel@vger.kernel.org \
--cc=matt.helsley@gmail.com \
--cc=oleg@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.