提交 53ff6bc3 编写于 作者: A Adrian Hunter 提交者: Arnaldo Carvalho de Melo

perf tools: Fix use of wrong event when processing exit events

In a couple of cases the 'comm' member of 'union event' has been used
instead of the correct member ('fork') when processing exit events.

In the cases where it has been used incorrectly, only the 'pid' and
'tid' are affected.  The 'pid' value would be correct anyway because it
is in the same position in 'comm' and 'fork' events, but the 'tid' would
have been incorrectly assigned from 'ppid'.

However, for exit events, the kernel puts the current task in the 'ppid'
and 'ttid' which is the same as the exiting task.  That is 'ppid' ==
'pid' and if the task is not multi-threaded, 'pid' == 'tid' i.e. the
data goes wrong only when tracing multi-threaded programs.

It is hard to find an example of how this would produce an error in
practice.  There are 3 occurences of the fix:

1. perf script is only affected if !sample_id_all which only happens on
  old kernels.

2. intel_pt is only affected when decoding without timestamps
   and would probably still decode correctly - the exit event is
   only used to flush out data which anyway gets flushed at the
   end of the session

3. intel_bts also uses the exit event to flush data which
   would probably not cause errors as it would get flushed at
   the end of the session instead
Signed-off-by: NAdrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/1439888825-27708-1-git-send-email-adrian.hunter@intel.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
上级 5ad4da43
...@@ -768,8 +768,8 @@ static int process_exit_event(struct perf_tool *tool, ...@@ -768,8 +768,8 @@ static int process_exit_event(struct perf_tool *tool,
if (!evsel->attr.sample_id_all) { if (!evsel->attr.sample_id_all) {
sample->cpu = 0; sample->cpu = 0;
sample->time = 0; sample->time = 0;
sample->tid = event->comm.tid; sample->tid = event->fork.tid;
sample->pid = event->comm.pid; sample->pid = event->fork.pid;
} }
print_sample_start(sample, thread, evsel); print_sample_start(sample, thread, evsel);
perf_event__fprintf(event, stdout); perf_event__fprintf(event, stdout);
......
...@@ -623,7 +623,7 @@ static int intel_bts_process_event(struct perf_session *session, ...@@ -623,7 +623,7 @@ static int intel_bts_process_event(struct perf_session *session,
if (err) if (err)
return err; return err;
if (event->header.type == PERF_RECORD_EXIT) { if (event->header.type == PERF_RECORD_EXIT) {
err = intel_bts_process_tid_exit(bts, event->comm.tid); err = intel_bts_process_tid_exit(bts, event->fork.tid);
if (err) if (err)
return err; return err;
} }
......
...@@ -1494,7 +1494,7 @@ static int intel_pt_process_event(struct perf_session *session, ...@@ -1494,7 +1494,7 @@ static int intel_pt_process_event(struct perf_session *session,
if (pt->timeless_decoding) { if (pt->timeless_decoding) {
if (event->header.type == PERF_RECORD_EXIT) { if (event->header.type == PERF_RECORD_EXIT) {
err = intel_pt_process_timeless_queues(pt, err = intel_pt_process_timeless_queues(pt,
event->comm.tid, event->fork.tid,
sample->time); sample->time);
} }
} else if (timestamp) { } else if (timestamp) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册