do_ptrace_resume(PTRACE_EVENT_VFORK) can't use ptrace_wake_up() because it clears context->stop_code.
Not good, we should follow the "force_wakeup" logic, and it is always good to consolidate the calls to utrace layer. Change ptrace_wake_up() to check "action != UTRACE_REPORT" and change do_ptrace_resume() to rely on ptrace_wake_up(). --- kernel/ptrace.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) --- PU/kernel/ptrace.c~101_RESUME_ALWAYS_USE_WAKEUP 2009-10-18 16:51:38.000000000 +0200 +++ PU/kernel/ptrace.c 2009-10-18 18:34:55.000000000 +0200 @@ -960,7 +960,8 @@ static void ptrace_wake_up(struct task_s } } - ptrace_context(engine)->stop_code = 0; + if (action != UTRACE_REPORT) + ptrace_context(engine)->stop_code = 0; utrace_control(tracee, engine, action); } @@ -975,8 +976,7 @@ static void do_ptrace_resume(struct utra case PTRACE_EVENT_VFORK: if (context->options & PTRACE_O_TRACEVFORKDONE) { set_stop_code(context, PTRACE_EVENT_VFORK_DONE); - utrace_control(tracee, engine, UTRACE_REPORT); - return; + action = UTRACE_REPORT; } break;