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 70612c19ac96..a1b18c03b4c0 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 | } |
@@ -1090,10 +1093,6 @@ NORET_TYPE void do_exit(long code) | |||
1090 | tsk->mempolicy = NULL; | 1093 | tsk->mempolicy = NULL; |
1091 | #endif | 1094 | #endif |
1092 | #ifdef CONFIG_FUTEX | 1095 | #ifdef CONFIG_FUTEX |
1093 | /* | ||
1094 | * This must happen late, after the PID is not | ||
1095 | * hashed anymore: | ||
1096 | */ | ||
1097 | if (unlikely(!list_empty(&tsk->pi_state_list))) | 1096 | if (unlikely(!list_empty(&tsk->pi_state_list))) |
1098 | exit_pi_state_list(tsk); | 1097 | exit_pi_state_list(tsk); |
1099 | if (unlikely(current->pi_state_cache)) | 1098 | if (unlikely(current->pi_state_cache)) |
@@ -1360,6 +1359,12 @@ static int wait_task_zombie(struct task_struct *p, int options, | |||
1360 | */ | 1359 | */ |
1361 | read_unlock(&tasklist_lock); | 1360 | read_unlock(&tasklist_lock); |
1362 | 1361 | ||
1362 | /* | ||
1363 | * Flush inherited counters to the parent - before the parent | ||
1364 | * gets woken up by child-exit notifications. | ||
1365 | */ | ||
1366 | perf_counter_exit_task(p); | ||
1367 | |||
1363 | retval = ru ? getrusage(p, RUSAGE_BOTH, ru) : 0; | 1368 | retval = ru ? getrusage(p, RUSAGE_BOTH, ru) : 0; |
1364 | status = (p->signal->flags & SIGNAL_GROUP_EXIT) | 1369 | status = (p->signal->flags & SIGNAL_GROUP_EXIT) |
1365 | ? p->signal->group_exit_code : p->exit_code; | 1370 | ? p->signal->group_exit_code : p->exit_code; |