提交 8fb598e5 编写于 作者: D David Ahern 提交者: Arnaldo Carvalho de Melo

perf trace: Fix comm resolution when reading events from file

Task comm's are getting lost when processing events from a file. The
problem is that the trace struct used by the live processing has its
host machine and the perf-session used for file based processing has its
host machine.  Fix by having both references point to the same machine.

Before:

     0.030 ( 0.001 ms): :27743/27743 brk( ...
     0.057 ( 0.004 ms): :27743/27743 mmap(len: 4096, prot: READ|WRITE, flags: ...
     0.075 ( 0.006 ms): :27743/27743 access(filename: 0x7f3809fbce00, mode: R ...
     0.091 ( 0.005 ms): :27743/27743 open(filename: 0x7f3809fba14c, flags: CLOEXEC ...
...

After:
     0.030 ( 0.001 ms): make/27743 brk( ...
     0.057 ( 0.004 ms): make/27743 mmap(len: 4096, prot: READ|WRITE, flags: ...
     0.075 ( 0.006 ms): make/27743 access(filename: 0x7f3809fbce00, mode: R ...
     0.091 ( 0.005 ms): make/27743 open(filename: 0x7f3809fba14c, flags: CLOEXEC ...
...
Signed-off-by: NDavid Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung.kim@lge.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1380395584-9025-4-git-send-email-dsahern@gmail.com
[ Moved creation of new host machine to a separate constructor: machine__new_host() ]
Signed-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
上级 4bbe5a61
...@@ -906,7 +906,7 @@ struct trace { ...@@ -906,7 +906,7 @@ struct trace {
struct syscall *table; struct syscall *table;
} syscalls; } syscalls;
struct perf_record_opts opts; struct perf_record_opts opts;
struct machine host; struct machine *host;
u64 base_time; u64 base_time;
bool full_time; bool full_time;
FILE *output; FILE *output;
...@@ -1083,16 +1083,17 @@ static int trace__symbols_init(struct trace *trace, struct perf_evlist *evlist) ...@@ -1083,16 +1083,17 @@ static int trace__symbols_init(struct trace *trace, struct perf_evlist *evlist)
if (err) if (err)
return err; return err;
machine__init(&trace->host, "", HOST_KERNEL_ID); trace->host = machine__new_host();
machine__create_kernel_maps(&trace->host); if (trace->host == NULL)
return -ENOMEM;
if (perf_target__has_task(&trace->opts.target)) { if (perf_target__has_task(&trace->opts.target)) {
err = perf_event__synthesize_thread_map(&trace->tool, evlist->threads, err = perf_event__synthesize_thread_map(&trace->tool, evlist->threads,
trace__tool_process, trace__tool_process,
&trace->host); trace->host);
} else { } else {
err = perf_event__synthesize_threads(&trace->tool, trace__tool_process, err = perf_event__synthesize_threads(&trace->tool, trace__tool_process,
&trace->host); trace->host);
} }
if (err) if (err)
...@@ -1304,8 +1305,7 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel, ...@@ -1304,8 +1305,7 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,
if (sc->filtered) if (sc->filtered)
return 0; return 0;
thread = machine__findnew_thread(&trace->host, sample->pid, thread = machine__findnew_thread(trace->host, sample->pid, sample->tid);
sample->tid);
ttrace = thread__trace(thread, trace->output); ttrace = thread__trace(thread, trace->output);
if (ttrace == NULL) if (ttrace == NULL)
return -1; return -1;
...@@ -1357,8 +1357,7 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel, ...@@ -1357,8 +1357,7 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
if (sc->filtered) if (sc->filtered)
return 0; return 0;
thread = machine__findnew_thread(&trace->host, sample->pid, thread = machine__findnew_thread(trace->host, sample->pid, sample->tid);
sample->tid);
ttrace = thread__trace(thread, trace->output); ttrace = thread__trace(thread, trace->output);
if (ttrace == NULL) if (ttrace == NULL)
return -1; return -1;
...@@ -1414,7 +1413,7 @@ static int trace__sched_stat_runtime(struct trace *trace, struct perf_evsel *evs ...@@ -1414,7 +1413,7 @@ static int trace__sched_stat_runtime(struct trace *trace, struct perf_evsel *evs
{ {
u64 runtime = perf_evsel__intval(evsel, sample, "runtime"); u64 runtime = perf_evsel__intval(evsel, sample, "runtime");
double runtime_ms = (double)runtime / NSEC_PER_MSEC; double runtime_ms = (double)runtime / NSEC_PER_MSEC;
struct thread *thread = machine__findnew_thread(&trace->host, struct thread *thread = machine__findnew_thread(trace->host,
sample->pid, sample->pid,
sample->tid); sample->tid);
struct thread_trace *ttrace = thread__trace(thread, trace->output); struct thread_trace *ttrace = thread__trace(thread, trace->output);
...@@ -1597,7 +1596,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv) ...@@ -1597,7 +1596,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
trace->base_time = sample.time; trace->base_time = sample.time;
if (type != PERF_RECORD_SAMPLE) { if (type != PERF_RECORD_SAMPLE) {
trace__process_event(trace, &trace->host, event); trace__process_event(trace, trace->host, event);
continue; continue;
} }
...@@ -1681,6 +1680,8 @@ static int trace__replay(struct trace *trace) ...@@ -1681,6 +1680,8 @@ static int trace__replay(struct trace *trace)
if (session == NULL) if (session == NULL)
return -ENOMEM; return -ENOMEM;
trace->host = &session->machines.host;
err = perf_session__set_tracepoints_handlers(session, handlers); err = perf_session__set_tracepoints_handlers(session, handlers);
if (err) if (err)
goto out; goto out;
...@@ -1728,7 +1729,7 @@ static size_t trace__fprintf_thread_summary(struct trace *trace, FILE *fp) ...@@ -1728,7 +1729,7 @@ static size_t trace__fprintf_thread_summary(struct trace *trace, FILE *fp)
size_t printed = trace__fprintf_threads_header(fp); size_t printed = trace__fprintf_threads_header(fp);
struct rb_node *nd; struct rb_node *nd;
for (nd = rb_first(&trace->host.threads); nd; nd = rb_next(nd)) { for (nd = rb_first(&trace->host->threads); nd; nd = rb_next(nd)) {
struct thread *thread = rb_entry(nd, struct thread, rb_node); struct thread *thread = rb_entry(nd, struct thread, rb_node);
struct thread_trace *ttrace = thread->priv; struct thread_trace *ttrace = thread->priv;
const char *color; const char *color;
......
...@@ -46,6 +46,23 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid) ...@@ -46,6 +46,23 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
return 0; return 0;
} }
struct machine *machine__new_host(void)
{
struct machine *machine = malloc(sizeof(*machine));
if (machine != NULL) {
machine__init(machine, "", HOST_KERNEL_ID);
if (machine__create_kernel_maps(machine) < 0)
goto out_delete;
}
return machine;
out_delete:
free(machine);
return NULL;
}
static void dsos__delete(struct list_head *dsos) static void dsos__delete(struct list_head *dsos)
{ {
struct dso *pos, *n; struct dso *pos, *n;
......
...@@ -74,6 +74,7 @@ char *machine__mmap_name(struct machine *machine, char *bf, size_t size); ...@@ -74,6 +74,7 @@ char *machine__mmap_name(struct machine *machine, char *bf, size_t size);
void machines__set_symbol_filter(struct machines *machines, void machines__set_symbol_filter(struct machines *machines,
symbol_filter_t symbol_filter); symbol_filter_t symbol_filter);
struct machine *machine__new_host(void);
int machine__init(struct machine *machine, const char *root_dir, pid_t pid); int machine__init(struct machine *machine, const char *root_dir, pid_t pid);
void machine__exit(struct machine *machine); void machine__exit(struct machine *machine);
void machine__delete_dead_threads(struct machine *machine); void machine__delete_dead_threads(struct machine *machine);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册