|
@@ -1831,6 +1831,7 @@ static void perf_set_shadow_time(struct perf_event *event,
|
|
#define MAX_INTERRUPTS (~0ULL)
|
|
#define MAX_INTERRUPTS (~0ULL)
|
|
|
|
|
|
static void perf_log_throttle(struct perf_event *event, int enable);
|
|
static void perf_log_throttle(struct perf_event *event, int enable);
|
|
|
|
+static void perf_log_itrace_start(struct perf_event *event);
|
|
|
|
|
|
static int
|
|
static int
|
|
event_sched_in(struct perf_event *event,
|
|
event_sched_in(struct perf_event *event,
|
|
@@ -1869,6 +1870,8 @@ event_sched_in(struct perf_event *event,
|
|
|
|
|
|
perf_set_shadow_time(event, ctx, tstamp);
|
|
perf_set_shadow_time(event, ctx, tstamp);
|
|
|
|
|
|
|
|
+ perf_log_itrace_start(event);
|
|
|
|
+
|
|
if (event->pmu->add(event, PERF_EF_START)) {
|
|
if (event->pmu->add(event, PERF_EF_START)) {
|
|
event->state = PERF_EVENT_STATE_INACTIVE;
|
|
event->state = PERF_EVENT_STATE_INACTIVE;
|
|
event->oncpu = -1;
|
|
event->oncpu = -1;
|
|
@@ -5991,6 +5994,44 @@ static void perf_log_throttle(struct perf_event *event, int enable)
|
|
perf_output_end(&handle);
|
|
perf_output_end(&handle);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void perf_log_itrace_start(struct perf_event *event)
|
|
|
|
+{
|
|
|
|
+ struct perf_output_handle handle;
|
|
|
|
+ struct perf_sample_data sample;
|
|
|
|
+ struct perf_aux_event {
|
|
|
|
+ struct perf_event_header header;
|
|
|
|
+ u32 pid;
|
|
|
|
+ u32 tid;
|
|
|
|
+ } rec;
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ if (event->parent)
|
|
|
|
+ event = event->parent;
|
|
|
|
+
|
|
|
|
+ if (!(event->pmu->capabilities & PERF_PMU_CAP_ITRACE) ||
|
|
|
|
+ event->hw.itrace_started)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ event->hw.itrace_started = 1;
|
|
|
|
+
|
|
|
|
+ rec.header.type = PERF_RECORD_ITRACE_START;
|
|
|
|
+ rec.header.misc = 0;
|
|
|
|
+ rec.header.size = sizeof(rec);
|
|
|
|
+ rec.pid = perf_event_pid(event, current);
|
|
|
|
+ rec.tid = perf_event_tid(event, current);
|
|
|
|
+
|
|
|
|
+ perf_event_header__init_id(&rec.header, &sample, event);
|
|
|
|
+ ret = perf_output_begin(&handle, event, rec.header.size);
|
|
|
|
+
|
|
|
|
+ if (ret)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ perf_output_put(&handle, rec);
|
|
|
|
+ perf_event__output_id_sample(event, &handle, &sample);
|
|
|
|
+
|
|
|
|
+ perf_output_end(&handle);
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Generic event overflow handling, sampling.
|
|
* Generic event overflow handling, sampling.
|
|
*/
|
|
*/
|