arch/i386/kernel/process.c | 8 -------- arch/ia64/kernel/process.c | 8 -------- arch/powerpc/kernel/process.c | 2 -- arch/x86_64/kernel/process.c | 8 -------- kernel/kprobes.c | 10 +++++----- kernel/sched.c | 9 ++++++++- 6 files changed, 13 insertions(+), 32 deletions(-) diff -Nruap linux-2.6.16-rc3.org/arch/i386/kernel/process.c linux-2.6.16-rc3/arch/i386/kernel/process.c --- linux-2.6.16-rc3.org/arch/i386/kernel/process.c 2006-02-14 05:46:38.000000000 +0800 +++ linux-2.6.16-rc3/arch/i386/kernel/process.c 2006-02-14 05:48:06.000000000 +0800 @@ -38,7 +38,6 @@ #include #include #include -#include #include #include @@ -364,13 +363,6 @@ void exit_thread(void) struct task_struct *tsk = current; struct thread_struct *t = &tsk->thread; - /* - * Remove function-return probe instances associated with this task - * and put them back on the free list. Do not insert an exit probe for - * this function, it will be disabled by kprobe_flush_task if you do. - */ - kprobe_flush_task(tsk); - /* The process may have allocated an io port bitmap... nuke it. */ if (unlikely(NULL != t->io_bitmap_ptr)) { int cpu = get_cpu(); diff -Nruap linux-2.6.16-rc3.org/arch/ia64/kernel/process.c linux-2.6.16-rc3/arch/ia64/kernel/process.c --- linux-2.6.16-rc3.org/arch/ia64/kernel/process.c 2006-02-14 05:46:38.000000000 +0800 +++ linux-2.6.16-rc3/arch/ia64/kernel/process.c 2006-02-14 05:48:40.000000000 +0800 @@ -30,7 +30,6 @@ #include #include #include -#include #include #include @@ -738,13 +737,6 @@ void exit_thread (void) { - /* - * Remove function-return probe instances associated with this task - * and put them back on the free list. Do not insert an exit probe for - * this function, it will be disabled by kprobe_flush_task if you do. - */ - kprobe_flush_task(current); - ia64_drop_fpu(current); #ifdef CONFIG_PERFMON /* if needed, stop monitoring and flush state to perfmon context */ diff -Nruap linux-2.6.16-rc3.org/arch/powerpc/kernel/process.c linux-2.6.16-rc3/arch/powerpc/kernel/process.c --- linux-2.6.16-rc3.org/arch/powerpc/kernel/process.c 2006-02-14 05:46:38.000000000 +0800 +++ linux-2.6.16-rc3/arch/powerpc/kernel/process.c 2006-02-14 05:49:33.000000000 +0800 @@ -37,7 +37,6 @@ #include #include #include -#include #include #include @@ -457,7 +456,6 @@ void show_regs(struct pt_regs * regs) void exit_thread(void) { - kprobe_flush_task(current); discard_lazy_cpu_state(); } diff -Nruap linux-2.6.16-rc3.org/arch/x86_64/kernel/process.c linux-2.6.16-rc3/arch/x86_64/kernel/process.c --- linux-2.6.16-rc3.org/arch/x86_64/kernel/process.c 2006-02-14 05:46:38.000000000 +0800 +++ linux-2.6.16-rc3/arch/x86_64/kernel/process.c 2006-02-14 05:50:02.000000000 +0800 @@ -35,7 +35,6 @@ #include #include #include -#include #include #include @@ -353,13 +352,6 @@ void exit_thread(void) struct task_struct *me = current; struct thread_struct *t = &me->thread; - /* - * Remove function-return probe instances associated with this task - * and put them back on the free list. Do not insert an exit probe for - * this function, it will be disabled by kprobe_flush_task if you do. - */ - kprobe_flush_task(me); - if (me->thread.io_bitmap_ptr) { struct tss_struct *tss = &per_cpu(init_tss, get_cpu()); diff -Nruap linux-2.6.16-rc3.org/kernel/kprobes.c linux-2.6.16-rc3/kernel/kprobes.c --- linux-2.6.16-rc3.org/kernel/kprobes.c 2006-02-14 05:46:38.000000000 +0800 +++ linux-2.6.16-rc3/kernel/kprobes.c 2006-02-14 08:16:55.000000000 +0800 @@ -323,10 +323,10 @@ struct hlist_head __kprobes *kretprobe_i } /* - * This function is called from exit_thread or flush_thread when task tk's - * stack is being recycled so that we can recycle any function-return probe - * instances associated with this task. These left over instances represent - * probed functions that have been called but will never return. + * This function is called from finish_task_switch when task tk becomes dead, + * so that we can recycle any function-return probe instances associated + * with this task. These left over instances represent probed functions + * that have been called but will never return. */ void __kprobes kprobe_flush_task(struct task_struct *tk) { @@ -336,7 +336,7 @@ void __kprobes kprobe_flush_task(struct unsigned long flags = 0; spin_lock_irqsave(&kretprobe_lock, flags); - head = kretprobe_inst_table_head(current); + head = kretprobe_inst_table_head(tk); hlist_for_each_entry_safe(ri, node, tmp, head, hlist) { if (ri->task == tk) recycle_rp_inst(ri); diff -Nruap linux-2.6.16-rc3.org/kernel/sched.c linux-2.6.16-rc3/kernel/sched.c --- linux-2.6.16-rc3.org/kernel/sched.c 2006-02-14 05:46:38.000000000 +0800 +++ linux-2.6.16-rc3/kernel/sched.c 2006-02-14 06:11:57.000000000 +0800 @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -1566,8 +1567,14 @@ static inline void finish_task_switch(ru finish_lock_switch(rq, prev); if (mm) mmdrop(mm); - if (unlikely(prev_task_flags & PF_DEAD)) + if (unlikely(prev_task_flags & PF_DEAD)){ + /* + * Remove function-return probe instances associated with this task + * and put them back on the free list. + */ + kprobe_flush_task(prev); put_task_struct(prev); + } } /**