File tree Expand file tree Collapse file tree 1 file changed +26
-0
lines changed Expand file tree Collapse file tree 1 file changed +26
-0
lines changed Original file line number Diff line number Diff line change @@ -247,11 +247,33 @@ int forward_event_to_ibs(struct perf_event *event)
247
247
return - ENOENT ;
248
248
}
249
249
250
+ /*
251
+ * Grouping of IBS events is not possible since IBS can have only
252
+ * one event active at any point in time.
253
+ */
254
+ static int validate_group (struct perf_event * event )
255
+ {
256
+ struct perf_event * sibling ;
257
+
258
+ if (event -> group_leader == event )
259
+ return 0 ;
260
+
261
+ if (event -> group_leader -> pmu == event -> pmu )
262
+ return - EINVAL ;
263
+
264
+ for_each_sibling_event (sibling , event -> group_leader ) {
265
+ if (sibling -> pmu == event -> pmu )
266
+ return - EINVAL ;
267
+ }
268
+ return 0 ;
269
+ }
270
+
250
271
static int perf_ibs_init (struct perf_event * event )
251
272
{
252
273
struct hw_perf_event * hwc = & event -> hw ;
253
274
struct perf_ibs * perf_ibs ;
254
275
u64 max_cnt , config ;
276
+ int ret ;
255
277
256
278
perf_ibs = get_ibs_pmu (event -> attr .type );
257
279
if (!perf_ibs )
@@ -265,6 +287,10 @@ static int perf_ibs_init(struct perf_event *event)
265
287
if (config & ~perf_ibs -> config_mask )
266
288
return - EINVAL ;
267
289
290
+ ret = validate_group (event );
291
+ if (ret )
292
+ return ret ;
293
+
268
294
if (hwc -> sample_period ) {
269
295
if (config & perf_ibs -> cnt_mask )
270
296
/* raw max_cnt may not be set */
You can’t perform that action at this time.
0 commit comments