summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2025-01-17 15:31:49 +0100
committerPeter Zijlstra <peterz@infradead.org>2025-04-08 20:55:47 +0200
commit3e8671e00e57b3d006ed8ae5ef055807506e44b2 (patch)
tree28918866f0bba3ab80655de15ae75693a51dd6c5
parent59f3aa4a3ee27e96132e16d2d2bdc3acadb4bf79 (diff)
perf: Simplify perf_event_release_kernel()
There is no good reason to have the free list anymore. It is possible to call free_event() after the locks have been dropped in the main loop. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Ravi Bangoria <ravi.bangoria@amd.com> Link: https://lkml.kernel.org/r/20250307193723.151721102@infradead.org
-rw-r--r--kernel/events/core.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c
index fa6dab08be47..f75b0d38a40f 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -5696,7 +5696,6 @@ int perf_event_release_kernel(struct perf_event *event)
{
struct perf_event_context *ctx = event->ctx;
struct perf_event *child, *tmp;
- LIST_HEAD(free_list);
/*
* If we got here through err_alloc: free_event(event); we will not
@@ -5765,23 +5764,23 @@ again:
struct perf_event, child_list);
if (tmp == child) {
perf_remove_from_context(child, DETACH_GROUP | DETACH_CHILD);
- list_add(&child->child_list, &free_list);
+ } else {
+ child = NULL;
}
mutex_unlock(&event->child_mutex);
mutex_unlock(&ctx->mutex);
+
+ if (child) {
+ /* Last reference unless ->pending_task work is pending */
+ put_event(child);
+ }
put_ctx(ctx);
goto again;
}
mutex_unlock(&event->child_mutex);
- list_for_each_entry_safe(child, tmp, &free_list, child_list) {
- list_del(&child->child_list);
- /* Last reference unless ->pending_task work is pending */
- put_event(child);
- }
-
no_ctx:
/*
* Last reference unless ->pending_task work is pending on this event