@@ -1231,6 +1231,10 @@ static void put_ctx(struct perf_event_context *ctx)
1231
1231
* perf_event_context::lock
1232
1232
* perf_event::mmap_mutex
1233
1233
* mmap_sem
1234
+ *
1235
+ * cpu_hotplug_lock
1236
+ * pmus_lock
1237
+ * cpuctx->mutex / perf_event_context::mutex
1234
1238
*/
1235
1239
static struct perf_event_context *
1236
1240
perf_event_ctx_lock_nested (struct perf_event * event , int nesting )
@@ -4196,6 +4200,7 @@ int perf_event_release_kernel(struct perf_event *event)
4196
4200
{
4197
4201
struct perf_event_context * ctx = event -> ctx ;
4198
4202
struct perf_event * child , * tmp ;
4203
+ LIST_HEAD (free_list );
4199
4204
4200
4205
/*
4201
4206
* 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)
4268
4273
struct perf_event , child_list );
4269
4274
if (tmp == child ) {
4270
4275
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 );
4273
4277
/*
4274
4278
* This matches the refcount bump in inherit_event();
4275
4279
* this can't be the last reference.
@@ -4284,6 +4288,11 @@ int perf_event_release_kernel(struct perf_event *event)
4284
4288
}
4285
4289
mutex_unlock (& event -> child_mutex );
4286
4290
4291
+ list_for_each_entry_safe (child , tmp , & free_list , child_list ) {
4292
+ list_del (& child -> child_list );
4293
+ free_event (child );
4294
+ }
4295
+
4287
4296
no_ctx :
4288
4297
put_event (event ); /* Must be the 'last' reference */
4289
4298
return 0 ;
0 commit comments