aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2015-02-21 15:10:29 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2015-02-22 20:22:26 -0500
commitddbb1b131062d020085577db700c3e816a227901 (patch)
treef2c3848e364c6b9c3a1c1e02d7df7360d44e9ccc /tools/perf
parent77c92582a52308868b6ef30a7e551eaceb0fc246 (diff)
perf trace: Separate routine that handles an event from the one that reads it
Because we need to use ordered_events in some cases, so we will need to first have them in a queue, order that queue, and then process the event. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Borislav Petkov <bp@suse.de> Cc: David Ahern <dsahern@gmail.com> Cc: Don Zickus <dzickus@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-cmkw9zgoh0z4r218957ftp1a@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-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