diff options
author | Tejun Heo <tj@kernel.org> | 2011-06-02 05:14:00 -0400 |
---|---|---|
committer | Oleg Nesterov <oleg@redhat.com> | 2011-06-04 12:17:11 -0400 |
commit | 62c124ff3bcdb414af635c2bf822c9e4f2a5abfa (patch) | |
tree | 5d279211e098d24245d49e394d84aa8cfdb6f277 /kernel/signal.c | |
parent | 7dd3db54e77d21eb95e145f19ba53f68250d0e73 (diff) |
ptrace: use bit_waitqueue for TRAPPING instead of wait_chldexit
ptracer->signal->wait_chldexit was used to wait for TRAPPING; however,
->wait_chldexit was already complicated with waker-side filtering
without adding TRAPPING wait on top of it. Also, it unnecessarily
made TRAPPING clearing depend on the current ptrace relationship - if
the ptracee is detached, wakeup is lost.
There is no reason to use signal->wait_chldexit here. We're just
waiting for JOBCTL_TRAPPING bit to clear and given the relatively
infrequent use of ptrace, bit_waitqueue can serve it perfectly.
This patch makes JOBCTL_TRAPPING wait use bit_waitqueue instead of
signal->wait_chldexit.
-v2: Use JOBCTL_*_BIT macros instead of ilog2() as suggested by Linus.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Diffstat (limited to 'kernel/signal.c')
-rw-r--r-- | kernel/signal.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index 9ab91c516c3f..172a4c79f12c 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -272,8 +272,7 @@ static void task_clear_jobctl_trapping(struct task_struct *task) | |||
272 | { | 272 | { |
273 | if (unlikely(task->jobctl & JOBCTL_TRAPPING)) { | 273 | if (unlikely(task->jobctl & JOBCTL_TRAPPING)) { |
274 | task->jobctl &= ~JOBCTL_TRAPPING; | 274 | task->jobctl &= ~JOBCTL_TRAPPING; |
275 | __wake_up_sync_key(&task->parent->signal->wait_chldexit, | 275 | wake_up_bit(&task->jobctl, JOBCTL_TRAPPING_BIT); |
276 | TASK_UNINTERRUPTIBLE, 1, task); | ||
277 | } | 276 | } |
278 | } | 277 | } |
279 | 278 | ||