Skip to content

Commit 7c21282

Browse files
Ravi BangoriaPeter Zijlstra
authored andcommitted
perf/amd: Prevent grouping of IBS events
IBS PMUs can have only one event active at any point in time. Restrict grouping of multiple IBS events. Reported-by: Sandipan Das <[email protected]> Signed-off-by: Ravi Bangoria <[email protected]> Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Link: https://lkml.kernel.org/r/[email protected]
1 parent 06c2afb commit 7c21282

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

arch/x86/events/amd/ibs.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,11 +247,33 @@ int forward_event_to_ibs(struct perf_event *event)
247247
return -ENOENT;
248248
}
249249

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+
250271
static int perf_ibs_init(struct perf_event *event)
251272
{
252273
struct hw_perf_event *hwc = &event->hw;
253274
struct perf_ibs *perf_ibs;
254275
u64 max_cnt, config;
276+
int ret;
255277

256278
perf_ibs = get_ibs_pmu(event->attr.type);
257279
if (!perf_ibs)
@@ -265,6 +287,10 @@ static int perf_ibs_init(struct perf_event *event)
265287
if (config & ~perf_ibs->config_mask)
266288
return -EINVAL;
267289

290+
ret = validate_group(event);
291+
if (ret)
292+
return ret;
293+
268294
if (hwc->sample_period) {
269295
if (config & perf_ibs->cnt_mask)
270296
/* raw max_cnt may not be set */

0 commit comments

Comments
 (0)