aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorRoland McGrath <roland@redhat.com>2008-07-25 22:45:54 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-07-26 15:00:09 -0400
commit2b2a1ff64afbadac842bbc58c5166962cf4f7664 (patch)
tree660640eb95117ce6f7436331f23f73805abced10 /include/linux
parentfa00b80b3c41a845b3d56f866fb40a2e98754c51 (diff)
tracehook: death
This moves the ptrace logic in task death (exit_notify) into tracehook.h inlines. Some code is rearranged slightly to make things nicer. There is no change, only cleanup. There is one hook called with the tasklist_lock write-locked, as ptrace needs. There is also a new hook called after exit_state changes and without locks. This is a better place for tracing work to be in the future, since it doesn't delay the whole system with locking. Signed-off-by: Roland McGrath <roland@redhat.com> Cc: Oleg Nesterov <oleg@tv-sign.ru> Reviewed-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/sched.h2
-rw-r--r--include/linux/tracehook.h52
2 files changed, 53 insertions, 1 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h
index adb8077dc463..a95d84d0da95 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1796,7 +1796,7 @@ extern int kill_pid_info_as_uid(int, struct siginfo *, struct pid *, uid_t, uid_
1796extern int kill_pgrp(struct pid *pid, int sig, int priv); 1796extern int kill_pgrp(struct pid *pid, int sig, int priv);
1797extern int kill_pid(struct pid *pid, int sig, int priv); 1797extern int kill_pid(struct pid *pid, int sig, int priv);
1798extern int kill_proc_info(int, struct siginfo *, pid_t); 1798extern int kill_proc_info(int, struct siginfo *, pid_t);
1799extern void do_notify_parent(struct task_struct *, int); 1799extern int do_notify_parent(struct task_struct *, int);
1800extern void force_sig(int, struct task_struct *); 1800extern void force_sig(int, struct task_struct *);
1801extern void force_sig_specific(int, struct task_struct *); 1801extern void force_sig_specific(int, struct task_struct *);
1802extern int send_sig(int, struct task_struct *, int); 1802extern int send_sig(int, struct task_struct *, int);
diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h
index 6dc428dd2f38..4c50e1b57349 100644
--- a/include/linux/tracehook.h
+++ b/include/linux/tracehook.h
@@ -471,4 +471,56 @@ static inline int tracehook_notify_jctl(int notify, int why)
471 return notify || (current->ptrace & PT_PTRACED); 471 return notify || (current->ptrace & PT_PTRACED);
472} 472}
473 473
474/**
475 * tracehook_notify_death - task is dead, ready to notify parent
476 * @task: @current task now exiting
477 * @death_cookie: value to pass to tracehook_report_death()
478 * @group_dead: nonzero if this was the last thread in the group to die
479 *
480 * Return the signal number to send our parent with do_notify_parent(), or
481 * zero to send no signal and leave a zombie, or -1 to self-reap right now.
482 *
483 * Called with write_lock_irq(&tasklist_lock) held.
484 */
485static inline int tracehook_notify_death(struct task_struct *task,
486 void **death_cookie, int group_dead)
487{
488 if (task->exit_signal == -1)
489 return task->ptrace ? SIGCHLD : -1;
490
491 /*
492 * If something other than our normal parent is ptracing us, then
493 * send it a SIGCHLD instead of honoring exit_signal. exit_signal
494 * only has special meaning to our real parent.
495 */
496 if (thread_group_empty(task) && !ptrace_reparented(task))
497 return task->exit_signal;
498
499 return task->ptrace ? SIGCHLD : 0;
500}
501
502/**
503 * tracehook_report_death - task is dead and ready to be reaped
504 * @task: @current task now exiting
505 * @signal: signal number sent to parent, or 0 or -1
506 * @death_cookie: value passed back from tracehook_notify_death()
507 * @group_dead: nonzero if this was the last thread in the group to die
508 *
509 * Thread has just become a zombie or is about to self-reap. If positive,
510 * @signal is the signal number just sent to the parent (usually %SIGCHLD).
511 * If @signal is -1, this thread will self-reap. If @signal is 0, this is
512 * a delayed_group_leader() zombie. The @death_cookie was passed back by
513 * tracehook_notify_death().
514 *
515 * If normal reaping is not inhibited, @task->exit_state might be changing
516 * in parallel.
517 *
518 * Called without locks.
519 */
520static inline void tracehook_report_death(struct task_struct *task,
521 int signal, void *death_cookie,
522 int group_dead)
523{
524}
525
474#endif /* <linux/tracehook.h> */ 526#endif /* <linux/tracehook.h> */