|
@@ -10415,6 +10415,17 @@ void perf_event_free_task(struct task_struct *task)
|
|
|
continue;
|
|
|
|
|
|
mutex_lock(&ctx->mutex);
|
|
|
+ raw_spin_lock_irq(&ctx->lock);
|
|
|
+ /*
|
|
|
+ * Destroy the task <-> ctx relation and mark the context dead.
|
|
|
+ *
|
|
|
+ * This is important because even though the task hasn't been
|
|
|
+ * exposed yet the context has been (through child_list).
|
|
|
+ */
|
|
|
+ RCU_INIT_POINTER(task->perf_event_ctxp[ctxn], NULL);
|
|
|
+ WRITE_ONCE(ctx->task, TASK_TOMBSTONE);
|
|
|
+ put_task_struct(task); /* cannot be last */
|
|
|
+ raw_spin_unlock_irq(&ctx->lock);
|
|
|
again:
|
|
|
list_for_each_entry_safe(event, tmp, &ctx->pinned_groups,
|
|
|
group_entry)
|