Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx> --- kernel/events/core.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -4757,11 +4757,14 @@ find_get_context(struct task_struct *tas return ERR_PTR(err); } +/* + * Returns a matching perf_event_pmu_context with elevated refcount or NULL. + */ static struct perf_event_pmu_context * find_get_pmu_context(struct pmu *pmu, struct perf_event_context *ctx, struct perf_event *event) { - struct perf_event_pmu_context *new = NULL, *epc; + struct perf_event_pmu_context *epc; void *task_ctx_data = NULL; if (!ctx->task) { @@ -4788,16 +4791,14 @@ find_get_pmu_context(struct pmu *pmu, st return epc; } - new = kzalloc(sizeof(*epc), GFP_KERNEL); + void *new __free(kfree) = kzalloc(sizeof(*epc), GFP_KERNEL); if (!new) - return ERR_PTR(-ENOMEM); + return NULL; if (event->attach_state & PERF_ATTACH_TASK_DATA) { task_ctx_data = alloc_task_ctx_data(pmu); - if (!task_ctx_data) { - kfree(new); - return ERR_PTR(-ENOMEM); - } + if (!task_ctx_data) + return NULL; } __perf_init_event_pmu_context(new, pmu); @@ -4820,8 +4821,7 @@ find_get_pmu_context(struct pmu *pmu, st } } - epc = new; - new = NULL; + epc = no_free_ptr(new); list_add(&epc->pmu_ctx_entry, &ctx->pmu_ctx_list); epc->ctx = ctx; @@ -4835,7 +4835,6 @@ find_get_pmu_context(struct pmu *pmu, st raw_spin_unlock_irq(&ctx->lock); free_task_ctx_data(pmu, task_ctx_data); - kfree(new); return epc; }