From: Oleg Nesterov <oleg@redhat.com>
To: Tejun Heo <tj@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
linux-kernel@vger.kernel.org, akpm@linux-foundation.org,
hch@infradead.org
Subject: Re: [PATCH 2/8] kill tracehook_notify_death()
Date: Thu, 23 Jun 2011 19:06:50 +0200 [thread overview]
Message-ID: <20110623170650.GA14601@redhat.com> (raw)
In-Reply-To: <20110623132831.GA11453@redhat.com>
On 06/23, Oleg Nesterov wrote:
>
> On 06/23, Tejun Heo wrote:
> >
> > Having subtle behavior change mixed with reorganization isn't too
> > nice, so I think separating is better.
>
> Hmm. OK, you are right. I'll redo.
------------------------------------------------------------------------------
[PATCH v2 2/8] kill tracehook_notify_death()
Kill tracehook_notify_death(), reimplement the logic in its caller,
exit_notify().
Also, change the exec_id's check to use thread_group_leader() instead
of task_detached(), this is more clear. This logic only applies to
the exiting leader, a sub-thread must never change its exit_signal.
Note: when the traced group leader exits the exit_signal-or-SIGCHLD
logic looks really strange:
- we notify the tracer even if !thread_group_empty() but
do_wait(WEXITED) can't work until all threads exit
- if the tracer is real_parent, it is not clear why can't
we use ->exit_signal event if !thread_group_empty()
-v2: do not try to fix the 2nd oddity to avoid the subtle behavior
change mixed with reorganization, suggested by Tejun.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
include/linux/tracehook.h | 34 ----------------------------------
kernel/exit.c | 21 +++++++++++++--------
2 files changed, 13 insertions(+), 42 deletions(-)
--- ptrace/include/linux/tracehook.h~2_kill_notify_death 2011-06-22 22:47:04.000000000 +0200
+++ ptrace/include/linux/tracehook.h 2011-06-22 22:47:11.000000000 +0200
@@ -152,40 +152,6 @@ static inline void tracehook_signal_hand
ptrace_notify(SIGTRAP);
}
-#define DEATH_REAP -1
-#define DEATH_DELAYED_GROUP_LEADER -2
-
-/**
- * tracehook_notify_death - task is dead, ready to notify parent
- * @task: @current task now exiting
- * @death_cookie: value to pass to tracehook_report_death()
- * @group_dead: nonzero if this was the last thread in the group to die
- *
- * A return value >= 0 means call do_notify_parent() with that signal
- * number. Negative return value can be %DEATH_REAP to self-reap right
- * now, or %DEATH_DELAYED_GROUP_LEADER to a zombie without notifying our
- * parent. Note that a return value of 0 means a do_notify_parent() call
- * that sends no signal, but still wakes up a parent blocked in wait*().
- *
- * Called with write_lock_irq(&tasklist_lock) held.
- */
-static inline int tracehook_notify_death(struct task_struct *task,
- void **death_cookie, int group_dead)
-{
- if (task_detached(task))
- return task->ptrace ? SIGCHLD : DEATH_REAP;
-
- /*
- * If something other than our normal parent is ptracing us, then
- * send it a SIGCHLD instead of honoring exit_signal. exit_signal
- * only has special meaning to our real parent.
- */
- if (thread_group_empty(task) && !ptrace_reparented(task))
- return task->exit_signal;
-
- return task->ptrace ? SIGCHLD : DEATH_DELAYED_GROUP_LEADER;
-}
-
#ifdef TIF_NOTIFY_RESUME
/**
* set_notify_resume - cause tracehook_notify_resume() to be called
--- ptrace/kernel/exit.c~2_kill_notify_death 2011-06-22 22:47:11.000000000 +0200
+++ ptrace/kernel/exit.c 2011-06-23 18:33:59.000000000 +0200
@@ -818,9 +818,7 @@ static void forget_original_parent(struc
*/
static void exit_notify(struct task_struct *tsk, int group_dead)
{
- int signal;
bool autoreap;
- void *cookie;
/*
* This does two things:
@@ -851,16 +849,23 @@ static void exit_notify(struct task_stru
* we have changed execution domain as these two values started
* the same after a fork.
*/
- if (tsk->exit_signal != SIGCHLD && !task_detached(tsk) &&
+ if (thread_group_leader(tsk) && tsk->exit_signal != SIGCHLD &&
(tsk->parent_exec_id != tsk->real_parent->self_exec_id ||
tsk->self_exec_id != tsk->parent_exec_id))
tsk->exit_signal = SIGCHLD;
- signal = tracehook_notify_death(tsk, &cookie, group_dead);
- if (signal >= 0)
- autoreap = do_notify_parent(tsk, signal);
- else
- autoreap = (signal == DEATH_REAP);
+ if (unlikely(tsk->ptrace)) {
+ int sig = thread_group_leader(tsk) &&
+ thread_group_empty(tsk) &&
+ !ptrace_reparented(tsk) ?
+ tsk->exit_signal : SIGCHLD;
+ autoreap = do_notify_parent(tsk, sig);
+ } else if (thread_group_leader(tsk)) {
+ autoreap = thread_group_empty(tsk) &&
+ do_notify_parent(tsk, tsk->exit_signal);
+ } else {
+ autoreap = true;
+ }
tsk->exit_state = autoreap ? EXIT_DEAD : EXIT_ZOMBIE;
next prev parent reply other threads:[~2011-06-23 17:09 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-17 14:50 [PATCHSET] ptrace: kill most tracehooks Tejun Heo
2011-06-17 14:50 ` [PATCH 1/7] ptrace: kill task_ptrace() Tejun Heo
2011-06-17 14:50 ` [PATCH 2/7] ptrace: introduce ptrace_event_enabled() and simplify ptrace_event() and tracehook_prepare_clone() Tejun Heo
2011-06-17 14:50 ` [PATCH 3/7] ptrace: move SIGTRAP on exec(2) logic to ptrace_event() Tejun Heo
2011-06-20 20:25 ` Oleg Nesterov
2011-06-21 7:21 ` Tejun Heo
2011-06-21 20:40 ` Oleg Nesterov
2011-06-23 8:58 ` Tejun Heo
2011-06-17 14:50 ` [PATCH 4/7] ptrace: kill trivial tracehooks Tejun Heo
2011-06-17 14:50 ` [PATCH 5/7] ptrace: kill clone/exec tracehooks Tejun Heo
2011-06-20 20:33 ` Oleg Nesterov
2011-06-21 7:24 ` Tejun Heo
2011-06-17 14:50 ` [PATCH 6/7] ptrace: kill detah tracehooks Tejun Heo
2011-06-20 19:39 ` Oleg Nesterov
2011-06-21 20:23 ` Oleg Nesterov
2011-06-23 9:24 ` Tejun Heo
2011-06-22 21:07 ` [PATCH 0/8] kill task_detached() (Was: ptrace: kill detah tracehooks) Oleg Nesterov
2011-06-22 21:08 ` [PATCH 1/8] make do_notify_parent() return bool Oleg Nesterov
2011-06-23 9:52 ` Tejun Heo
2011-06-22 21:08 ` [PATCH 2/8] kill tracehook_notify_death() Oleg Nesterov
2011-06-23 12:22 ` Tejun Heo
2011-06-23 13:21 ` Oleg Nesterov
2011-06-23 13:27 ` Tejun Heo
2011-06-23 13:28 ` Oleg Nesterov
2011-06-23 17:06 ` Oleg Nesterov [this message]
2011-06-25 14:15 ` Tejun Heo
2011-06-26 20:51 ` Oleg Nesterov
2011-06-27 8:24 ` Tejun Heo
2011-06-27 14:21 ` Oleg Nesterov
2011-06-27 14:36 ` Tejun Heo
2011-06-22 21:08 ` [PATCH 3/8] __ptrace_detach: avoid task_detached(), check do_notify_parent() Oleg Nesterov
2011-06-23 13:25 ` Tejun Heo
2011-06-22 21:09 ` [PATCH 4/8] make do_notify_parent() __must_check, update the callers Oleg Nesterov
2011-06-23 13:38 ` Tejun Heo
2011-06-22 21:09 ` [PATCH 5/8] reparent_leader: check EXIT_DEAD instead of task_detached() Oleg Nesterov
2011-06-22 21:09 ` [PATCH 6/8] kill task_detached() Oleg Nesterov
2011-06-22 21:10 ` [PATCH 7/8] do not change dead_task->exit_signal Oleg Nesterov
2011-06-22 21:10 ` [PATCH 8/8] redefine thread_group_leader() as exit_signal >= 0 Oleg Nesterov
2011-06-23 13:56 ` Tejun Heo
2011-06-17 14:50 ` [PATCH 7/7] ptrace: s/tracehook_tracer_task()/ptrace_parent()/ Tejun Heo
2011-06-20 20:16 ` Oleg Nesterov
2011-06-21 11:44 ` John Johansen
2011-06-23 9:14 ` Tejun Heo
2011-06-20 11:16 ` [PATCHSET] ptrace: kill most tracehooks Christoph Hellwig
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=20110623170650.GA14601@redhat.com \
--to=oleg@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=hch@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=tj@kernel.org \
--cc=torvalds@linux-foundation.org \
/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.