Skip to content

Commit

Permalink
ptrace: Participate in group stop from ptrace_stop() iff the task is …
Browse files Browse the repository at this point in the history
…trapping for group stop

Currently, ptrace_stop() unconditionally participates in group stop
bookkeeping.  This is unnecessary and inaccurate.  Make it only
participate if the task is trapping for group stop - ie. if @why is
CLD_STOPPED.  As ptrace_stop() currently is not used when trapping for
group stop, this equals to disabling group stop participation from
ptrace_stop().

A visible behavior change is increased likelihood of delayed group
stop completion if the thread group contains one or more ptraced
tasks.

This is to preapre for further cleanup of the interaction between
group stop and ptrace.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Oleg Nesterov <oleg@redhat.com>
Cc: Roland McGrath <roland@redhat.com>
  • Loading branch information
Tejun Heo committed Mar 23, 2011
1 parent 39efa3e commit 0ae8ce1
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions kernel/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -1694,10 +1694,13 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
}

/*
* If there is a group stop in progress,
* we must participate in the bookkeeping.
* If @why is CLD_STOPPED, we're trapping to participate in a group
* stop. Do the bookkeeping. Note that if SIGCONT was delievered
* while siglock was released for the arch hook, PENDING could be
* clear now. We act as if SIGCONT is received after TASK_TRACED
* is entered - ignore it.
*/
if (current->group_stop & GROUP_STOP_PENDING)
if (why == CLD_STOPPED && (current->group_stop & GROUP_STOP_PENDING))
task_participate_group_stop(current);

current->last_siginfo = info;
Expand Down

0 comments on commit 0ae8ce1

Please sign in to comment.