aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/builtin-trace.c58
1 files changed, 31 insertions, 27 deletions
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 60ccfd52189d..fbdfb338bc38 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -2092,10 +2092,39 @@ static int perf_evlist__add_pgfault(struct perf_evlist *evlist,
2092 return 0; 2092 return 0;
2093} 2093}
2094 2094
2095static void trace__handle_event(struct trace *trace, union perf_event *event, struct perf_sample *sample)
2096{
2097 const u32 type = event->header.type;
2098 struct perf_evsel *evsel;
2099
2100 if (!trace->full_time && trace->base_time == 0)
2101 trace->base_time = sample->time;
2102
2103 if (type != PERF_RECORD_SAMPLE) {
2104 trace__process_event(trace, trace->host, event, sample);
2105 return;
2106 }
2107
2108 evsel = perf_evlist__id2evsel(trace->evlist, sample->id);
2109 if (evsel == NULL) {
2110 fprintf(trace->output, "Unknown tp ID %" PRIu64 ", skipping...\n", sample->id);
2111 return;
2112 }
2113
2114 if (evsel->attr.type == PERF_TYPE_TRACEPOINT &&
2115 sample->raw_data == NULL) {
2116 fprintf(trace->output, "%s sample with no payload for tid: %d, cpu %d, raw_size=%d, skipping...\n",
2117 perf_evsel__name(evsel), sample->tid,
2118 sample->cpu, sample->raw_size);
2119 } else {
2120 tracepoint_handler handler = evsel->handler;
2121 handler(trace, evsel, event, sample);
2122 }
2123}
2124
2095static int trace__run(struct trace *trace, int argc, const char **argv) 2125static int trace__run(struct trace *trace, int argc, const char **argv)
2096{ 2126{
2097 struct perf_evlist *evlist = trace->evlist; 2127 struct perf_evlist *evlist = trace->evlist;
2098 struct perf_evsel *evsel;
2099 int err = -1, i; 2128 int err = -1, i;
2100 unsigned long before; 2129 unsigned long before;
2101 const bool forks = argc > 0; 2130 const bool forks = argc > 0;
@@ -2190,8 +2219,6 @@ again:
2190 union perf_event *event; 2219 union perf_event *event;
2191 2220
2192 while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) { 2221 while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) {
2193 const u32 type = event->header.type;
2194 tracepoint_handler handler;
2195 struct perf_sample sample; 2222 struct perf_sample sample;
2196 2223
2197 ++trace->nr_events; 2224 ++trace->nr_events;
@@ -2202,30 +2229,7 @@ again:
2202 goto next_event; 2229 goto next_event;
2203 } 2230 }
2204 2231
2205 if (!trace->full_time && trace->base_time == 0) 2232 trace__handle_event(trace, event, &sample);
2206 trace->base_time = sample.time;
2207
2208 if (type != PERF_RECORD_SAMPLE) {
2209 trace__process_event(trace, trace->host, event, &sample);
2210 continue;
2211 }
2212
2213 evsel = perf_evlist__id2evsel(evlist, sample.id);
2214 if (evsel == NULL) {
2215 fprintf(trace->output, "Unknown tp ID %" PRIu64 ", skipping...\n", sample.id);
2216 goto next_event;
2217 }
2218
2219 if (evsel->attr.type == PERF_TYPE_TRACEPOINT &&
2220 sample.raw_data == NULL) {
2221 fprintf(trace->output, "%s sample with no payload for tid: %d, cpu %d, raw_size=%d, skipping...\n",
2222 perf_evsel__name(evsel), sample.tid,
2223 sample.cpu, sample.raw_size);
2224 goto next_event;
2225 }
2226
2227 handler = evsel->handler;
2228 handler(trace, evsel, event, &sample);
2229next_event: 2233next_event:
2230 perf_evlist__mmap_consume(evlist, i); 2234 perf_evlist__mmap_consume(evlist, i);
2231 2235