|
|
@@ -276,6 +276,17 @@ static struct intel_uncore_box *uncore_alloc_box(struct intel_uncore_type *type,
|
|
|
return box;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Using uncore_pmu_event_init pmu event_init callback
|
|
|
+ * as a detection point for uncore events.
|
|
|
+ */
|
|
|
+static int uncore_pmu_event_init(struct perf_event *event);
|
|
|
+
|
|
|
+static bool is_uncore_event(struct perf_event *event)
|
|
|
+{
|
|
|
+ return event->pmu->event_init == uncore_pmu_event_init;
|
|
|
+}
|
|
|
+
|
|
|
static int
|
|
|
uncore_collect_events(struct intel_uncore_box *box, struct perf_event *leader, bool dogrp)
|
|
|
{
|
|
|
@@ -290,13 +301,18 @@ uncore_collect_events(struct intel_uncore_box *box, struct perf_event *leader, b
|
|
|
return -EINVAL;
|
|
|
|
|
|
n = box->n_events;
|
|
|
- box->event_list[n] = leader;
|
|
|
- n++;
|
|
|
+
|
|
|
+ if (is_uncore_event(leader)) {
|
|
|
+ box->event_list[n] = leader;
|
|
|
+ n++;
|
|
|
+ }
|
|
|
+
|
|
|
if (!dogrp)
|
|
|
return n;
|
|
|
|
|
|
list_for_each_entry(event, &leader->sibling_list, group_entry) {
|
|
|
- if (event->state <= PERF_EVENT_STATE_OFF)
|
|
|
+ if (!is_uncore_event(event) ||
|
|
|
+ event->state <= PERF_EVENT_STATE_OFF)
|
|
|
continue;
|
|
|
|
|
|
if (n >= max_count)
|