[PATCH v3 36/57] perf: Simplify find_get_pmu_context()

From: Peter Zijlstra
Date: Mon Jun 12 2023 - 05:58:29 EST



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;
}