defd8d3877
perf does not properly handle monitoring of processes with named threads. For example: $ ps -C myapp -L PID LWP TTY TIME CMD 25118 25118 ? 00:00:00 myapp 25118 25119 ? 00:00:00 myapp:worker perf record -e cs -c 1 -fo /tmp/perf.data -p 25118 -- sleep 10 perf report --stdio -i /tmp/perf.data 100.00% myapp:worker [kernel.kallsyms] [k] perf_event_task_sched_out The process name is set to the name of the last thread it finds for the process. The Problem: perf-top and perf-record both create a thread_map of threads to be monitored. That map is used in perf_event__synthesize_thread_map which loops over the entries in thread_map and calls __event__synthesize_thread to generate COMM and MMAP events. __event__synthesize_thread calls perf_event__synthesize_comm which opens /proc/pid/status, reads the name of the task and its thread group id. That's all fine. The problem is that it then reads /proc/pid/task and generates COMM events for each task it finds - but using the name found in /proc/pid/status where pid is the thread of interest. The end result (looping over thread_map + synthesizing comm events for each thread each time) means the name of the last thread processed sets the name for all threads in the process - which is not good for multithreaded processes with named threads. The Fix: perf_event__synthesize_comm has an input argument (full) that decides whether to process task entries for each pid it is passed. It currently never set to 0 (perf_event__synthesize_comm has a single caller and it always passes the value 1). Let's fix that. Add the full input argument to __event__synthesize_thread which passes it to perf_event__synthesize_comm. For thread/process monitoring set full to 0 which means COMM and MMAP events are only generated for the pid passed to it. For system wide monitoring set full to 1 so that COMM events are generated for all threads in a process. Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1324578603-12762-2-git-send-email-dsahern@gmail.com Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
||
---|---|---|
.. | ||
include | ||
scripting-engines | ||
ui | ||
abspath.c | ||
alias.c | ||
annotate.c | ||
annotate.h | ||
bitmap.c | ||
build-id.c | ||
build-id.h | ||
cache.h | ||
callchain.c | ||
callchain.h | ||
cgroup.c | ||
cgroup.h | ||
color.c | ||
color.h | ||
config.c | ||
cpumap.c | ||
cpumap.h | ||
ctype.c | ||
debug.c | ||
debug.h | ||
debugfs.c | ||
debugfs.h | ||
dwarf-aux.c | ||
dwarf-aux.h | ||
environment.c | ||
event.c | ||
event.h | ||
evlist.c | ||
evlist.h | ||
evsel.c | ||
evsel.h | ||
exec_cmd.c | ||
exec_cmd.h | ||
generate-cmdlist.sh | ||
header.c | ||
header.h | ||
help.c | ||
help.h | ||
hist.c | ||
hist.h | ||
hweight.c | ||
levenshtein.c | ||
levenshtein.h | ||
map.c | ||
map.h | ||
pager.c | ||
parse-events.c | ||
parse-events.h | ||
parse-options.c | ||
parse-options.h | ||
path.c | ||
PERF-VERSION-GEN | ||
probe-event.c | ||
probe-event.h | ||
probe-finder.c | ||
probe-finder.h | ||
pstack.c | ||
pstack.h | ||
python.c | ||
quote.c | ||
quote.h | ||
run-command.c | ||
run-command.h | ||
session.c | ||
session.h | ||
setup.py | ||
sigchain.c | ||
sigchain.h | ||
sort.c | ||
sort.h | ||
strbuf.c | ||
strbuf.h | ||
strfilter.c | ||
strfilter.h | ||
string.c | ||
strlist.c | ||
strlist.h | ||
svghelper.c | ||
svghelper.h | ||
symbol.c | ||
symbol.h | ||
thread_map.c | ||
thread_map.h | ||
thread.c | ||
thread.h | ||
tool.h | ||
top.c | ||
top.h | ||
trace-event-info.c | ||
trace-event-parse.c | ||
trace-event-read.c | ||
trace-event-scripting.c | ||
trace-event.h | ||
types.h | ||
usage.c | ||
util.c | ||
util.h | ||
values.c | ||
values.h | ||
wrapper.c | ||
xyarray.c | ||
xyarray.h |