Currently, a perf session entails two steps: first 'perf record' or 'perf trace record' records the perf data to disk, then 'perf report' or 'perf trace report' reads the saved data from disk and reports the results. This experimental patchset makes some changes to perf that instead allow the perf data to be piped directly from the record step to the report step, without ever touching the disk. This is especially useful for 'perf trace' - adding this capability means that the trace scripts are no longer relegated to simple post-processing, but can be run in a continuous 'live mode', forever processing the event stream and e.g. periodically dumping current results, essentially becoming special-purpose 'top' applications, or continuously scanning the event stream for arbitrarily complex conditions to flag, etc... Being able to feed the event stream over a pipe also makes it possible to do things like trace over the network using e.g. netcat. It turns out that perf is pretty close to being able to do this already, with the exception of the header data; most of the work of this patchset deals with changing that. It does so in a mainly additive way: it doesn't make any changes to the existing disk format or normal disk-mode processing, just adds special treatment for the cases when 'perf [trace] record' records to stdout or 'perf [trace] report reads from stdin. v2 changes: - any script in the 'perf trace -l' list can now be run in 'live mode' automatically by simply specifying the script name [with options] e.g. $ perf trace syscall-counts will run both ends of the the syscall-counts script with a pipe in between, a more usable shorthand for: $ perf trace record syscall-counts -o - | perf trace report syscall-counts -i - which itself is shorthand for: perf record -c 1 -f -a -M -R -e raw_syscalls:sys_enter -o - | perf trace -i - -s ~/libexec/perf-core/scripts/python/syscall-counts.py - adds and use a term_clear() function for the 'top' ...
Adds special treatment for stdout - if the user specifies '-o -' to
perf record, the intent is that the event stream be written to stdout
rather than to a disk file.
Also, redirect stdout of forked child to stderr - in pipe mode, stdout
of the forked child interferes with the stdout perf stream, so
redirect it to stderr where it can still be seen but won't be mixed in
with the perf output.
Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
---
tools/perf/builtin-record.c | 18 +++++++++++++++---
1 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 2654b61..0723fa1 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -36,6 +36,7 @@ static unsigned int page_size;
static unsigned int mmap_pages = 128;
static int freq = 1000;
static int output;
+static int pipe_output = 0;
static const char *output_name = "perf.data";
static int group = 0;
static unsigned int realtime_prio = 0;
@@ -450,7 +451,9 @@ static int __cmd_record(int argc, const char **argv)
exit(-1);
}
- if (!stat(output_name, &st) && st.st_size) {
+ if (!strcmp(output_name, "-"))
+ pipe_output = 1;
+ else if (!stat(output_name, &st) && st.st_size) {
if (!force) {
if (!append_file) {
pr_err("Error, output file %s exists, use -A "
@@ -475,7 +478,10 @@ static int __cmd_record(int argc, const char **argv)
else
flags |= O_TRUNC;
- output = open(output_name, flags, S_IRUSR|S_IWUSR);
+ if (pipe_output)
+ output = STDOUT_FILENO;
+ else
+ output = open(output_name, flags, S_IRUSR | S_IWUSR);
if (output < 0) {
perror("failed to create output file");
exit(-1);
@@ -514,6 +520,8 @@ static int __cmd_record(int argc, const char **argv)
}
if (!child_pid) {
+ if (pipe_output)
+ dup2(2, 1);
close(child_ready_pipe[0]);
close(go_pipe[1]);
fcntl(go_pipe[0], F_SETFD, FD_CLOEXEC);
@@ -565,7 +573,11 @@ ...Commit-ID: 529870e37473a9fc609078f03cc5b4148cf06a87 Gitweb: http://git.kernel.org/tip/529870e37473a9fc609078f03cc5b4148cf06a87 Author: Tom Zanussi <tzanussi@gmail.com> AuthorDate: Thu, 1 Apr 2010 23:59:16 -0500 Committer: Ingo Molnar <mingo@elte.hu> CommitDate: Wed, 14 Apr 2010 11:56:06 +0200 perf record: Introduce special handling for pipe output Adds special treatment for stdout - if the user specifies '-o -' to perf record, the intent is that the event stream be written to stdout rather than to a disk file. Also, redirect stdout of forked child to stderr - in pipe mode, stdout of the forked child interferes with the stdout perf stream, so redirect it to stderr where it can still be seen but won't be mixed in with the perf output. Signed-off-by: Tom Zanussi <tzanussi@gmail.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: fweisbec@gmail.com Cc: rostedt@goodmis.org Cc: k-keiichi@bx.jp.nec.com Cc: acme@ghostprotocols.net LKML-Reference: <1270184365-8281-3-git-send-email-tzanussi@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> --- tools/perf/builtin-record.c | 18 +++++++++++++++--- 1 files changed, 15 insertions(+), 3 deletions(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index d060fc5..d4464f7 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -35,6 +35,7 @@ static unsigned int page_size; static unsigned int mmap_pages = 128; static int freq = 1000; static int output; +static int pipe_output = 0; static const char *output_name = "perf.data"; static int group = 0; static unsigned int realtime_prio = 0; @@ -449,7 +450,9 @@ static int __cmd_record(int argc, const char **argv) exit(-1); } - if (!stat(output_name, &st) && st.st_size) { + if (!strcmp(output_name, "-")) + pipe_output = 1; + else if (!stat(output_name, &st) && st.st_size) { if (!force) { if (!append_file) { pr_err("Error, output file %s ...
Bypasses the build_id perf header code and replaces it with a
synthesized event and processing function that accomplishes the same
thing, used when reading/writing perf data to/from a pipe.
Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
---
tools/perf/builtin-record.c | 15 ++++++-
tools/perf/builtin-report.c | 1 +
tools/perf/builtin-trace.c | 1 +
tools/perf/util/event.h | 2 +
tools/perf/util/header.c | 90 +++++++++++++++++++++++++++++++++++++++++++
tools/perf/util/header.h | 7 +++
tools/perf/util/session.c | 6 +++
tools/perf/util/session.h | 3 +-
8 files changed, 121 insertions(+), 4 deletions(-)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 0c6a971..9a5be5d 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -427,10 +427,19 @@ static int process_buildids(void)
static void atexit_header(void)
{
- session->header.data_size += bytes_written;
+ if (!pipe_output) {
+ session->header.data_size += bytes_written;
- process_buildids();
- perf_header__write(&session->header, output, true);
+ process_buildids();
+ perf_header__write(&session->header, output, true);
+ } else {
+ int err;
+
+ err = event__synthesize_build_ids(process_synthesized_event,
+ session);
+ if (err < 0)
+ pr_err("Couldn't synthesize build ids.\n");
+ }
}
static int __cmd_record(int argc, const char **argv)
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 48a02a1..8f71ee7 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -268,6 +268,7 @@ static struct perf_event_ops event_ops = {
.attr = event__process_attr,
.event_type = event__process_event_type,
.tracing_data = event__process_tracing_data,
+ .build_id = event__process_build_id,
};
extern volatile int session_done;
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 1863d7c..4a6ffb2 100644
--- ...Humm, getting everything as events looks elegant, but for the buildid case... when processing samples we need to _first_ have the build-ids, hence they are in the header. We only generate them after collecting all samples because it would disturb the system if we look at them in the ELF files when we get PERF_RECORD_MMAP events. In live mode we will be resolving symbols as we get samples, so I fail to see how synthesizing the build-ids as a last step will help. With build-ids events we can at least generate it in advance for the kernel and modules, as it is a restriced number of DSOs and we have them easily accessible via /sys, but for the userspace bits... - Arnaldo --
Commit-ID: c7929e4727e8ff2d6fc8327188820e3b1c2f1dc3 Gitweb: http://git.kernel.org/tip/c7929e4727e8ff2d6fc8327188820e3b1c2f1dc3 Author: Tom Zanussi <tzanussi@gmail.com> AuthorDate: Thu, 1 Apr 2010 23:59:22 -0500 Committer: Ingo Molnar <mingo@elte.hu> CommitDate: Wed, 14 Apr 2010 11:56:08 +0200 perf: Convert perf header build_ids into build_id events Bypasses the build_id perf header code and replaces it with a synthesized event and processing function that accomplishes the same thing, used when reading/writing perf data to/from a pipe. Signed-off-by: Tom Zanussi <tzanussi@gmail.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: fweisbec@gmail.com Cc: rostedt@goodmis.org Cc: k-keiichi@bx.jp.nec.com Cc: acme@ghostprotocols.net LKML-Reference: <1270184365-8281-9-git-send-email-tzanussi@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> --- tools/perf/builtin-record.c | 15 ++++++- tools/perf/builtin-report.c | 1 + tools/perf/builtin-trace.c | 1 + tools/perf/util/event.h | 2 + tools/perf/util/header.c | 90 +++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/header.h | 7 +++ tools/perf/util/session.c | 6 +++ tools/perf/util/session.h | 3 +- 8 files changed, 121 insertions(+), 4 deletions(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 3775abe..0bde31b 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -426,10 +426,19 @@ static int process_buildids(void) static void atexit_header(void) { - session->header.data_size += bytes_written; + if (!pipe_output) { + session->header.data_size += bytes_written; - process_buildids(); - perf_header__write(&session->header, output, true); + process_buildids(); + perf_header__write(&session->header, output, true); + } else { + int err; + + err = event__synthesize_build_ids(process_synthesized_event, + session); + if (err < 0) + pr_err("Couldn't synthesize build ...
Bypasses the attr perf header code and replaces it with a synthesized
event and processing function that accomplishes the same thing, used
when reading/writing perf data to/from a pipe.
Making the attrs into events allows them to be streamed over a pipe
along with the rest of the header data (in later patches). It also
paves the way to allowing events to be added and removed from perf
sessions dynamically.
Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
---
tools/perf/builtin-record.c | 10 +++++
tools/perf/builtin-report.c | 1 +
tools/perf/builtin-trace.c | 1 +
tools/perf/util/event.h | 10 +++++-
tools/perf/util/header.c | 79 +++++++++++++++++++++++++++++++++++++++++++
tools/perf/util/header.h | 8 ++++
tools/perf/util/session.c | 26 ++++++++++++++
tools/perf/util/session.h | 3 +-
8 files changed, 136 insertions(+), 2 deletions(-)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 0723fa1..1f0abe2 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -585,6 +585,16 @@ static int __cmd_record(int argc, const char **argv)
post_processing_offset = lseek(output, 0, SEEK_CUR);
+ if (pipe_output) {
+ err = event__synthesize_attrs(&session->header,
+ process_synthesized_event,
+ session);
+ if (err < 0) {
+ pr_err("Couldn't synthesize attrs.\n");
+ return err;
+ }
+ }
+
err = event__synthesize_kernel_mmap(process_synthesized_event,
session, "_text");
if (err < 0) {
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index a104121..0bb5d85 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -265,6 +265,7 @@ static struct perf_event_ops event_ops = {
.fork = event__process_task,
.lost = event__process_lost,
.read = process_read_event,
+ .attr = event__process_attr,
};
extern volatile int session_done;
diff --git a/tools/perf/builtin-trace.c ...Commit-ID: 2c46dbb517a10b18d459e6ceffefde5bfb290cf6 Gitweb: http://git.kernel.org/tip/2c46dbb517a10b18d459e6ceffefde5bfb290cf6 Author: Tom Zanussi <tzanussi@gmail.com> AuthorDate: Thu, 1 Apr 2010 23:59:19 -0500 Committer: Ingo Molnar <mingo@elte.hu> CommitDate: Wed, 14 Apr 2010 11:56:07 +0200 perf: Convert perf header attrs into attr events Bypasses the attr perf header code and replaces it with a synthesized event and processing function that accomplishes the same thing, used when reading/writing perf data to/from a pipe. Making the attrs into events allows them to be streamed over a pipe along with the rest of the header data (in later patches). It also paves the way to allowing events to be added and removed from perf sessions dynamically. Signed-off-by: Tom Zanussi <tzanussi@gmail.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: fweisbec@gmail.com Cc: rostedt@goodmis.org Cc: k-keiichi@bx.jp.nec.com Cc: acme@ghostprotocols.net LKML-Reference: <1270184365-8281-6-git-send-email-tzanussi@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> --- tools/perf/builtin-record.c | 10 +++++ tools/perf/builtin-report.c | 1 + tools/perf/builtin-trace.c | 1 + tools/perf/util/event.h | 10 +++++- tools/perf/util/header.c | 79 +++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/header.h | 8 ++++ tools/perf/util/session.c | 26 ++++++++++++++ tools/perf/util/session.h | 3 +- 8 files changed, 136 insertions(+), 2 deletions(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index d4464f7..289d9cf 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -584,6 +584,16 @@ static int __cmd_record(int argc, const char **argv) post_processing_offset = lseek(output, 0, SEEK_CUR); + if (pipe_output) { + err = event__synthesize_attrs(&session->header, + process_synthesized_event, + session); + if (err < 0) { + pr_err("Couldn't synthesize ...
It should be possible to run any perf trace script in 'live mode'. This requires being able to pass in e.g. '-i -' or other args, which the current shell scripts aren't equipped to handle. In a few cases, there are required or optional args that also need special handling. This patch makes changes the current set of shell scripts as necessary. Signed-off-by: Tom Zanussi <tzanussi@gmail.com> --- tools/perf/scripts/perl/bin/failed-syscalls-record | 2 +- tools/perf/scripts/perl/bin/failed-syscalls-report | 8 +++++++- tools/perf/scripts/perl/bin/rw-by-file-record | 3 ++- tools/perf/scripts/perl/bin/rw-by-file-report | 8 +++++++- tools/perf/scripts/perl/bin/rw-by-pid-record | 2 +- tools/perf/scripts/perl/bin/rw-by-pid-report | 2 +- tools/perf/scripts/perl/bin/wakeup-latency-record | 2 +- tools/perf/scripts/perl/bin/wakeup-latency-report | 2 +- tools/perf/scripts/perl/bin/workqueue-stats-record | 2 +- tools/perf/scripts/perl/bin/workqueue-stats-report | 2 +- .../python/bin/failed-syscalls-by-pid-record | 2 +- .../python/bin/failed-syscalls-by-pid-report | 8 +++++++- .../python/bin/syscall-counts-by-pid-record | 2 +- .../python/bin/syscall-counts-by-pid-report | 8 +++++++- .../perf/scripts/python/bin/syscall-counts-record | 2 +- .../perf/scripts/python/bin/syscall-counts-report | 8 +++++++- 16 files changed, 47 insertions(+), 16 deletions(-) diff --git a/tools/perf/scripts/perl/bin/failed-syscalls-record b/tools/perf/scripts/perl/bin/failed-syscalls-record index f8885d3..6ad9b8f 100644 --- a/tools/perf/scripts/perl/bin/failed-syscalls-record +++ b/tools/perf/scripts/perl/bin/failed-syscalls-record @@ -1,2 +1,2 @@ #!/bin/bash -perf record -c 1 -f -a -M -R -e raw_syscalls:sys_exit +perf record -c 1 -f -a -M -R -e raw_syscalls:sys_exit $@ diff --git a/tools/perf/scripts/perl/bin/failed-syscalls-report b/tools/perf/scripts/perl/bin/failed-syscalls-report index ...
Commit-ID: 00b21a01935892a2b97613f10300434998f45093 Gitweb: http://git.kernel.org/tip/00b21a01935892a2b97613f10300434998f45093 Author: Tom Zanussi <tzanussi@gmail.com> AuthorDate: Thu, 1 Apr 2010 23:59:24 -0500 Committer: Ingo Molnar <mingo@elte.hu> CommitDate: Wed, 14 Apr 2010 11:56:08 +0200 perf trace/scripting: Enable scripting shell scripts for live mode It should be possible to run any perf trace script in 'live mode'. This requires being able to pass in e.g. '-i -' or other args, which the current shell scripts aren't equipped to handle. In a few cases, there are required or optional args that also need special handling. This patch makes changes the current set of shell scripts as necessary. Signed-off-by: Tom Zanussi <tzanussi@gmail.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: fweisbec@gmail.com Cc: rostedt@goodmis.org Cc: k-keiichi@bx.jp.nec.com Cc: acme@ghostprotocols.net LKML-Reference: <1270184365-8281-11-git-send-email-tzanussi@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> --- tools/perf/scripts/perl/bin/failed-syscalls-record | 2 +- tools/perf/scripts/perl/bin/failed-syscalls-report | 8 +++++++- tools/perf/scripts/perl/bin/rw-by-file-record | 3 ++- tools/perf/scripts/perl/bin/rw-by-file-report | 8 +++++++- tools/perf/scripts/perl/bin/rw-by-pid-record | 2 +- tools/perf/scripts/perl/bin/rw-by-pid-report | 2 +- tools/perf/scripts/perl/bin/wakeup-latency-record | 2 +- tools/perf/scripts/perl/bin/wakeup-latency-report | 2 +- tools/perf/scripts/perl/bin/workqueue-stats-record | 2 +- tools/perf/scripts/perl/bin/workqueue-stats-report | 2 +- .../python/bin/failed-syscalls-by-pid-record | 2 +- .../python/bin/failed-syscalls-by-pid-report | 8 +++++++- .../python/bin/syscall-counts-by-pid-record | 2 +- .../python/bin/syscall-counts-by-pid-report | 8 +++++++- .../perf/scripts/python/bin/syscall-counts-record | 2 +- ...
Currently, live mode is invoked by explicitly invoking the record and
report sides and connecting them with a pipe e.g.
$ perf trace record rwtop -o - | perf trace report rwtop 5 -i -
In terms of usability, it's not that bad, but it does require the user
to type and remember more than necessary.
This patch allows the user to accomplish the same thing without
specifying the separate record/report steps or the pipe. So the same
command as above can be accomplished more simply as:
$ perf trace rwtop 5
Notice that the '-i -' and '-o -' aren't required in this case -
they're added internally, and that any extra arguments are passed
along to the report script (but not to the record script).
The overall effect is that any of the scripts listed in 'perf trace
-l' can now be used directly in live mode, with the expected
arguments, by simply specifying the script and args to 'perf trace'.
Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
---
tools/perf/builtin-trace.c | 59 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 59 insertions(+), 0 deletions(-)
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 4a6ffb2..1e6ad0c 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -561,6 +561,65 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used)
suffix = REPORT_SUFFIX;
}
+ if (!suffix && argc >= 2 && strncmp(argv[1], "-", strlen("-")) != 0) {
+ char *record_script_path, *report_script_path;
+ int live_pipe[2];
+ pid_t pid;
+
+ record_script_path = get_script_path(argv[1], RECORD_SUFFIX);
+ if (!record_script_path) {
+ fprintf(stderr, "record script not found\n");
+ return -1;
+ }
+
+ report_script_path = get_script_path(argv[1], REPORT_SUFFIX);
+ if (!report_script_path) {
+ fprintf(stderr, "report script not found\n");
+ return -1;
+ }
+
+ if (pipe(live_pipe) < 0) {
+ perror("failed to create pipe");
+ exit(-1);
+ }
+
+ pid = fork();
+ if (pid < ...Commit-ID: a0cccc2e8e9fb16cbed3a117b30e3fbac3092ee3 Gitweb: http://git.kernel.org/tip/a0cccc2e8e9fb16cbed3a117b30e3fbac3092ee3 Author: Tom Zanussi <tzanussi@gmail.com> AuthorDate: Thu, 1 Apr 2010 23:59:25 -0500 Committer: Ingo Molnar <mingo@elte.hu> CommitDate: Wed, 14 Apr 2010 11:56:09 +0200 perf trace: Invoke live mode automatically if record/report not specified Currently, live mode is invoked by explicitly invoking the record and report sides and connecting them with a pipe e.g. $ perf trace record rwtop -o - | perf trace report rwtop 5 -i - In terms of usability, it's not that bad, but it does require the user to type and remember more than necessary. This patch allows the user to accomplish the same thing without specifying the separate record/report steps or the pipe. So the same command as above can be accomplished more simply as: $ perf trace rwtop 5 Notice that the '-i -' and '-o -' aren't required in this case - they're added internally, and that any extra arguments are passed along to the report script (but not to the record script). The overall effect is that any of the scripts listed in 'perf trace -l' can now be used directly in live mode, with the expected arguments, by simply specifying the script and args to 'perf trace'. Signed-off-by: Tom Zanussi <tzanussi@gmail.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: fweisbec@gmail.com Cc: rostedt@goodmis.org Cc: k-keiichi@bx.jp.nec.com Cc: acme@ghostprotocols.net LKML-Reference: <1270184365-8281-12-git-send-email-tzanussi@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> --- tools/perf/builtin-trace.c | 59 ++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 59 insertions(+), 0 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 1ee1e30..2eefb33 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -561,6 +561,65 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) ...
Bypasses the tracing_data perf header code and replaces it with a
synthesized event and processing function that accomplishes the same
thing, used when reading/writing perf data to/from a pipe.
The tracing data is pretty large, and this patch doesn't attempt to
break it down into component events. The tracing_data event itself
doesn't actually contain the tracing data, rather it arranges for the
event processing code to skip over it after it's read, using the skip
return value added to the event processing loop in a previous patch.
Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
---
tools/perf/builtin-record.c | 16 ++++++
tools/perf/builtin-report.c | 1 +
tools/perf/builtin-trace.c | 1 +
tools/perf/util/event.h | 7 +++
tools/perf/util/header.c | 52 +++++++++++++++++++++
tools/perf/util/header.h | 6 ++
tools/perf/util/session.c | 13 +++++
tools/perf/util/session.h | 3 +-
tools/perf/util/trace-event-info.c | 24 ++++++++++
tools/perf/util/trace-event-read.c | 89 ++++++++++++++++++------------------
tools/perf/util/trace-event.h | 4 +-
11 files changed, 170 insertions(+), 46 deletions(-)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index c1682d1..0c6a971 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -105,6 +105,11 @@ static void mmap_write_tail(struct mmap_data *md, unsigned long tail)
pc->data_tail = tail;
}
+static void advance_output(size_t size)
+{
+ bytes_written += size;
+}
+
static void write_output(void *buf, size_t size)
{
while (size) {
@@ -600,6 +605,17 @@ static int __cmd_record(int argc, const char **argv)
pr_err("Couldn't synthesize event_types.\n");
return err;
}
+
+ err = event__synthesize_tracing_data(output, attrs,
+ nr_counters,
+ process_synthesized_event,
+ session);
+ if (err <= 0) {
+ pr_err("Couldn't record ...Commit-ID: 9215545e99d8c0b27323df2de504f4294bf5e407 Gitweb: http://git.kernel.org/tip/9215545e99d8c0b27323df2de504f4294bf5e407 Author: Tom Zanussi <tzanussi@gmail.com> AuthorDate: Thu, 1 Apr 2010 23:59:21 -0500 Committer: Ingo Molnar <mingo@elte.hu> CommitDate: Wed, 14 Apr 2010 11:56:07 +0200 perf: Convert perf tracing data into a tracing_data event Bypasses the tracing_data perf header code and replaces it with a synthesized event and processing function that accomplishes the same thing, used when reading/writing perf data to/from a pipe. The tracing data is pretty large, and this patch doesn't attempt to break it down into component events. The tracing_data event itself doesn't actually contain the tracing data, rather it arranges for the event processing code to skip over it after it's read, using the skip return value added to the event processing loop in a previous patch. Signed-off-by: Tom Zanussi <tzanussi@gmail.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: fweisbec@gmail.com Cc: rostedt@goodmis.org Cc: k-keiichi@bx.jp.nec.com Cc: acme@ghostprotocols.net LKML-Reference: <1270184365-8281-8-git-send-email-tzanussi@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> --- tools/perf/builtin-record.c | 16 ++++++ tools/perf/builtin-report.c | 1 + tools/perf/builtin-trace.c | 1 + tools/perf/util/event.h | 7 +++ tools/perf/util/header.c | 52 +++++++++++++++++++++ tools/perf/util/header.h | 6 ++ tools/perf/util/session.c | 13 +++++ tools/perf/util/session.h | 3 +- tools/perf/util/trace-event-info.c | 24 ++++++++++ tools/perf/util/trace-event-read.c | 89 ++++++++++++++++++------------------ tools/perf/util/trace-event.h | 4 +- 11 files changed, 170 insertions(+), 46 deletions(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index c4c1322..3775abe 100644 --- a/tools/perf/builtin-record.c +++ ...
Adds special treatment for stdin - if the user specifies '-i -' to
perf trace, the intent is that the event stream be read from stdin
rather than from a disk file.
The actual handling of the '-' filename is done by the session; this
just adds a signal handler to stop reporting, and turns off
interference by the pager.
Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
---
tools/perf/builtin-trace.c | 12 +++++++++++-
1 files changed, 11 insertions(+), 1 deletions(-)
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 407041d..718fddd 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -106,8 +106,17 @@ static struct perf_event_ops event_ops = {
.comm = event__process_comm,
};
+extern volatile int session_done;
+
+static void sig_handler(int sig __unused)
+{
+ session_done = 1;
+}
+
static int __cmd_trace(struct perf_session *session)
{
+ signal(SIGINT, sig_handler);
+
return perf_session__process_events(session, &event_ops);
}
@@ -580,7 +589,8 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used)
if (session == NULL)
return -ENOMEM;
- if (!perf_session__has_traces(session, "record -R"))
+ if (strcmp(input_name, "-") &&
+ !perf_session__has_traces(session, "record -R"))
return -EINVAL;
if (generate_script_lang) {
--
1.6.4.GIT
--
Commit-ID: c239da3b4b55dbb8f30bcb8d1a0d63fc44a567c3 Gitweb: http://git.kernel.org/tip/c239da3b4b55dbb8f30bcb8d1a0d63fc44a567c3 Author: Tom Zanussi <tzanussi@gmail.com> AuthorDate: Thu, 1 Apr 2010 23:59:18 -0500 Committer: Ingo Molnar <mingo@elte.hu> CommitDate: Wed, 14 Apr 2010 11:56:06 +0200 perf trace: Introduce special handling for pipe input Adds special treatment for stdin - if the user specifies '-i -' to perf trace, the intent is that the event stream be read from stdin rather than from a disk file. The actual handling of the '-' filename is done by the session; this just adds a signal handler to stop reporting, and turns off interference by the pager. Signed-off-by: Tom Zanussi <tzanussi@gmail.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: fweisbec@gmail.com Cc: rostedt@goodmis.org Cc: k-keiichi@bx.jp.nec.com Cc: acme@ghostprotocols.net LKML-Reference: <1270184365-8281-5-git-send-email-tzanussi@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> --- tools/perf/builtin-trace.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 8fc50d8..c681e85 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -106,8 +106,17 @@ static struct perf_event_ops event_ops = { .comm = event__process_comm, }; +extern volatile int session_done; + +static void sig_handler(int sig __unused) +{ + session_done = 1; +} + static int __cmd_trace(struct perf_session *session) { + signal(SIGINT, sig_handler); + return perf_session__process_events(session, &event_ops); } @@ -580,7 +589,8 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) if (session == NULL) return -ENOMEM; - if (!perf_session__has_traces(session, "record -R")) + if (strcmp(input_name, "-") && + !perf_session__has_traces(session, "record -R")) return -EINVAL; if (generate_script_lang) { --
A couple of scripts, one in Python and the other in Perl, that demonstrate 'live mode' tracing. For each, the output of the perf event stream is fed continuously to the script, which continuously aggregates the data and reports the current results every 3 seconds, or at the optionally specified interval. After the current results are displayed, the aggregations are cleared and the cycle begins anew. To run the scripts, simply pipe the output of the 'perf trace record' step as input to the corresponding 'perf trace report' step, using '-' as the filename to -o and -i: $ perf trace record sctop -o - | perf trace report sctop -i - Also adds clear_term() utility functions to the Util.pm and Util.py utility modules, for use by any script to clear the screen. Signed-off-by: Tom Zanussi <tzanussi@gmail.com> --- .../perl/Perf-Trace-Util/lib/Perf/Trace/Util.pm | 6 + tools/perf/scripts/perl/bin/rwtop-record | 2 + tools/perf/scripts/perl/bin/rwtop-report | 23 +++ tools/perf/scripts/perl/rwtop.pl | 177 ++++++++++++++++++++ .../python/Perf-Trace-Util/lib/Perf/Trace/Util.py | 3 + tools/perf/scripts/python/bin/sctop-record | 2 + tools/perf/scripts/python/bin/sctop-report | 24 +++ tools/perf/scripts/python/sctop.py | 78 +++++++++ 8 files changed, 315 insertions(+), 0 deletions(-) create mode 100644 tools/perf/scripts/perl/bin/rwtop-record create mode 100644 tools/perf/scripts/perl/bin/rwtop-report create mode 100644 tools/perf/scripts/perl/rwtop.pl create mode 100644 tools/perf/scripts/python/bin/sctop-record create mode 100644 tools/perf/scripts/python/bin/sctop-report create mode 100644 tools/perf/scripts/python/sctop.py diff --git a/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Util.pm b/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Util.pm index f869c48..d94b40c 100644 --- a/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Util.pm +++ ...
Commit-ID: 47902f3611b392209e2a412bf7ec02dca95e666d Gitweb: http://git.kernel.org/tip/47902f3611b392209e2a412bf7ec02dca95e666d Author: Tom Zanussi <tzanussi@gmail.com> AuthorDate: Thu, 1 Apr 2010 23:59:23 -0500 Committer: Ingo Molnar <mingo@elte.hu> CommitDate: Wed, 14 Apr 2010 11:56:08 +0200 perf trace/scripting: Add rwtop and sctop scripts A couple of scripts, one in Python and the other in Perl, that demonstrate 'live mode' tracing. For each, the output of the perf event stream is fed continuously to the script, which continuously aggregates the data and reports the current results every 3 seconds, or at the optionally specified interval. After the current results are displayed, the aggregations are cleared and the cycle begins anew. To run the scripts, simply pipe the output of the 'perf trace record' step as input to the corresponding 'perf trace report' step, using '-' as the filename to -o and -i: $ perf trace record sctop -o - | perf trace report sctop -i - Also adds clear_term() utility functions to the Util.pm and Util.py utility modules, for use by any script to clear the screen. Signed-off-by: Tom Zanussi <tzanussi@gmail.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: fweisbec@gmail.com Cc: rostedt@goodmis.org Cc: k-keiichi@bx.jp.nec.com Cc: acme@ghostprotocols.net LKML-Reference: <1270184365-8281-10-git-send-email-tzanussi@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> --- .../perl/Perf-Trace-Util/lib/Perf/Trace/Util.pm | 6 + tools/perf/scripts/perl/bin/rwtop-record | 2 + tools/perf/scripts/perl/bin/rwtop-report | 23 +++ tools/perf/scripts/perl/rwtop.pl | 177 ++++++++++++++++++++ .../python/Perf-Trace-Util/lib/Perf/Trace/Util.py | 3 + tools/perf/scripts/python/bin/sctop-record | 2 + tools/perf/scripts/python/bin/sctop-report | 24 +++ tools/perf/scripts/python/sctop.py | 78 +++++++++ 8 files changed, 315 insertions(+), 0 ...
This patch makes several changes to allow the perf event stream to be
sent and received over a pipe:
- adds pipe-specific versions of the header read/write code
- adds pipe-specific version of the event processing code
- adds a range of event types to be used for header or other pseudo
events, above the range used by the kernel
- checks the return value of event handlers, which they can use to
skip over large events during event processing rather than actually
reading them into event objects.
- unifies the multiple do_read() functions and updates its users.
Note that none of these changes affect the existing perf data file
format or processing - this code only comes into play if perf output
is sent to stdout (or is read from stdin).
Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
---
tools/perf/builtin-record.c | 2 +-
tools/perf/util/event.h | 4 +
tools/perf/util/header.c | 78 +++++++++++++++++++------
tools/perf/util/header.h | 8 ++-
tools/perf/util/session.c | 135 ++++++++++++++++++++++++++++++++++++++++---
tools/perf/util/session.h | 4 +
6 files changed, 202 insertions(+), 29 deletions(-)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 60ecdd3..2654b61 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -488,7 +488,7 @@ static int __cmd_record(int argc, const char **argv)
}
if (!file_new) {
- err = perf_header__read(&session->header, output);
+ err = perf_header__read(session, output);
if (err < 0)
return err;
}
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index a33b949..03cdfd9 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -83,6 +83,10 @@ struct build_id_event {
char filename[];
};
+enum perf_header_event_type { /* above any possible kernel type */
+ PERF_RECORD_HEADER_MAX = 64,
+};
+
typedef union event_union {
struct perf_event_header header;
struct ip_event ip;
diff ...Commit-ID: 8dc58101f2c838355d44402aa77646649d10dbec Gitweb: http://git.kernel.org/tip/8dc58101f2c838355d44402aa77646649d10dbec Author: Tom Zanussi <tzanussi@gmail.com> AuthorDate: Thu, 1 Apr 2010 23:59:15 -0500 Committer: Ingo Molnar <mingo@elte.hu> CommitDate: Wed, 14 Apr 2010 11:56:05 +0200 perf: Add pipe-specific header read/write and event processing code This patch makes several changes to allow the perf event stream to be sent and received over a pipe: - adds pipe-specific versions of the header read/write code - adds pipe-specific version of the event processing code - adds a range of event types to be used for header or other pseudo events, above the range used by the kernel - checks the return value of event handlers, which they can use to skip over large events during event processing rather than actually reading them into event objects. - unifies the multiple do_read() functions and updates its users. Note that none of these changes affect the existing perf data file format or processing - this code only comes into play if perf output is sent to stdout (or is read from stdin). Signed-off-by: Tom Zanussi <tzanussi@gmail.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: fweisbec@gmail.com Cc: rostedt@goodmis.org Cc: k-keiichi@bx.jp.nec.com Cc: acme@ghostprotocols.net LKML-Reference: <1270184365-8281-2-git-send-email-tzanussi@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> --- tools/perf/builtin-record.c | 2 +- tools/perf/util/event.h | 4 + tools/perf/util/header.c | 78 +++++++++++++++++++------ tools/perf/util/header.h | 8 ++- tools/perf/util/session.c | 135 ++++++++++++++++++++++++++++++++++++++++--- tools/perf/util/session.h | 4 + 6 files changed, 202 insertions(+), 29 deletions(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 9a95136..d060fc5 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -487,7 +487,7 @@ static ...
Adds special treatment for stdin - if the user specifies '-i -' to
perf report, the intent is that the event stream be written to stdin
rather than from a disk file.
The actual handling of the '-' filename is done by the session; this
just adds a signal handler to stop reporting, and turns off
interference by the pager.
Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
---
tools/perf/builtin-report.c | 12 +++++++++++-
1 files changed, 11 insertions(+), 1 deletions(-)
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 6ab1698..a104121 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -267,6 +267,13 @@ static struct perf_event_ops event_ops = {
.read = process_read_event,
};
+extern volatile int session_done;
+
+static void sig_handler(int sig __attribute__((__unused__)))
+{
+ session_done = 1;
+}
+
static int __cmd_report(void)
{
int ret = -EINVAL;
@@ -274,6 +281,8 @@ static int __cmd_report(void)
struct rb_node *next;
const char *help = "For a higher level overview, try: perf report --sort comm,dso";
+ signal(SIGINT, sig_handler);
+
session = perf_session__new(input_name, O_RDONLY, force);
if (session == NULL)
return -ENOMEM;
@@ -461,7 +470,8 @@ int cmd_report(int argc, const char **argv, const char *prefix __used)
{
argc = parse_options(argc, argv, options, report_usage, 0);
- setup_browser();
+ if (strcmp(input_name, "-") != 0)
+ setup_browser();
if (symbol__init() < 0)
return -1;
--
1.6.4.GIT
--
Commit-ID: 46656ac7fb3252f8a3db29b18638e0e8067849ba Gitweb: http://git.kernel.org/tip/46656ac7fb3252f8a3db29b18638e0e8067849ba Author: Tom Zanussi <tzanussi@gmail.com> AuthorDate: Thu, 1 Apr 2010 23:59:17 -0500 Committer: Ingo Molnar <mingo@elte.hu> CommitDate: Wed, 14 Apr 2010 11:56:06 +0200 perf report: Introduce special handling for pipe input Adds special treatment for stdin - if the user specifies '-i -' to perf report, the intent is that the event stream be written to stdin rather than from a disk file. The actual handling of the '-' filename is done by the session; this just adds a signal handler to stop reporting, and turns off interference by the pager. Signed-off-by: Tom Zanussi <tzanussi@gmail.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: fweisbec@gmail.com Cc: rostedt@goodmis.org Cc: k-keiichi@bx.jp.nec.com Cc: acme@ghostprotocols.net LKML-Reference: <1270184365-8281-4-git-send-email-tzanussi@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> --- tools/perf/builtin-report.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-) diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index daee082..00b358f 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -269,6 +269,13 @@ static struct perf_event_ops event_ops = { .read = process_read_event, }; +extern volatile int session_done; + +static void sig_handler(int sig __attribute__((__unused__))) +{ + session_done = 1; +} + static int __cmd_report(void) { int ret = -EINVAL; @@ -276,6 +283,8 @@ static int __cmd_report(void) struct rb_node *next; const char *help = "For a higher level overview, try: perf report --sort comm,dso"; + signal(SIGINT, sig_handler); + session = perf_session__new(input_name, O_RDONLY, force); if (session == NULL) return -ENOMEM; @@ -465,7 +474,8 @@ int cmd_report(int argc, const char **argv, const char *prefix __used) { argc = parse_options(argc, argv, options, ...
Bypasses the event type perf header code and replaces it with a
synthesized event and processing function that accomplishes the same
thing, used when reading/writing perf data to/from a pipe.
Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
---
tools/perf/builtin-record.c | 7 +++++
tools/perf/builtin-report.c | 1 +
tools/perf/builtin-trace.c | 1 +
tools/perf/util/event.h | 14 +++++++++
tools/perf/util/header.c | 62 ++++++++++++++++++++++++++++++++++++++-----
tools/perf/util/header.h | 9 ++++++
tools/perf/util/session.c | 12 ++++++++
tools/perf/util/session.h | 3 +-
8 files changed, 101 insertions(+), 8 deletions(-)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 1f0abe2..c1682d1 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -593,6 +593,13 @@ static int __cmd_record(int argc, const char **argv)
pr_err("Couldn't synthesize attrs.\n");
return err;
}
+
+ err = event__synthesize_event_types(process_synthesized_event,
+ session);
+ if (err < 0) {
+ pr_err("Couldn't synthesize event_types.\n");
+ return err;
+ }
}
err = event__synthesize_kernel_mmap(process_synthesized_event,
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 0bb5d85..d319f83 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -266,6 +266,7 @@ static struct perf_event_ops event_ops = {
.lost = event__process_lost,
.read = process_read_event,
.attr = event__process_attr,
+ .event_type = event__process_event_type,
};
extern volatile int session_done;
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index bb28973..2489565 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -105,6 +105,7 @@ static struct perf_event_ops event_ops = {
.sample = process_sample_event,
.comm = event__process_comm,
.attr = event__process_attr,
+ .event_type = ...Commit-ID: cd19a035f3b63fee6dcbdb5371c4b22276f7dc8c Gitweb: http://git.kernel.org/tip/cd19a035f3b63fee6dcbdb5371c4b22276f7dc8c Author: Tom Zanussi <tzanussi@gmail.com> AuthorDate: Thu, 1 Apr 2010 23:59:20 -0500 Committer: Ingo Molnar <mingo@elte.hu> CommitDate: Wed, 14 Apr 2010 11:56:07 +0200 perf: Convert perf event types into event type events Bypasses the event type perf header code and replaces it with a synthesized event and processing function that accomplishes the same thing, used when reading/writing perf data to/from a pipe. Signed-off-by: Tom Zanussi <tzanussi@gmail.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: fweisbec@gmail.com Cc: rostedt@goodmis.org Cc: k-keiichi@bx.jp.nec.com Cc: acme@ghostprotocols.net LKML-Reference: <1270184365-8281-7-git-send-email-tzanussi@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> --- tools/perf/builtin-record.c | 7 +++++ tools/perf/builtin-report.c | 1 + tools/perf/builtin-trace.c | 1 + tools/perf/util/event.h | 14 +++++++++ tools/perf/util/header.c | 62 ++++++++++++++++++++++++++++++++++++++----- tools/perf/util/header.h | 9 ++++++ tools/perf/util/session.c | 12 ++++++++ tools/perf/util/session.h | 3 +- 8 files changed, 101 insertions(+), 8 deletions(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 289d9cf..c4c1322 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -592,6 +592,13 @@ static int __cmd_record(int argc, const char **argv) pr_err("Couldn't synthesize attrs.\n"); return err; } + + err = event__synthesize_event_types(process_synthesized_event, + session); + if (err < 0) { + pr_err("Couldn't synthesize event_types.\n"); + return err; + } } err = event__synthesize_kernel_mmap(process_synthesized_event, diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index f0486ce..e59d012 100644 --- a/tools/perf/builtin-report.c +++ ...
