* [PATCH 0/3] perf trace enhancements - v2
@ 2013-08-29 4:29 David Ahern
2013-08-29 4:29 ` [PATCH 1/3] perf evlist: Add tracepoint lookup by name David Ahern
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: David Ahern @ 2013-08-29 4:29 UTC (permalink / raw)
To: acme, linux-kernel; +Cc: David Ahern
Arnaldo:
A couple of enhancements to perf-trace: ability to analyze events from a
file and when processing a file limit the analysis to a given set of
pid and tids.
David Ahern (3):
perf evlist: Add tracepoint lookup by name
perf trace: Add option to analyze events in a file versus live - v2
perf trace: Honor target pid / tid options when analyzing a file
tools/perf/Documentation/perf-trace.txt | 4 +
tools/perf/builtin-trace.c | 141 ++++++++++++++++++++++++++++++-
tools/perf/util/evlist.c | 15 ++++
tools/perf/util/evlist.h | 4 +
4 files changed, 162 insertions(+), 2 deletions(-)
--
1.7.10.1
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH 1/3] perf evlist: Add tracepoint lookup by name 2013-08-29 4:29 [PATCH 0/3] perf trace enhancements - v2 David Ahern @ 2013-08-29 4:29 ` David Ahern 2013-08-31 8:15 ` [tip:perf/core] " tip-bot for David Ahern 2013-08-29 4:29 ` [PATCH 2/3] perf trace: Add option to analyze events in a file versus live - v2 David Ahern 2013-08-29 4:29 ` [PATCH 3/3] perf trace: Honor target pid / tid options when analyzing a file David Ahern 2 siblings, 1 reply; 8+ messages in thread From: David Ahern @ 2013-08-29 4:29 UTC (permalink / raw) To: acme, linux-kernel Cc: David Ahern, Adrian Hunter, Frederic Weisbecker, Mike Galbraith, Paul Mackerras, Peter Zijlstra, Stephane Eranian Will be used by upcoming perf-trace replay option. Signed-off-by: David Ahern <dsahern@gmail.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> --- tools/perf/util/evlist.c | 15 +++++++++++++++ tools/perf/util/evlist.h | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 1f5105a..c0e43ee 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -210,6 +210,21 @@ perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id) return NULL; } +struct perf_evsel * +perf_evlist__find_tracepoint_by_name(struct perf_evlist *evlist, + const char *name) +{ + struct perf_evsel *evsel; + + list_for_each_entry(evsel, &evlist->entries, node) { + if ((evsel->attr.type == PERF_TYPE_TRACEPOINT) && + (strcmp(evsel->name, name) == 0)) + return evsel; + } + + return NULL; +} + int perf_evlist__add_newtp(struct perf_evlist *evlist, const char *sys, const char *name, void *handler) { diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index 327abab..8a509e2 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -71,6 +71,10 @@ int perf_evlist__set_filter(struct perf_evlist *evlist, const char *filter); struct perf_evsel * perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id); +struct perf_evsel * +perf_evlist__find_tracepoint_by_name(struct perf_evlist *evlist, + const char *name); + void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel, int cpu, int thread, u64 id); -- 1.7.10.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [tip:perf/core] perf evlist: Add tracepoint lookup by name 2013-08-29 4:29 ` [PATCH 1/3] perf evlist: Add tracepoint lookup by name David Ahern @ 2013-08-31 8:15 ` tip-bot for David Ahern 0 siblings, 0 replies; 8+ messages in thread From: tip-bot for David Ahern @ 2013-08-31 8:15 UTC (permalink / raw) To: linux-tip-commits Cc: acme, linux-kernel, eranian, paulus, hpa, mingo, peterz, efault, fweisbec, dsahern, adrian.hunter, tglx Commit-ID: a2f2804a7142b043dafd39f21b86777840e1a78c Gitweb: http://git.kernel.org/tip/a2f2804a7142b043dafd39f21b86777840e1a78c Author: David Ahern <dsahern@gmail.com> AuthorDate: Wed, 28 Aug 2013 22:29:51 -0600 Committer: Arnaldo Carvalho de Melo <acme@redhat.com> CommitDate: Thu, 29 Aug 2013 17:41:02 -0300 perf evlist: Add tracepoint lookup by name Will be used by upcoming perf-trace replay option. Signed-off-by: David Ahern <dsahern@gmail.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1377750593-48046-2-git-send-email-dsahern@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/util/evlist.c | 15 +++++++++++++++ tools/perf/util/evlist.h | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 6a629af..5df4ca9 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -208,6 +208,21 @@ perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id) return NULL; } +struct perf_evsel * +perf_evlist__find_tracepoint_by_name(struct perf_evlist *evlist, + const char *name) +{ + struct perf_evsel *evsel; + + list_for_each_entry(evsel, &evlist->entries, node) { + if ((evsel->attr.type == PERF_TYPE_TRACEPOINT) && + (strcmp(evsel->name, name) == 0)) + return evsel; + } + + return NULL; +} + int perf_evlist__add_newtp(struct perf_evlist *evlist, const char *sys, const char *name, void *handler) { diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index ab95d72..841a394 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -74,6 +74,10 @@ int perf_evlist__set_filter(struct perf_evlist *evlist, const char *filter); struct perf_evsel * perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id); +struct perf_evsel * +perf_evlist__find_tracepoint_by_name(struct perf_evlist *evlist, + const char *name); + void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel, int cpu, int thread, u64 id); ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/3] perf trace: Add option to analyze events in a file versus live - v2 2013-08-29 4:29 [PATCH 0/3] perf trace enhancements - v2 David Ahern 2013-08-29 4:29 ` [PATCH 1/3] perf evlist: Add tracepoint lookup by name David Ahern @ 2013-08-29 4:29 ` David Ahern 2013-08-31 8:15 ` [tip:perf/core] perf trace: Add option to analyze events in a file versus live tip-bot for David Ahern 2013-08-29 4:29 ` [PATCH 3/3] perf trace: Honor target pid / tid options when analyzing a file David Ahern 2 siblings, 1 reply; 8+ messages in thread From: David Ahern @ 2013-08-29 4:29 UTC (permalink / raw) To: acme, linux-kernel Cc: David Ahern, Adrian Hunter, Frederic Weisbecker, Mike Galbraith, Paul Mackerras, Peter Zijlstra, Stephane Eranian Allows capture of raw_syscall:* events and analyzed at a later time. v2: change -i option from inherit to input name for consistency with other perf commands Signed-off-by: David Ahern <dsahern@gmail.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> --- tools/perf/Documentation/perf-trace.txt | 4 ++ tools/perf/builtin-trace.c | 98 ++++++++++++++++++++++++++++++- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/tools/perf/Documentation/perf-trace.txt b/tools/perf/Documentation/perf-trace.txt index fe19811..daccd2c 100644 --- a/tools/perf/Documentation/perf-trace.txt +++ b/tools/perf/Documentation/perf-trace.txt @@ -74,6 +74,10 @@ the thread executes on the designated CPUs. Default is to monitor all CPUs. --sched: Accrue thread runtime and provide a summary at the end of the session. +-i +--input + Process events from a given perf data file. + SEE ALSO -------- linkperf:perf-record[1], linkperf:perf-script[1] diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index b72afc7..a03c777 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -4,6 +4,7 @@ #include "util/debug.h" #include "util/evlist.h" #include "util/machine.h" +#include "util/session.h" #include "util/thread.h" #include "util/parse-options.h" #include "util/strlist.h" @@ -648,6 +649,36 @@ out_dump: return 0; } +static int trace__process_sample(struct perf_tool *tool, + union perf_event *event __maybe_unused, + struct perf_sample *sample, + struct perf_evsel *evsel, + struct machine *machine __maybe_unused) +{ + struct trace *trace = container_of(tool, struct trace, tool); + int err = 0; + + tracepoint_handler handler = evsel->handler.func; + + if (trace->base_time == 0) + trace->base_time = sample->time; + + if (handler) + handler(trace, evsel, sample); + + return err; +} + +static bool +perf_session__has_tp(struct perf_session *session, const char *name) +{ + struct perf_evsel *evsel; + + evsel = perf_evlist__find_tracepoint_by_name(session->evlist, name); + + return evsel != NULL; +} + static int trace__run(struct trace *trace, int argc, const char **argv) { struct perf_evlist *evlist = perf_evlist__new(); @@ -787,6 +818,65 @@ out: return err; } +static int trace__replay(struct trace *trace) +{ + const struct perf_evsel_str_handler handlers[] = { + { "raw_syscalls:sys_enter", trace__sys_enter, }, + { "raw_syscalls:sys_exit", trace__sys_exit, }, + }; + + struct perf_session *session; + int err = -1; + + trace->tool.sample = trace__process_sample; + trace->tool.mmap = perf_event__process_mmap; + trace->tool.comm = perf_event__process_comm; + trace->tool.exit = perf_event__process_exit; + trace->tool.fork = perf_event__process_fork; + trace->tool.attr = perf_event__process_attr; + trace->tool.tracing_data = perf_event__process_tracing_data; + trace->tool.build_id = perf_event__process_build_id; + + trace->tool.ordered_samples = true; + trace->tool.ordering_requires_timestamps = true; + + /* add tid to output */ + trace->multiple_threads = true; + + if (symbol__init() < 0) + return -1; + + session = perf_session__new(input_name, O_RDONLY, 0, false, + &trace->tool); + if (session == NULL) + return -ENOMEM; + + err = perf_session__set_tracepoints_handlers(session, handlers); + if (err) + goto out; + + if (!perf_session__has_tp(session, "raw_syscalls:sys_enter")) { + pr_err("Data file does not have raw_syscalls:sys_enter events\n"); + goto out; + } + + if (!perf_session__has_tp(session, "raw_syscalls:sys_exit")) { + pr_err("Data file does not have raw_syscalls:sys_exit events\n"); + goto out; + } + + setup_pager(); + + err = perf_session__process_events(session, &trace->tool); + if (err) + pr_err("Failed to process events, error %d", err); + +out: + perf_session__delete(session); + + return err; +} + static size_t trace__fprintf_threads_header(FILE *fp) { size_t printed; @@ -888,6 +978,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused) OPT_STRING('e', "expr", &ev_qualifier_str, "expr", "list of events to trace"), OPT_STRING('o', "output", &output_name, "file", "output file name"), + OPT_STRING('i', "input", &input_name, "file", "Analyze events in file"), OPT_STRING('p', "pid", &trace.opts.target.pid, "pid", "trace events on existing process id"), OPT_STRING('t', "tid", &trace.opts.target.tid, "tid", @@ -896,7 +987,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused) "system-wide collection from all CPUs"), OPT_STRING('C', "cpu", &trace.opts.target.cpu_list, "cpu", "list of cpus to monitor"), - OPT_BOOLEAN('i', "no-inherit", &trace.opts.no_inherit, + OPT_BOOLEAN(0, "no-inherit", &trace.opts.no_inherit, "child tasks do not inherit counters"), OPT_UINTEGER('m', "mmap-pages", &trace.opts.mmap_pages, "number of mmap data pages"), @@ -954,7 +1045,10 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused) if (!argc && perf_target__none(&trace.opts.target)) trace.opts.target.system_wide = true; - err = trace__run(&trace, argc, argv); + if (input_name) + err = trace__replay(&trace); + else + err = trace__run(&trace, argc, argv); if (trace.sched && !err) trace__fprintf_thread_summary(&trace, trace.output); -- 1.7.10.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [tip:perf/core] perf trace: Add option to analyze events in a file versus live 2013-08-29 4:29 ` [PATCH 2/3] perf trace: Add option to analyze events in a file versus live - v2 David Ahern @ 2013-08-31 8:15 ` tip-bot for David Ahern 0 siblings, 0 replies; 8+ messages in thread From: tip-bot for David Ahern @ 2013-08-31 8:15 UTC (permalink / raw) To: linux-tip-commits Cc: acme, linux-kernel, eranian, paulus, hpa, mingo, peterz, efault, fweisbec, dsahern, adrian.hunter, tglx Commit-ID: 6810fc915f7a89d8134edb3996dbbf8eac386c26 Gitweb: http://git.kernel.org/tip/6810fc915f7a89d8134edb3996dbbf8eac386c26 Author: David Ahern <dsahern@gmail.com> AuthorDate: Wed, 28 Aug 2013 22:29:52 -0600 Committer: Arnaldo Carvalho de Melo <acme@redhat.com> CommitDate: Thu, 29 Aug 2013 17:42:34 -0300 perf trace: Add option to analyze events in a file versus live Allows capture of raw_syscall:* events and analyzed at a later time. v2: change -i option from inherit to input name for consistency with other perf commands Signed-off-by: David Ahern <dsahern@gmail.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1377750593-48046-3-git-send-email-dsahern@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/Documentation/perf-trace.txt | 4 ++ tools/perf/builtin-trace.c | 98 ++++++++++++++++++++++++++++++++- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/tools/perf/Documentation/perf-trace.txt b/tools/perf/Documentation/perf-trace.txt index fe19811..daccd2c 100644 --- a/tools/perf/Documentation/perf-trace.txt +++ b/tools/perf/Documentation/perf-trace.txt @@ -74,6 +74,10 @@ the thread executes on the designated CPUs. Default is to monitor all CPUs. --sched: Accrue thread runtime and provide a summary at the end of the session. +-i +--input + Process events from a given perf data file. + SEE ALSO -------- linkperf:perf-record[1], linkperf:perf-script[1] diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 88387c5..2a6ebe1 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -4,6 +4,7 @@ #include "util/debug.h" #include "util/evlist.h" #include "util/machine.h" +#include "util/session.h" #include "util/thread.h" #include "util/parse-options.h" #include "util/strlist.h" @@ -652,6 +653,36 @@ out_dump: return 0; } +static int trace__process_sample(struct perf_tool *tool, + union perf_event *event __maybe_unused, + struct perf_sample *sample, + struct perf_evsel *evsel, + struct machine *machine __maybe_unused) +{ + struct trace *trace = container_of(tool, struct trace, tool); + int err = 0; + + tracepoint_handler handler = evsel->handler.func; + + if (trace->base_time == 0) + trace->base_time = sample->time; + + if (handler) + handler(trace, evsel, sample); + + return err; +} + +static bool +perf_session__has_tp(struct perf_session *session, const char *name) +{ + struct perf_evsel *evsel; + + evsel = perf_evlist__find_tracepoint_by_name(session->evlist, name); + + return evsel != NULL; +} + static int trace__run(struct trace *trace, int argc, const char **argv) { struct perf_evlist *evlist = perf_evlist__new(); @@ -791,6 +822,65 @@ out: return err; } +static int trace__replay(struct trace *trace) +{ + const struct perf_evsel_str_handler handlers[] = { + { "raw_syscalls:sys_enter", trace__sys_enter, }, + { "raw_syscalls:sys_exit", trace__sys_exit, }, + }; + + struct perf_session *session; + int err = -1; + + trace->tool.sample = trace__process_sample; + trace->tool.mmap = perf_event__process_mmap; + trace->tool.comm = perf_event__process_comm; + trace->tool.exit = perf_event__process_exit; + trace->tool.fork = perf_event__process_fork; + trace->tool.attr = perf_event__process_attr; + trace->tool.tracing_data = perf_event__process_tracing_data; + trace->tool.build_id = perf_event__process_build_id; + + trace->tool.ordered_samples = true; + trace->tool.ordering_requires_timestamps = true; + + /* add tid to output */ + trace->multiple_threads = true; + + if (symbol__init() < 0) + return -1; + + session = perf_session__new(input_name, O_RDONLY, 0, false, + &trace->tool); + if (session == NULL) + return -ENOMEM; + + err = perf_session__set_tracepoints_handlers(session, handlers); + if (err) + goto out; + + if (!perf_session__has_tp(session, "raw_syscalls:sys_enter")) { + pr_err("Data file does not have raw_syscalls:sys_enter events\n"); + goto out; + } + + if (!perf_session__has_tp(session, "raw_syscalls:sys_exit")) { + pr_err("Data file does not have raw_syscalls:sys_exit events\n"); + goto out; + } + + setup_pager(); + + err = perf_session__process_events(session, &trace->tool); + if (err) + pr_err("Failed to process events, error %d", err); + +out: + perf_session__delete(session); + + return err; +} + static size_t trace__fprintf_threads_header(FILE *fp) { size_t printed; @@ -892,6 +982,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused) OPT_STRING('e', "expr", &ev_qualifier_str, "expr", "list of events to trace"), OPT_STRING('o', "output", &output_name, "file", "output file name"), + OPT_STRING('i', "input", &input_name, "file", "Analyze events in file"), OPT_STRING('p', "pid", &trace.opts.target.pid, "pid", "trace events on existing process id"), OPT_STRING('t', "tid", &trace.opts.target.tid, "tid", @@ -900,7 +991,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused) "system-wide collection from all CPUs"), OPT_STRING('C', "cpu", &trace.opts.target.cpu_list, "cpu", "list of cpus to monitor"), - OPT_BOOLEAN('i', "no-inherit", &trace.opts.no_inherit, + OPT_BOOLEAN(0, "no-inherit", &trace.opts.no_inherit, "child tasks do not inherit counters"), OPT_UINTEGER('m', "mmap-pages", &trace.opts.mmap_pages, "number of mmap data pages"), @@ -958,7 +1049,10 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused) if (!argc && perf_target__none(&trace.opts.target)) trace.opts.target.system_wide = true; - err = trace__run(&trace, argc, argv); + if (input_name) + err = trace__replay(&trace); + else + err = trace__run(&trace, argc, argv); if (trace.sched && !err) trace__fprintf_thread_summary(&trace, trace.output); ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/3] perf trace: Honor target pid / tid options when analyzing a file 2013-08-29 4:29 [PATCH 0/3] perf trace enhancements - v2 David Ahern 2013-08-29 4:29 ` [PATCH 1/3] perf evlist: Add tracepoint lookup by name David Ahern 2013-08-29 4:29 ` [PATCH 2/3] perf trace: Add option to analyze events in a file versus live - v2 David Ahern @ 2013-08-29 4:29 ` David Ahern 2013-08-31 8:15 ` [tip:perf/core] " tip-bot for David Ahern 2 siblings, 1 reply; 8+ messages in thread From: David Ahern @ 2013-08-29 4:29 UTC (permalink / raw) To: acme, linux-kernel Cc: David Ahern, Adrian Hunter, Frederic Weisbecker, Mike Galbraith, Paul Mackerras, Peter Zijlstra, Stephane Eranian Allows capture of raw_syscall events for all processes or threads in a task and then analyzing specific ones. Signed-off-by: David Ahern <dsahern@gmail.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> --- tools/perf/builtin-trace.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index a03c777..ec0c7b3 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -8,6 +8,7 @@ #include "util/thread.h" #include "util/parse-options.h" #include "util/strlist.h" +#include "util/intlist.h" #include "util/thread_map.h" #include <libaudit.h> @@ -259,6 +260,8 @@ struct trace { unsigned long nr_events; struct strlist *ev_qualifier; bool not_ev_qualifier; + struct intlist *tid_list; + struct intlist *pid_list; bool sched; bool multiple_threads; double duration_filter; @@ -649,6 +652,18 @@ out_dump: return 0; } +static bool skip_sample(struct trace *trace, struct perf_sample *sample) +{ + if ((trace->pid_list && intlist__find(trace->pid_list, sample->pid)) || + (trace->tid_list && intlist__find(trace->tid_list, sample->tid))) + return false; + + if (trace->pid_list || trace->tid_list) + return true; + + return false; +} + static int trace__process_sample(struct perf_tool *tool, union perf_event *event __maybe_unused, struct perf_sample *sample, @@ -660,6 +675,9 @@ static int trace__process_sample(struct perf_tool *tool, tracepoint_handler handler = evsel->handler.func; + if (skip_sample(trace, sample)) + return 0; + if (trace->base_time == 0) trace->base_time = sample->time; @@ -679,6 +697,27 @@ perf_session__has_tp(struct perf_session *session, const char *name) return evsel != NULL; } +static int parse_target_str(struct trace *trace) +{ + if (trace->opts.target.pid) { + trace->pid_list = intlist__new(trace->opts.target.pid); + if (trace->pid_list == NULL) { + pr_err("Error parsing process id string\n"); + return -EINVAL; + } + } + + if (trace->opts.target.tid) { + trace->tid_list = intlist__new(trace->opts.target.tid); + if (trace->tid_list == NULL) { + pr_err("Error parsing thread id string\n"); + return -EINVAL; + } + } + + return 0; +} + static int trace__run(struct trace *trace, int argc, const char **argv) { struct perf_evlist *evlist = perf_evlist__new(); @@ -865,6 +904,10 @@ static int trace__replay(struct trace *trace) goto out; } + err = parse_target_str(trace); + if (err != 0) + goto out; + setup_pager(); err = perf_session__process_events(session, &trace->tool); -- 1.7.10.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [tip:perf/core] perf trace: Honor target pid / tid options when analyzing a file 2013-08-29 4:29 ` [PATCH 3/3] perf trace: Honor target pid / tid options when analyzing a file David Ahern @ 2013-08-31 8:15 ` tip-bot for David Ahern 0 siblings, 0 replies; 8+ messages in thread From: tip-bot for David Ahern @ 2013-08-31 8:15 UTC (permalink / raw) To: linux-tip-commits Cc: acme, linux-kernel, eranian, paulus, hpa, mingo, peterz, efault, fweisbec, dsahern, adrian.hunter, tglx Commit-ID: bdc896617b4fcaa9c89da9a9c5b72660f6741d46 Gitweb: http://git.kernel.org/tip/bdc896617b4fcaa9c89da9a9c5b72660f6741d46 Author: David Ahern <dsahern@gmail.com> AuthorDate: Wed, 28 Aug 2013 22:29:53 -0600 Committer: Arnaldo Carvalho de Melo <acme@redhat.com> CommitDate: Thu, 29 Aug 2013 17:45:39 -0300 perf trace: Honor target pid / tid options when analyzing a file Allows capture of raw_syscall events for all processes or threads in a task and then analyzing specific ones. Signed-off-by: David Ahern <dsahern@gmail.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1377750593-48046-4-git-send-email-dsahern@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/builtin-trace.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 2a6ebe1..845facc 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -8,6 +8,7 @@ #include "util/thread.h" #include "util/parse-options.h" #include "util/strlist.h" +#include "util/intlist.h" #include "util/thread_map.h" #include <libaudit.h> @@ -259,6 +260,8 @@ struct trace { unsigned long nr_events; struct strlist *ev_qualifier; bool not_ev_qualifier; + struct intlist *tid_list; + struct intlist *pid_list; bool sched; bool multiple_threads; double duration_filter; @@ -653,6 +656,18 @@ out_dump: return 0; } +static bool skip_sample(struct trace *trace, struct perf_sample *sample) +{ + if ((trace->pid_list && intlist__find(trace->pid_list, sample->pid)) || + (trace->tid_list && intlist__find(trace->tid_list, sample->tid))) + return false; + + if (trace->pid_list || trace->tid_list) + return true; + + return false; +} + static int trace__process_sample(struct perf_tool *tool, union perf_event *event __maybe_unused, struct perf_sample *sample, @@ -664,6 +679,9 @@ static int trace__process_sample(struct perf_tool *tool, tracepoint_handler handler = evsel->handler.func; + if (skip_sample(trace, sample)) + return 0; + if (trace->base_time == 0) trace->base_time = sample->time; @@ -683,6 +701,27 @@ perf_session__has_tp(struct perf_session *session, const char *name) return evsel != NULL; } +static int parse_target_str(struct trace *trace) +{ + if (trace->opts.target.pid) { + trace->pid_list = intlist__new(trace->opts.target.pid); + if (trace->pid_list == NULL) { + pr_err("Error parsing process id string\n"); + return -EINVAL; + } + } + + if (trace->opts.target.tid) { + trace->tid_list = intlist__new(trace->opts.target.tid); + if (trace->tid_list == NULL) { + pr_err("Error parsing thread id string\n"); + return -EINVAL; + } + } + + return 0; +} + static int trace__run(struct trace *trace, int argc, const char **argv) { struct perf_evlist *evlist = perf_evlist__new(); @@ -869,6 +908,10 @@ static int trace__replay(struct trace *trace) goto out; } + err = parse_target_str(trace); + if (err != 0) + goto out; + setup_pager(); err = perf_session__process_events(session, &trace->tool); ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 0/3] perf trace enhancements @ 2013-08-27 3:52 David Ahern 2013-08-27 3:52 ` [PATCH 1/3] perf evlist: Add tracepoint lookup by name David Ahern 0 siblings, 1 reply; 8+ messages in thread From: David Ahern @ 2013-08-27 3:52 UTC (permalink / raw) To: acme, linux-kernel; +Cc: David Ahern Arnaldo: A couple of enhancements to perf-trace: ability to analyze events from a file and when processing a file limit the analysis to a given set of pid and tids. David Ahern (3): perf evlist: Add tracepoint lookup by name perf trace: Add option to analyze events in a file versus live perf trace: Honor target pid / tid options when analyzing a file tools/perf/Documentation/perf-trace.txt | 4 + tools/perf/builtin-trace.c | 135 ++++++++++++++++++++++++++++++- tools/perf/util/evlist.c | 15 ++++ tools/perf/util/evlist.h | 4 + 4 files changed, 157 insertions(+), 1 deletion(-) -- 1.7.10.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/3] perf evlist: Add tracepoint lookup by name 2013-08-27 3:52 [PATCH 0/3] perf trace enhancements David Ahern @ 2013-08-27 3:52 ` David Ahern 0 siblings, 0 replies; 8+ messages in thread From: David Ahern @ 2013-08-27 3:52 UTC (permalink / raw) To: acme, linux-kernel Cc: David Ahern, Adrian Hunter, Frederic Weisbecker, Mike Galbraith, Paul Mackerras, Peter Zijlstra, Stephane Eranian Will be used by upcoming perf-trace replay option. Signed-off-by: David Ahern <dsahern@gmail.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> --- tools/perf/util/evlist.c | 15 +++++++++++++++ tools/perf/util/evlist.h | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 1f5105a..c0e43ee 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -210,6 +210,21 @@ perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id) return NULL; } +struct perf_evsel * +perf_evlist__find_tracepoint_by_name(struct perf_evlist *evlist, + const char *name) +{ + struct perf_evsel *evsel; + + list_for_each_entry(evsel, &evlist->entries, node) { + if ((evsel->attr.type == PERF_TYPE_TRACEPOINT) && + (strcmp(evsel->name, name) == 0)) + return evsel; + } + + return NULL; +} + int perf_evlist__add_newtp(struct perf_evlist *evlist, const char *sys, const char *name, void *handler) { diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index 327abab..8a509e2 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -71,6 +71,10 @@ int perf_evlist__set_filter(struct perf_evlist *evlist, const char *filter); struct perf_evsel * perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id); +struct perf_evsel * +perf_evlist__find_tracepoint_by_name(struct perf_evlist *evlist, + const char *name); + void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel, int cpu, int thread, u64 id); -- 1.7.10.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2013-08-31 8:16 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-08-29 4:29 [PATCH 0/3] perf trace enhancements - v2 David Ahern 2013-08-29 4:29 ` [PATCH 1/3] perf evlist: Add tracepoint lookup by name David Ahern 2013-08-31 8:15 ` [tip:perf/core] " tip-bot for David Ahern 2013-08-29 4:29 ` [PATCH 2/3] perf trace: Add option to analyze events in a file versus live - v2 David Ahern 2013-08-31 8:15 ` [tip:perf/core] perf trace: Add option to analyze events in a file versus live tip-bot for David Ahern 2013-08-29 4:29 ` [PATCH 3/3] perf trace: Honor target pid / tid options when analyzing a file David Ahern 2013-08-31 8:15 ` [tip:perf/core] " tip-bot for David Ahern -- strict thread matches above, loose matches on Subject: below -- 2013-08-27 3:52 [PATCH 0/3] perf trace enhancements David Ahern 2013-08-27 3:52 ` [PATCH 1/3] perf evlist: Add tracepoint lookup by name David Ahern
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox