diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2015-02-21 15:10:29 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2015-02-22 20:22:26 -0500 |
commit | ddbb1b131062d020085577db700c3e816a227901 (patch) | |
tree | f2c3848e364c6b9c3a1c1e02d7df7360d44e9ccc /tools/perf | |
parent | 77c92582a52308868b6ef30a7e551eaceb0fc246 (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.c | 58 |
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 | ||
2095 | static 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 | |||
2095 | static int trace__run(struct trace *trace, int argc, const char **argv) | 2125 | static 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); | ||
2229 | next_event: | 2233 | next_event: |
2230 | perf_evlist__mmap_consume(evlist, i); | 2234 | perf_evlist__mmap_consume(evlist, i); |
2231 | 2235 | ||