public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [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 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
  0 siblings, 0 replies; 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

end of thread, other threads:[~2013-08-29  4:30 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-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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox