Commit 3e8671e0 authored by Peter Zijlstra's avatar Peter Zijlstra
Browse files

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: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: default avatarRavi Bangoria <ravi.bangoria@amd.com>
Link: https://lkml.kernel.org/r/20250307193723.151721102@infradead.org
parent 59f3aa4a
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -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 @@ int perf_event_release_kernel(struct perf_event *event)
					       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