perf: Simplify perf_event_release_kernel()
authorPeter Zijlstra <peterz@infradead.org>
Fri, 17 Jan 2025 14:31:49 +0000 (15:31 +0100)
committerPeter Zijlstra <peterz@infradead.org>
Tue, 8 Apr 2025 18:55:47 +0000 (20:55 +0200)
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
kernel/events/core.c

index fa6dab0..f75b0d3 100644 (file)
@@ -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