A mechanism to allow debuggers to learn about starting/dying tasks. Signed-Off-By: Jan Beulich Index: 2.6.14-nlkd/include/linux/sched.h =================================================================== --- 2.6.14-nlkd.orig/include/linux/sched.h 2005-11-09 10:40:17.000000000 +0100 +++ 2.6.14-nlkd/include/linux/sched.h 2005-11-04 16:19:34.000000000 +0100 @@ -34,6 +34,7 @@ #include #include #include +#include #include /* For AT_VECTOR_SIZE */ @@ -1109,6 +1110,11 @@ extern int do_execve(char *, char __user extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long, int __user *, int __user *); task_t *fork_idle(int); +#define TASK_NEW 1 +#define TASK_DELETE 2 + +extern struct notifier_block *task_notifier_list; + extern void set_task_comm(struct task_struct *tsk, char *from); extern void get_task_comm(char *to, struct task_struct *tsk); Index: 2.6.14-nlkd/kernel/fork.c =================================================================== --- 2.6.14-nlkd.orig/kernel/fork.c 2005-11-09 10:40:17.000000000 +0100 +++ 2.6.14-nlkd/kernel/fork.c 2005-11-04 16:19:34.000000000 +0100 @@ -64,6 +64,9 @@ DEFINE_PER_CPU(unsigned long, process_co EXPORT_SYMBOL(tasklist_lock); +struct notifier_block *task_notifier_list = NULL; +EXPORT_SYMBOL(task_notifier_list); + int nr_processes(void) { int cpu; @@ -108,6 +111,8 @@ EXPORT_SYMBOL(free_task); void __put_task_struct(struct task_struct *tsk) { + notifier_call_chain(&task_notifier_list, TASK_DELETE, tsk); + WARN_ON(!(tsk->exit_state & (EXIT_DEAD | EXIT_ZOMBIE))); WARN_ON(atomic_read(&tsk->usage)); WARN_ON(tsk == current); @@ -1279,6 +1284,8 @@ long do_fork(unsigned long clone_flags, set_tsk_thread_flag(p, TIF_SIGPENDING); } + notifier_call_chain(&task_notifier_list, TASK_NEW, p); + if (!(clone_flags & CLONE_STOPPED)) wake_up_new_task(p, clone_flags); else