linux_dsm_epyc7002/tools/perf/util
David Ahern 236a3bbd5c perf tools: Sample after exit loses thread correlation
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 - a 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

v4: per Arnaldo's request add dead flag to thread struct and set when task exits

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: 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>
Link: http://lkml.kernel.org/r/1376491767-84171-1-git-send-email-dsahern@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-08-26 17:25:36 -03:00
..
include perf tools: Default to cpu// for events v5 2013-07-12 13:53:52 -03:00
scripting-engines perf script: Fix named threads support 2013-07-22 11:55:53 -03:00
abspath.c
alias.c
annotate.c perf annotate: Add call target name if it is missing 2013-08-07 17:35:36 -03:00
annotate.h perf tools: Remove dependency on libnewt 2013-04-01 12:23:21 -03:00
bitmap.c
build-id.c perf tools: Remove filter parameter of thread__find_addr_map() 2013-08-12 10:31:12 -03:00
build-id.h
cache.h
callchain.c perf tools: Support callchain sorting based on addresses 2013-07-22 12:42:18 -03:00
callchain.h perf tools: Support callchain sorting based on addresses 2013-07-22 12:42:18 -03:00
cgroup.c
cgroup.h
color.c
color.h
config.c
cpumap.c perf stat: Add per-core aggregation 2013-03-25 16:13:26 -03:00
cpumap.h perf tools: Rename cpu_map__all() to cpu_map__empty() 2013-07-12 13:45:44 -03:00
ctype.c
debug.c
debug.h
dso.c perf symbols: Add support for reading from /proc/kcore 2013-08-07 17:35:33 -03:00
dso.h perf symbols: Add support for reading from /proc/kcore 2013-08-07 17:35:33 -03:00
dwarf-aux.c
dwarf-aux.h
environment.c
event.c perf tools: Remove filter parameter of thread__find_addr_map() 2013-08-12 10:31:12 -03:00
event.h perf tools: Remove filter parameter of perf_event__preprocess_sample() 2013-08-12 10:31:11 -03:00
evlist.c perf tools: Add debug prints 2013-08-16 17:17:58 -03:00
evlist.h perf evlist: Add perf_evlist__id2sid method to get event ID related data 2013-08-07 17:35:21 -03:00
evsel.c perf tools: Add debug prints 2013-08-16 17:17:58 -03:00
evsel.h perf evsel: Add support for enabling counters 2013-08-07 17:35:28 -03:00
exec_cmd.c
exec_cmd.h
generate-cmdlist.sh
header.c perf tools: Improve robustness of topology parsing code 2013-08-14 11:42:53 -03:00
header.h perf header: Recognize version number for perf data file 2013-07-17 17:04:00 -03:00
help.c
help.h
hist.c perf tools: Support callchain sorting based on addresses 2013-07-22 12:42:18 -03:00
hist.h perf tools: Move hist_entry__period_snprintf into stdio code 2013-07-12 13:54:18 -03:00
hweight.c
intlist.c
intlist.h
levenshtein.c
levenshtein.h
machine.c perf tools: Sample after exit loses thread correlation 2013-08-26 17:25:36 -03:00
machine.h perf machine: Add symbol filter to struct machine 2013-08-12 10:31:09 -03:00
map.c perf symbols: Add support for reading from /proc/kcore 2013-08-07 17:35:33 -03:00
map.h perf symbols: Add support for reading from /proc/kcore 2013-08-07 17:35:33 -03:00
pager.c
parse-events.c perf tools: Add support for pinned modifier 2013-08-07 17:35:40 -03:00
parse-events.h perf parse events: Demystify memory allocations 2013-07-12 13:52:05 -03:00
parse-events.l perf tools: Add support for pinned modifier 2013-08-07 17:35:40 -03:00
parse-events.y perf parse events: Demystify memory allocations 2013-07-12 13:52:05 -03:00
parse-options.c
parse-options.h
path.c
perf_regs.h
PERF-VERSION-GEN perf tools: Fix perf version generation 2013-07-08 18:09:52 -03:00
pmu.c perf list: List kernel supplied event aliases 2013-07-12 13:53:53 -03:00
pmu.h perf list: List kernel supplied event aliases 2013-07-12 13:53:53 -03:00
pmu.l
pmu.y
probe-event.c
probe-event.h
probe-finder.c
probe-finder.h
pstack.c
pstack.h
python-ext-sources
python.c perf tools: Re-implement debug print function for linking python/perf.so 2013-08-16 17:17:58 -03:00
quote.c
quote.h
rblist.c
rblist.h
run-command.c
run-command.h
session.c perf tools: Remove filter parameter of perf_event__preprocess_sample() 2013-08-12 10:31:11 -03:00
session.h perf evsel: Add option to limit stack depth in callchain dumps 2013-08-12 10:31:08 -03:00
setup.py perf tools: Merge all *CFLAGS* make variable into CFLAGS 2013-05-30 16:12:03 +03:00
sigchain.c
sigchain.h
sort.c perf tools: Move weight back to common sort keys 2013-07-22 16:58:28 -03:00
sort.h perf tools: Move weight back to common sort keys 2013-07-22 16:58:28 -03:00
stat.c perf stats: Add max and min stats 2013-08-07 17:35:26 -03:00
stat.h perf stats: Add max and min stats 2013-08-07 17:35:26 -03:00
strbuf.c
strbuf.h
strfilter.c
strfilter.h
string.c perf tools: Default to cpu// for events v5 2013-07-12 13:53:52 -03:00
strlist.c
strlist.h
svghelper.c
svghelper.h
symbol-elf.c perf symbols: Add support for reading from /proc/kcore 2013-08-07 17:35:33 -03:00
symbol-minimal.c perf symbols: Add support for reading from /proc/kcore 2013-08-07 17:35:33 -03:00
symbol.c perf symbols: Add support for reading from /proc/kcore 2013-08-07 17:35:33 -03:00
symbol.h perf symbols: Add support for reading from /proc/kcore 2013-08-07 17:35:33 -03:00
sysfs.c
sysfs.h
target.c
target.h
thread_map.c
thread_map.h
thread.c perf tools: struct thread has a tid not a pid 2013-07-12 13:53:50 -03:00
thread.h perf tools: Sample after exit loses thread correlation 2013-08-26 17:25:36 -03:00
tool.h perf tools: Remove event types framework completely 2013-07-15 16:28:22 -03:00
top.c perf top: Fix percent output when no samples collected 2013-05-28 16:23:59 +03:00
top.h perf top: move CONSOLE_CLEAR to header file 2013-08-07 17:35:26 -03:00
trace-event-info.c perf util: No need to call read_trace_init() in tracing_data_header() 2013-07-12 13:52:31 -03:00
trace-event-parse.c perf script: Adopt latency_format variable 2013-07-12 13:52:28 -03:00
trace-event-read.c perf util: Parse header_page to get proper long size 2013-07-12 13:52:24 -03:00
trace-event-scripting.c perf script: Fix named threads support 2013-07-22 11:55:53 -03:00
trace-event.h perf script: Fix named threads support 2013-07-22 11:55:53 -03:00
types.h
unwind.c perf tools: Remove filter parameter of thread__find_addr_map() 2013-08-12 10:31:12 -03:00
unwind.h
usage.c
util.c perf util: Add parse_nsec_time() function 2013-08-07 17:35:26 -03:00
util.h perf util: Add parse_nsec_time() function 2013-08-07 17:35:26 -03:00
values.c
values.h
vdso.c perf symbols: Fix vdso list searching 2013-07-08 17:59:07 -03:00
vdso.h
wrapper.c
xyarray.c
xyarray.h