@@ -1231,6 +1231,10 @@ static void put_ctx(struct perf_event_context *ctx)
12311231 * perf_event_context::lock
12321232 * perf_event::mmap_mutex
12331233 * mmap_sem
1234+ *
1235+ * cpu_hotplug_lock
1236+ * pmus_lock
1237+ * cpuctx->mutex / perf_event_context::mutex
12341238 */
12351239static struct perf_event_context *
12361240perf_event_ctx_lock_nested (struct perf_event * event , int nesting )
@@ -4196,6 +4200,7 @@ int perf_event_release_kernel(struct perf_event *event)
41964200{
41974201 struct perf_event_context * ctx = event -> ctx ;
41984202 struct perf_event * child , * tmp ;
4203+ LIST_HEAD (free_list );
41994204
42004205 /*
42014206 * If we got here through err_file: fput(event_file); we will not have
@@ -4268,8 +4273,7 @@ int perf_event_release_kernel(struct perf_event *event)
42684273 struct perf_event , child_list );
42694274 if (tmp == child ) {
42704275 perf_remove_from_context (child , DETACH_GROUP );
4271- list_del (& child -> child_list );
4272- free_event (child );
4276+ list_move (& child -> child_list , & free_list );
42734277 /*
42744278 * This matches the refcount bump in inherit_event();
42754279 * this can't be the last reference.
@@ -4284,6 +4288,11 @@ int perf_event_release_kernel(struct perf_event *event)
42844288 }
42854289 mutex_unlock (& event -> child_mutex );
42864290
4291+ list_for_each_entry_safe (child , tmp , & free_list , child_list ) {
4292+ list_del (& child -> child_list );
4293+ free_event (child );
4294+ }
4295+
42874296no_ctx :
42884297 put_event (event ); /* Must be the 'last' reference */
42894298 return 0 ;
0 commit comments