@@ -8090,6 +8090,9 @@ static void perf_event_addr_filters_apply(struct perf_event *event)
8090
8090
if (task == TASK_TOMBSTONE )
8091
8091
return ;
8092
8092
8093
+ if (!ifh -> nr_file_filters )
8094
+ return ;
8095
+
8093
8096
mm = get_task_mm (event -> ctx -> task );
8094
8097
if (!mm )
8095
8098
goto restart ;
@@ -8268,6 +8271,18 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr,
8268
8271
if (!filename )
8269
8272
goto fail ;
8270
8273
8274
+ /*
8275
+ * For now, we only support file-based filters
8276
+ * in per-task events; doing so for CPU-wide
8277
+ * events requires additional context switching
8278
+ * trickery, since same object code will be
8279
+ * mapped at different virtual addresses in
8280
+ * different processes.
8281
+ */
8282
+ ret = - EOPNOTSUPP ;
8283
+ if (!event -> ctx -> task )
8284
+ goto fail_free_name ;
8285
+
8271
8286
/* look up the path and grab its inode */
8272
8287
ret = kern_path (filename , LOOKUP_FOLLOW , & path );
8273
8288
if (ret )
@@ -8283,6 +8298,8 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr,
8283
8298
!S_ISREG (filter -> inode -> i_mode ))
8284
8299
/* free_filters_list() will iput() */
8285
8300
goto fail ;
8301
+
8302
+ event -> addr_filters .nr_file_filters ++ ;
8286
8303
}
8287
8304
8288
8305
/* ready to consume more filters */
@@ -8322,31 +8339,28 @@ perf_event_set_addr_filter(struct perf_event *event, char *filter_str)
8322
8339
if (WARN_ON_ONCE (event -> parent ))
8323
8340
return - EINVAL ;
8324
8341
8325
- /*
8326
- * For now, we only support filtering in per-task events; doing so
8327
- * for CPU-wide events requires additional context switching trickery,
8328
- * since same object code will be mapped at different virtual
8329
- * addresses in different processes.
8330
- */
8331
- if (!event -> ctx -> task )
8332
- return - EOPNOTSUPP ;
8333
-
8334
8342
ret = perf_event_parse_addr_filter (event , filter_str , & filters );
8335
8343
if (ret )
8336
- return ret ;
8344
+ goto fail_clear_files ;
8337
8345
8338
8346
ret = event -> pmu -> addr_filters_validate (& filters );
8339
- if (ret ) {
8340
- free_filters_list (& filters );
8341
- return ret ;
8342
- }
8347
+ if (ret )
8348
+ goto fail_free_filters ;
8343
8349
8344
8350
/* remove existing filters, if any */
8345
8351
perf_addr_filters_splice (event , & filters );
8346
8352
8347
8353
/* install new filters */
8348
8354
perf_event_for_each_child (event , perf_event_addr_filters_apply );
8349
8355
8356
+ return ret ;
8357
+
8358
+ fail_free_filters :
8359
+ free_filters_list (& filters );
8360
+
8361
+ fail_clear_files :
8362
+ event -> addr_filters .nr_file_filters = 0 ;
8363
+
8350
8364
return ret ;
8351
8365
}
8352
8366
0 commit comments