* [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
` (2 more replies)
0 siblings, 3 replies; 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
2013-08-27 3:52 ` [PATCH 2/3] perf trace: Add option to analyze events in a file versus live David Ahern
2013-08-27 3:52 ` [PATCH 3/3] perf trace: Honor target pid / tid options when analyzing a file David Ahern
2 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
* [PATCH 2/3] perf trace: Add option to analyze events in a file versus live
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
@ 2013-08-27 3:52 ` David Ahern
2013-08-28 13:02 ` Arnaldo Carvalho de Melo
2013-08-27 3:52 ` [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-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
Allows capture of raw_syscall:* events and analyzed at a later
time.
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 | 92 ++++++++++++++++++++++++++++++-
2 files changed, 95 insertions(+), 1 deletion(-)
diff --git a/tools/perf/Documentation/perf-trace.txt b/tools/perf/Documentation/perf-trace.txt
index fe19811..34c459b 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.
+-r
+--replay
+ 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..a0a1540 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,61 @@ 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;
+
+ 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 +974,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('r', "replay", &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",
@@ -954,7 +1041,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
* [PATCH 3/3] perf trace: Honor target pid / tid options when analyzing a file
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
2013-08-27 3:52 ` [PATCH 2/3] perf trace: Add option to analyze events in a file versus live David Ahern
@ 2013-08-27 3:52 ` David Ahern
2 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
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 a0a1540..ef957a1 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();
@@ -861,6 +900,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
* Re: [PATCH 2/3] perf trace: Add option to analyze events in a file versus live
2013-08-27 3:52 ` [PATCH 2/3] perf trace: Add option to analyze events in a file versus live David Ahern
@ 2013-08-28 13:02 ` Arnaldo Carvalho de Melo
2013-08-28 13:09 ` David Ahern
0 siblings, 1 reply; 8+ messages in thread
From: Arnaldo Carvalho de Melo @ 2013-08-28 13:02 UTC (permalink / raw)
To: David Ahern
Cc: linux-kernel, Adrian Hunter, Frederic Weisbecker, Mike Galbraith,
Paul Mackerras, Peter Zijlstra, Stephane Eranian
Em Mon, Aug 26, 2013 at 09:52:14PM -0600, David Ahern escreveu:
> Allows capture of raw_syscall:* events and analyzed at a later
> time.
>
> +-r
> +--replay
> + Process events from a given perf data file.
Shouldn't this be just -i/--input, like for 'report', 'annotate', etc?
- Arnaldo
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] perf trace: Add option to analyze events in a file versus live
2013-08-28 13:02 ` Arnaldo Carvalho de Melo
@ 2013-08-28 13:09 ` David Ahern
2013-08-28 13:31 ` Arnaldo Carvalho de Melo
0 siblings, 1 reply; 8+ messages in thread
From: David Ahern @ 2013-08-28 13:09 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: linux-kernel, Adrian Hunter, Frederic Weisbecker, Mike Galbraith,
Paul Mackerras, Peter Zijlstra, Stephane Eranian
On 8/28/13 7:02 AM, Arnaldo Carvalho de Melo wrote:
> Em Mon, Aug 26, 2013 at 09:52:14PM -0600, David Ahern escreveu:
>> Allows capture of raw_syscall:* events and analyzed at a later
>> time.
>>
>> +-r
>> +--replay
>> + Process events from a given perf data file.
>
> Shouldn't this be just -i/--input, like for 'report', 'annotate', etc?
>
> - Arnaldo
>
uh, arguably. But -i == inherit per a prior patch. record (-i = inherit)
/ report (-i = input file) collision.
I have used this a bit over the last 2 days and -r is not logical. How
about -f / --file?
David
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] perf trace: Add option to analyze events in a file versus live
2013-08-28 13:09 ` David Ahern
@ 2013-08-28 13:31 ` Arnaldo Carvalho de Melo
0 siblings, 0 replies; 8+ messages in thread
From: Arnaldo Carvalho de Melo @ 2013-08-28 13:31 UTC (permalink / raw)
To: David Ahern
Cc: linux-kernel, Adrian Hunter, Frederic Weisbecker, Mike Galbraith,
Paul Mackerras, Peter Zijlstra, Stephane Eranian
Em Wed, Aug 28, 2013 at 07:09:37AM -0600, David Ahern escreveu:
> On 8/28/13 7:02 AM, Arnaldo Carvalho de Melo wrote:
> >Em Mon, Aug 26, 2013 at 09:52:14PM -0600, David Ahern escreveu:
> >>Allows capture of raw_syscall:* events and analyzed at a later
> >>time.
> >>+-r
> >>+--replay
> >>+ Process events from a given perf data file.
> >Shouldn't this be just -i/--input, like for 'report', 'annotate', etc?
> uh, arguably. But -i == inherit per a prior patch. record (-i =
> inherit) / report (-i = input file) collision.
Perhaps --inherit is seldom used and can stay just as --inherit so that
we can use -i/--input to keep it consistent with report/annotate/etc?
- Arnaldo
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 0/3] perf trace enhancements
@ 2013-10-09 3:26 David Ahern
0 siblings, 0 replies; 8+ messages in thread
From: David Ahern @ 2013-10-09 3:26 UTC (permalink / raw)
To: acme, linux-kernel; +Cc: David Ahern
Hi Arnaldo:
Revision to intlist per your comment with the summary option
updated per your perf/core branch.
The mmap output file has survived local testing without problems
so please consider it for inclusion as well. It lowers the overhead
of perf-record.
David Ahern (3):
perf util: Add findnew method to intlist - v2
perf trace: Add summary option to dump syscall statistics
perf record: mmap output file
tools/perf/Documentation/perf-trace.txt | 4 ++
tools/perf/builtin-record.c | 87 ++++++++++++++++++++++++
tools/perf/builtin-trace.c | 110 +++++++++++++++++++++++++++----
tools/perf/util/intlist.c | 22 +++++--
tools/perf/util/intlist.h | 1 +
tools/perf/util/rblist.c | 27 +++++++-
tools/perf/util/rblist.h | 1 +
7 files changed, 233 insertions(+), 19 deletions(-)
--
1.7.10.1
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2013-10-09 3:27 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
2013-08-27 3:52 ` [PATCH 2/3] perf trace: Add option to analyze events in a file versus live David Ahern
2013-08-28 13:02 ` Arnaldo Carvalho de Melo
2013-08-28 13:09 ` David Ahern
2013-08-28 13:31 ` Arnaldo Carvalho de Melo
2013-08-27 3:52 ` [PATCH 3/3] perf trace: Honor target pid / tid options when analyzing a file David Ahern
-- strict thread matches above, loose matches on Subject: below --
2013-10-09 3:26 [PATCH 0/3] perf trace enhancements David Ahern
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.