diff options
Diffstat (limited to 'kernel/exit.c')
-rw-r--r-- | kernel/exit.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index f80dec3f1875..29f4b790751c 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -159,6 +159,9 @@ static void delayed_put_task_struct(struct rcu_head *rhp) | |||
159 | { | 159 | { |
160 | struct task_struct *tsk = container_of(rhp, struct task_struct, rcu); | 160 | struct task_struct *tsk = container_of(rhp, struct task_struct, rcu); |
161 | 161 | ||
162 | #ifdef CONFIG_PERF_COUNTERS | ||
163 | WARN_ON_ONCE(!list_empty(&tsk->perf_counter_ctx.counter_list)); | ||
164 | #endif | ||
162 | trace_sched_process_free(tsk); | 165 | trace_sched_process_free(tsk); |
163 | put_task_struct(tsk); | 166 | put_task_struct(tsk); |
164 | } | 167 | } |
@@ -1093,10 +1096,6 @@ NORET_TYPE void do_exit(long code) | |||
1093 | tsk->mempolicy = NULL; | 1096 | tsk->mempolicy = NULL; |
1094 | #endif | 1097 | #endif |
1095 | #ifdef CONFIG_FUTEX | 1098 | #ifdef CONFIG_FUTEX |
1096 | /* | ||
1097 | * This must happen late, after the PID is not | ||
1098 | * hashed anymore: | ||
1099 | */ | ||
1100 | if (unlikely(!list_empty(&tsk->pi_state_list))) | 1099 | if (unlikely(!list_empty(&tsk->pi_state_list))) |
1101 | exit_pi_state_list(tsk); | 1100 | exit_pi_state_list(tsk); |
1102 | if (unlikely(current->pi_state_cache)) | 1101 | if (unlikely(current->pi_state_cache)) |
@@ -1363,6 +1362,12 @@ static int wait_task_zombie(struct task_struct *p, int options, | |||
1363 | */ | 1362 | */ |
1364 | read_unlock(&tasklist_lock); | 1363 | read_unlock(&tasklist_lock); |
1365 | 1364 | ||
1365 | /* | ||
1366 | * Flush inherited counters to the parent - before the parent | ||
1367 | * gets woken up by child-exit notifications. | ||
1368 | */ | ||
1369 | perf_counter_exit_task(p); | ||
1370 | |||
1366 | retval = ru ? getrusage(p, RUSAGE_BOTH, ru) : 0; | 1371 | retval = ru ? getrusage(p, RUSAGE_BOTH, ru) : 0; |
1367 | status = (p->signal->flags & SIGNAL_GROUP_EXIT) | 1372 | status = (p->signal->flags & SIGNAL_GROUP_EXIT) |
1368 | ? p->signal->group_exit_code : p->exit_code; | 1373 | ? p->signal->group_exit_code : p->exit_code; |