|
@@ -399,36 +399,35 @@ int x86_pmu_hw_config(struct perf_event *event)
|
|
|
|
|
|
if (event->attr.precise_ip > precise)
|
|
if (event->attr.precise_ip > precise)
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
- /*
|
|
|
|
- * check that PEBS LBR correction does not conflict with
|
|
|
|
- * whatever the user is asking with attr->branch_sample_type
|
|
|
|
- */
|
|
|
|
- if (event->attr.precise_ip > 1 &&
|
|
|
|
- x86_pmu.intel_cap.pebs_format < 2) {
|
|
|
|
- u64 *br_type = &event->attr.branch_sample_type;
|
|
|
|
-
|
|
|
|
- if (has_branch_stack(event)) {
|
|
|
|
- if (!precise_br_compat(event))
|
|
|
|
- return -EOPNOTSUPP;
|
|
|
|
-
|
|
|
|
- /* branch_sample_type is compatible */
|
|
|
|
-
|
|
|
|
- } else {
|
|
|
|
- /*
|
|
|
|
- * user did not specify branch_sample_type
|
|
|
|
- *
|
|
|
|
- * For PEBS fixups, we capture all
|
|
|
|
- * the branches at the priv level of the
|
|
|
|
- * event.
|
|
|
|
- */
|
|
|
|
- *br_type = PERF_SAMPLE_BRANCH_ANY;
|
|
|
|
-
|
|
|
|
- if (!event->attr.exclude_user)
|
|
|
|
- *br_type |= PERF_SAMPLE_BRANCH_USER;
|
|
|
|
-
|
|
|
|
- if (!event->attr.exclude_kernel)
|
|
|
|
- *br_type |= PERF_SAMPLE_BRANCH_KERNEL;
|
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
+ /*
|
|
|
|
+ * check that PEBS LBR correction does not conflict with
|
|
|
|
+ * whatever the user is asking with attr->branch_sample_type
|
|
|
|
+ */
|
|
|
|
+ if (event->attr.precise_ip > 1 && x86_pmu.intel_cap.pebs_format < 2) {
|
|
|
|
+ u64 *br_type = &event->attr.branch_sample_type;
|
|
|
|
+
|
|
|
|
+ if (has_branch_stack(event)) {
|
|
|
|
+ if (!precise_br_compat(event))
|
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
+
|
|
|
|
+ /* branch_sample_type is compatible */
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+ /*
|
|
|
|
+ * user did not specify branch_sample_type
|
|
|
|
+ *
|
|
|
|
+ * For PEBS fixups, we capture all
|
|
|
|
+ * the branches at the priv level of the
|
|
|
|
+ * event.
|
|
|
|
+ */
|
|
|
|
+ *br_type = PERF_SAMPLE_BRANCH_ANY;
|
|
|
|
+
|
|
|
|
+ if (!event->attr.exclude_user)
|
|
|
|
+ *br_type |= PERF_SAMPLE_BRANCH_USER;
|
|
|
|
+
|
|
|
|
+ if (!event->attr.exclude_kernel)
|
|
|
|
+ *br_type |= PERF_SAMPLE_BRANCH_KERNEL;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|