--- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -4816,6 +4816,7 @@ find_get_pmu_context(struct pmu *pmu, struct perf_event_context *ctx, raw_spin_lock_irq(&ctx->lock); list_add(&epc->pmu_ctx_entry, &ctx->pmu_ctx_list); epc->ctx = ctx; + get_ctx(ctx); raw_spin_unlock_irq(&ctx->lock); } else { WARN_ON_ONCE(epc->ctx != ctx); @@ -4862,6 +4863,7 @@ find_get_pmu_context(struct pmu *pmu, struct perf_event_context *ctx, list_add(&epc->pmu_ctx_entry, &ctx->pmu_ctx_list); epc->ctx = ctx; + get_ctx(&ctx); found_epc: if (task_ctx_data && !epc->task_ctx_data) { @@ -4913,6 +4915,7 @@ static void put_pmu_ctx(struct perf_event_pmu_context *epc) raw_spin_lock_irqsave(&ctx->lock, flags); list_del_init(&epc->pmu_ctx_entry); epc->ctx = NULL; + put_ctx(ctx); raw_spin_unlock_irqrestore(&ctx->lock, flags); }