2007-08-17 15:35:10

by Oleg Nesterov

[permalink] [raw]
Subject: [PATCH] wait_task_zombie: don't fight with non-existing race with a dying ptracee

(textually depends on wait_task_zombie-remove-unneeded-child-signal-check.patch)

The "p->exit_signal == -1 && p->ptrace == 0" check and the comment are bogus.
We already did exactly the same check in eligible_child(), we did not drop
tasklist_lock since then, and both variables need write_lock(tasklist) to be
changed.

Signed-off-by: Oleg Nesterov <[email protected]>

--- t/kernel/exit.c~1_WTZ_NORACE 2007-08-17 17:31:59.000000000 +0400
+++ t/kernel/exit.c 2007-08-17 18:56:31.000000000 +0400
@@ -1210,13 +1210,6 @@ static int wait_task_zombie(struct task_
BUG_ON(state != EXIT_DEAD);
return 0;
}
- if (unlikely(p->exit_signal == -1 && p->ptrace == 0)) {
- /*
- * This can only happen in a race with a ptraced thread
- * dying on another processor.
- */
- return 0;
- }

/* traced means p->ptrace, but not vice versa */
traced = (p->real_parent != p->parent);


2007-08-17 20:04:57

by Roland McGrath

[permalink] [raw]
Subject: Re: [PATCH] wait_task_zombie: don't fight with non-existing race with a dying ptracee

> (textually depends on wait_task_zombie-remove-unneeded-child-signal-check.patch)
>
> The "p->exit_signal == -1 && p->ptrace == 0" check and the comment are bogus.
> We already did exactly the same check in eligible_child(), we did not drop
> tasklist_lock since then, and both variables need write_lock(tasklist) to be
> changed.

I think this is correct. IIRC, when the check was added, ->ptrace could be
cleared some other way.


Thanks,
Roland