@@ -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 ;
@@ -8516,6 +8525,29 @@ perf_event_set_addr_filter(struct perf_event *event, char *filter_str)
8516
8525
return ret ;
8517
8526
}
8518
8527
8528
+ static int
8529
+ perf_tracepoint_set_filter (struct perf_event * event , char * filter_str )
8530
+ {
8531
+ struct perf_event_context * ctx = event -> ctx ;
8532
+ int ret ;
8533
+
8534
+ /*
8535
+ * Beware, here be dragons!!
8536
+ *
8537
+ * the tracepoint muck will deadlock against ctx->mutex, but the tracepoint
8538
+ * stuff does not actually need it. So temporarily drop ctx->mutex. As per
8539
+ * perf_event_ctx_lock() we already have a reference on ctx.
8540
+ *
8541
+ * This can result in event getting moved to a different ctx, but that
8542
+ * does not affect the tracepoint state.
8543
+ */
8544
+ mutex_unlock (& ctx -> mutex );
8545
+ ret = ftrace_profile_set_filter (event , event -> attr .config , filter_str );
8546
+ mutex_lock (& ctx -> mutex );
8547
+
8548
+ return ret ;
8549
+ }
8550
+
8519
8551
static int perf_event_set_filter (struct perf_event * event , void __user * arg )
8520
8552
{
8521
8553
char * filter_str ;
@@ -8532,8 +8564,7 @@ static int perf_event_set_filter(struct perf_event *event, void __user *arg)
8532
8564
8533
8565
if (IS_ENABLED (CONFIG_EVENT_TRACING ) &&
8534
8566
event -> attr .type == PERF_TYPE_TRACEPOINT )
8535
- ret = ftrace_profile_set_filter (event , event -> attr .config ,
8536
- filter_str );
8567
+ ret = perf_tracepoint_set_filter (event , filter_str );
8537
8568
else if (has_addr_filter (event ))
8538
8569
ret = perf_event_set_addr_filter (event , filter_str );
8539
8570
@@ -9168,7 +9199,13 @@ static int perf_try_init_event(struct pmu *pmu, struct perf_event *event)
9168
9199
if (!try_module_get (pmu -> module ))
9169
9200
return - ENODEV ;
9170
9201
9171
- if (event -> group_leader != event ) {
9202
+ /*
9203
+ * A number of pmu->event_init() methods iterate the sibling_list to,
9204
+ * for example, validate if the group fits on the PMU. Therefore,
9205
+ * if this is a sibling event, acquire the ctx->mutex to protect
9206
+ * the sibling_list.
9207
+ */
9208
+ if (event -> group_leader != event && pmu -> task_ctx_nr != perf_sw_context ) {
9172
9209
/*
9173
9210
* This ctx->mutex can nest when we're called through
9174
9211
* inheritance. See the perf_event_ctx_lock_nested() comment.
0 commit comments