|
@@ -926,10 +926,14 @@ static int de_thread(struct task_struct *tsk)
|
|
|
if (!thread_group_leader(tsk)) {
|
|
|
struct task_struct *leader = tsk->group_leader;
|
|
|
|
|
|
- sig->notify_count = -1; /* for exit_notify() */
|
|
|
for (;;) {
|
|
|
threadgroup_change_begin(tsk);
|
|
|
write_lock_irq(&tasklist_lock);
|
|
|
+ /*
|
|
|
+ * Do this under tasklist_lock to ensure that
|
|
|
+ * exit_notify() can't miss ->group_exit_task
|
|
|
+ */
|
|
|
+ sig->notify_count = -1;
|
|
|
if (likely(leader->exit_state))
|
|
|
break;
|
|
|
__set_current_state(TASK_KILLABLE);
|