From: David Ahern <dsahern@gmail.com>
To: acme@ghostprotocols.net, linux-kernel@vger.kernel.org, mingo@kernel.org
Cc: David Ahern <dsahern@gmail.com>,
Frederic Weisbecker <fweisbec@gmail.com>,
Jiri Olsa <jolsa@redhat.com>, Mike Galbraith <efault@gmx.de>,
Namhyung Kim <namhyung@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Stephane Eranian <eranian@google.com>,
Adrian Hunter <adrian.hunter@intel.com>
Subject: [PATCH 01/19] perf: sample after exit loses thread correlation - v3
Date: Wed, 7 Aug 2013 22:50:43 -0400 [thread overview]
Message-ID: <1375930261-77273-2-git-send-email-dsahern@gmail.com> (raw)
In-Reply-To: <1375930261-77273-1-git-send-email-dsahern@gmail.com>
Occassionally events (e.g., context-switch, sched tracepoints) are losing
the conversion of sample data associated with a thread. For example:
$ perf record -e sched:sched_switch -c 1 -a -- sleep 5
$ perf script
<selected events shown>
ls 30482 [000] 1379727.583037: sched:sched_switch: prev_comm=ls prev_pid=30482 ...
ls 30482 [000] 1379727.586339: sched:sched_switch: prev_comm=ls prev_pid=30482 ...
:30482 30482 [000] 1379727.589462: sched:sched_switch: prev_comm=ls prev_pid=30482 ...
The last line lost the conversion from tid to comm. If you look at the events
(perf script -D) you see why - SAMPLE event is generated after the EXIT:
0 1379727589449774 0x1540b0 [0x38]: PERF_RECORD_EXIT(30482:30482):(30482:30482)
0 1379727589462497 0x1540e8 [0x80]: PERF_RECORD_SAMPLE(IP, 1): 30482/30482: 0xffffffff816416f1 period: 1 addr: 0
... thread: :30482:30482
When perf processes the EXIT event the thread is moved to the dead_threads
list. When the SAMPLE event is processed no thread exists for the pid so a new
one is created by machine__findnew_thread.
This patch address the problem by delaying the move to the dead_threads list
until the tid is re-used (per Adrian's suggestion).
With this patch we get the previous example shows:
ls 30482 [000] 1379727.583037: sched:sched_switch: prev_comm=ls prev_pid=30482 ...
ls 30482 [000] 1379727.586339: sched:sched_switch: prev_comm=ls prev_pid=30482 ...
ls 30482 [000] 1379727.589462: sched:sched_switch: prev_comm=ls prev_pid=30482 ...
and
0 1379727589449774 0x1540b0 [0x38]: PERF_RECORD_EXIT(30482:30482):(30482:30482)
0 1379727589462497 0x1540e8 [0x80]: PERF_RECORD_SAMPLE(IP, 1): 30482/30482: 0xffffffff816416f1 period: 1 addr: 0
... thread: ls:30482
v3: re-do from a time based check to a delayed move to dead_threads list
v2: Rebased to latest perf/core branch. Changed time comparison to use
a macro which explicitly shows the time basis
Signed-off-by: David Ahern <dsahern@gmail.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
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>
Cc: Adrian Hunter <adrian.hunter@intel.com>
---
tools/perf/util/machine.c | 37 +++++++++++++++++++------------------
1 file changed, 19 insertions(+), 18 deletions(-)
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index 6fcc358..7784a9d 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -1011,11 +1011,27 @@ out_problem:
return 0;
}
+static void machine__remove_thread(struct machine *machine, struct thread *th)
+{
+ machine->last_match = NULL;
+ rb_erase(&th->rb_node, &machine->threads);
+ /*
+ * We may have references to this thread, for instance in some hist_entry
+ * instances, so just move them to a separate list.
+ */
+ list_add_tail(&th->node, &machine->dead_threads);
+}
+
int machine__process_fork_event(struct machine *machine, union perf_event *event)
{
- struct thread *thread = machine__findnew_thread(machine, event->fork.tid);
+ struct thread *thread = machine__find_thread(machine, event->fork.tid);
struct thread *parent = machine__findnew_thread(machine, event->fork.ptid);
+ /* if a thread currently exists for the thread id remove it */
+ if (thread != NULL)
+ machine__remove_thread(machine, thread);
+
+ thread = machine__findnew_thread(machine, event->fork.tid);
if (dump_trace)
perf_event__fprintf_task(event, stdout);
@@ -1028,27 +1044,12 @@ int machine__process_fork_event(struct machine *machine, union perf_event *event
return 0;
}
-static void machine__remove_thread(struct machine *machine, struct thread *th)
-{
- machine->last_match = NULL;
- rb_erase(&th->rb_node, &machine->threads);
- /*
- * We may have references to this thread, for instance in some hist_entry
- * instances, so just move them to a separate list.
- */
- list_add_tail(&th->node, &machine->dead_threads);
-}
-
-int machine__process_exit_event(struct machine *machine, union perf_event *event)
+int machine__process_exit_event(struct machine *machine __maybe_unused,
+ union perf_event *event)
{
- struct thread *thread = machine__find_thread(machine, event->fork.tid);
-
if (dump_trace)
perf_event__fprintf_task(event, stdout);
- if (thread != NULL)
- machine__remove_thread(machine, thread);
-
return 0;
}
--
1.7.10.1
next prev parent reply other threads:[~2013-08-08 2:51 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-08 2:50 [PATCH 00/19] perf sched: Add timehist subcommand David Ahern
2013-08-08 2:50 ` David Ahern [this message]
2013-08-08 14:53 ` [PATCH 01/19] perf: sample after exit loses thread correlation - v3 Arnaldo Carvalho de Melo
2013-08-08 20:42 ` David Ahern
2013-08-08 21:23 ` Arnaldo Carvalho de Melo
2013-08-08 2:50 ` [PATCH 02/19] perf sched: Simplify arguments to read_events David Ahern
2013-08-08 14:54 ` Arnaldo Carvalho de Melo
2013-08-15 7:55 ` [tip:perf/core] " tip-bot for David Ahern
2013-08-08 2:50 ` [PATCH 03/19] perf sched: Remove thread lookup in sample handler David Ahern
2013-08-08 14:56 ` Arnaldo Carvalho de Melo
2013-08-15 7:55 ` [tip:perf/core] " tip-bot for David Ahern
2013-08-08 2:50 ` [PATCH 04/19] perf sched: Remove sched_process_exit tracepoint David Ahern
2013-08-08 14:57 ` Arnaldo Carvalho de Melo
2013-08-15 7:55 ` [tip:perf/core] " tip-bot for David Ahern
2013-08-08 2:50 ` [PATCH 05/19] perf sched: Remove sched_process_fork tracepoint David Ahern
2013-08-08 15:00 ` Arnaldo Carvalho de Melo
2013-08-15 7:55 ` [tip:perf/core] " tip-bot for David Ahern
2013-08-08 2:50 ` [PATCH 06/19] perf symbol: Add optimization for idle kernel symbols David Ahern
2013-08-08 2:50 ` [PATCH 07/19] perf top: Use new idle_sym check David Ahern
2013-08-08 15:06 ` Arnaldo Carvalho de Melo
2013-08-09 2:49 ` David Ahern
2013-08-09 13:53 ` Arnaldo Carvalho de Melo
2013-08-08 2:50 ` [PATCH 08/19] perf symbol: Save vmlinux or kallsyms path loaded David Ahern
2013-08-08 15:08 ` Arnaldo Carvalho de Melo
2013-08-09 2:51 ` David Ahern
2013-08-08 2:50 ` [PATCH 09/19] perf tool: Simplify options to perf_evsel__print_ip David Ahern
2013-08-08 15:14 ` Arnaldo Carvalho de Melo
2013-08-15 7:55 ` [tip:perf/core] " tip-bot for David Ahern
2013-08-08 2:50 ` [PATCH 10/19] perf tool: Add option to print stack trace on single line David Ahern
2013-08-15 7:55 ` [tip:perf/core] perf evsel: " tip-bot for David Ahern
2013-08-08 2:50 ` [PATCH 11/19] perf tool: Add option to limit stack depth in callchain dumps David Ahern
2013-08-15 7:56 ` [tip:perf/core] perf evsel: " tip-bot for David Ahern
2013-08-08 2:50 ` [PATCH 12/19] perf tool: Add support for exclude symbol list to symbol_conf David Ahern
2013-08-08 2:50 ` [PATCH 13/19] perf tool: Skip symbols in exclude list while printing callchain David Ahern
2013-08-08 2:50 ` [PATCH 14/19] perf sched: pass event to evsel handlers using data element David Ahern
2013-08-08 2:50 ` [PATCH 15/19] perf sched: Add timehist command David Ahern
2013-08-08 2:50 ` [PATCH 16/19] perf tool: Change perf_session__has_traces to actually check for tracepoints David Ahern
2013-08-08 15:16 ` Arnaldo Carvalho de Melo
2013-08-15 7:56 ` [tip:perf/core] perf session: " tip-bot for David Ahern
2013-08-08 2:50 ` [PATCH 17/19] perf sched timehist: Add support for context-switch event David Ahern
2013-08-08 2:51 ` [PATCH 18/19] perf sched timehist: Print all events in verbose mode David Ahern
2013-08-08 2:51 ` [PATCH 19/19] perf sched timehist: Add pid/tid option David Ahern
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1375930261-77273-2-git-send-email-dsahern@gmail.com \
--to=dsahern@gmail.com \
--cc=acme@ghostprotocols.net \
--cc=adrian.hunter@intel.com \
--cc=efault@gmx.de \
--cc=eranian@google.com \
--cc=fweisbec@gmail.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox