|
@@ -5044,6 +5044,12 @@ static int perf_swevent_init(struct perf_event *event)
|
|
|
if (event->attr.type != PERF_TYPE_SOFTWARE)
|
|
|
return -ENOENT;
|
|
|
|
|
|
+ /*
|
|
|
+ * no branch sampling for software events
|
|
|
+ */
|
|
|
+ if (has_branch_stack(event))
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
switch (event_id) {
|
|
|
case PERF_COUNT_SW_CPU_CLOCK:
|
|
|
case PERF_COUNT_SW_TASK_CLOCK:
|
|
@@ -5154,6 +5160,12 @@ static int perf_tp_event_init(struct perf_event *event)
|
|
|
if (event->attr.type != PERF_TYPE_TRACEPOINT)
|
|
|
return -ENOENT;
|
|
|
|
|
|
+ /*
|
|
|
+ * no branch sampling for tracepoint events
|
|
|
+ */
|
|
|
+ if (has_branch_stack(event))
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
err = perf_trace_init(event);
|
|
|
if (err)
|
|
|
return err;
|
|
@@ -5379,6 +5391,12 @@ static int cpu_clock_event_init(struct perf_event *event)
|
|
|
if (event->attr.config != PERF_COUNT_SW_CPU_CLOCK)
|
|
|
return -ENOENT;
|
|
|
|
|
|
+ /*
|
|
|
+ * no branch sampling for software events
|
|
|
+ */
|
|
|
+ if (has_branch_stack(event))
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
perf_swevent_init_hrtimer(event);
|
|
|
|
|
|
return 0;
|
|
@@ -5453,6 +5471,12 @@ static int task_clock_event_init(struct perf_event *event)
|
|
|
if (event->attr.config != PERF_COUNT_SW_TASK_CLOCK)
|
|
|
return -ENOENT;
|
|
|
|
|
|
+ /*
|
|
|
+ * no branch sampling for software events
|
|
|
+ */
|
|
|
+ if (has_branch_stack(event))
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
perf_swevent_init_hrtimer(event);
|
|
|
|
|
|
return 0;
|