aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--kernel/events/core.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c
index e4d7a0c4b308..1a19df9d54fd 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -1271,9 +1271,10 @@ static void put_ctx(struct perf_event_context *ctx)
if (ctx->task && ctx->task != TASK_TOMBSTONE)
put_task_struct(ctx->task);
call_rcu(&ctx->rcu_head, free_ctx);
- } else if (ctx->task == TASK_TOMBSTONE) {
- smp_mb(); /* pairs with wait_var_event() */
- wake_up_var(&ctx->refcount);
+ } else {
+ smp_mb__after_atomic(); /* pairs with wait_var_event() */
+ if (ctx->task == TASK_TOMBSTONE)
+ wake_up_var(&ctx->refcount);
}
}