Re: [PATCH 07/10] perf report: Accept fifos as input file

From: Arnaldo Carvalho de Melo
Date: Tue Dec 06 2011 - 08:23:10 EST


Em Tue, Dec 06, 2011 at 11:32:37AM +0100, Robert Richter escreveu:
> The default input file for perf report is not handled the same way as
> perf record does it for its output file. This leads to unexpected
> behavior of perf report, etc. E.g.:
>
> # perf record -a -e cpu-cycles sleep 2 | perf report | cat
> failed to open perf.data: No such file or directory (try 'perf record' first)
>
> While perf record writes to a fifo, perf report expects perf.data to
> be read. This patch changes this to accept fifos as input file.

Nice feature!

The idea of writing to a pipe initially considered just 'perf script'
iirc, but having it working for all commands like this is indeed a good
thing.

> Applies to the following commands:
>
> perf annotate
> perf buildid-list
> perf evlist
> perf kmem
> perf lock
> perf report
> perf sched
> perf script
> perf timechart
>
> Also fixes char const* -> const char* type declaration for filename
> strings.
>
> Signed-off-by: Robert Richter <robert.richter@xxxxxxx>
> ---
> tools/perf/Documentation/perf-annotate.txt | 2 +-
> tools/perf/Documentation/perf-buildid-list.txt | 2 +-
> tools/perf/Documentation/perf-evlist.txt | 2 +-
> tools/perf/Documentation/perf-kmem.txt | 2 +-
> tools/perf/Documentation/perf-lock.txt | 2 +-
> tools/perf/Documentation/perf-report.txt | 2 +-
> tools/perf/Documentation/perf-sched.txt | 2 +-
> tools/perf/Documentation/perf-script.txt | 2 +-
> tools/perf/Documentation/perf-timechart.txt | 2 +-
> tools/perf/builtin-annotate.c | 4 ++--
> tools/perf/builtin-buildid-list.c | 19 ++++++++++---------
> tools/perf/builtin-evlist.c | 2 +-
> tools/perf/builtin-kmem.c | 2 +-
> tools/perf/builtin-lock.c | 2 +-
> tools/perf/builtin-report.c | 4 ++--
> tools/perf/builtin-sched.c | 2 +-
> tools/perf/builtin-script.c | 4 ++--
> tools/perf/builtin-timechart.c | 4 ++--
> tools/perf/util/session.c | 15 +++++++++++++--
> 19 files changed, 44 insertions(+), 32 deletions(-)
>
> diff --git a/tools/perf/Documentation/perf-annotate.txt b/tools/perf/Documentation/perf-annotate.txt
> index fe6762e..0d0f217 100644
> --- a/tools/perf/Documentation/perf-annotate.txt
> +++ b/tools/perf/Documentation/perf-annotate.txt
> @@ -22,7 +22,7 @@ OPTIONS
> -------
> -i::
> --input=::
> - Input file name. (default: perf.data)
> + Input file name. (default: perf.data unless stdin is a fifo)
>
> -d::
> --dsos=<dso[,dso...]>::
> diff --git a/tools/perf/Documentation/perf-buildid-list.txt b/tools/perf/Documentation/perf-buildid-list.txt
> index cc22325..25c52ef 100644
> --- a/tools/perf/Documentation/perf-buildid-list.txt
> +++ b/tools/perf/Documentation/perf-buildid-list.txt
> @@ -26,7 +26,7 @@ OPTIONS
> Show only DSOs with hits.
> -i::
> --input=::
> - Input file name. (default: perf.data)
> + Input file name. (default: perf.data unless stdin is a fifo)
> -f::
> --force::
> Don't do ownership validation.
> diff --git a/tools/perf/Documentation/perf-evlist.txt b/tools/perf/Documentation/perf-evlist.txt
> index 0cada9e..0507ec7 100644
> --- a/tools/perf/Documentation/perf-evlist.txt
> +++ b/tools/perf/Documentation/perf-evlist.txt
> @@ -18,7 +18,7 @@ OPTIONS
> -------
> -i::
> --input=::
> - Input file name. (default: perf.data)
> + Input file name. (default: perf.data unless stdin is a fifo)
>
> SEE ALSO
> --------
> diff --git a/tools/perf/Documentation/perf-kmem.txt b/tools/perf/Documentation/perf-kmem.txt
> index a52fcde..7c8fbbf 100644
> --- a/tools/perf/Documentation/perf-kmem.txt
> +++ b/tools/perf/Documentation/perf-kmem.txt
> @@ -23,7 +23,7 @@ OPTIONS
> -------
> -i <file>::
> --input=<file>::
> - Select the input file (default: perf.data)
> + Select the input file (default: perf.data unless stdin is a fifo)
>
> --caller::
> Show per-callsite statistics
> diff --git a/tools/perf/Documentation/perf-lock.txt b/tools/perf/Documentation/perf-lock.txt
> index 4a26a2f..d6b2a4f 100644
> --- a/tools/perf/Documentation/perf-lock.txt
> +++ b/tools/perf/Documentation/perf-lock.txt
> @@ -29,7 +29,7 @@ COMMON OPTIONS
>
> -i::
> --input=<file>::
> - Input file name.
> + Input file name. (default: perf.data unless stdin is a fifo)
>
> -v::
> --verbose::
> diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt
> index 212f24d..a67be86 100644
> --- a/tools/perf/Documentation/perf-report.txt
> +++ b/tools/perf/Documentation/perf-report.txt
> @@ -19,7 +19,7 @@ OPTIONS
> -------
> -i::
> --input=::
> - Input file name. (default: perf.data)
> + Input file name. (default: perf.data unless stdin is a fifo)
>
> -v::
> --verbose::
> diff --git a/tools/perf/Documentation/perf-sched.txt b/tools/perf/Documentation/perf-sched.txt
> index 5b212b5..8ff4df9 100644
> --- a/tools/perf/Documentation/perf-sched.txt
> +++ b/tools/perf/Documentation/perf-sched.txt
> @@ -40,7 +40,7 @@ OPTIONS
> -------
> -i::
> --input=<file>::
> - Input file name. (default: perf.data)
> + Input file name. (default: perf.data unless stdin is a fifo)
>
> -v::
> --verbose::
> diff --git a/tools/perf/Documentation/perf-script.txt b/tools/perf/Documentation/perf-script.txt
> index dec87ec..d465c11 100644
> --- a/tools/perf/Documentation/perf-script.txt
> +++ b/tools/perf/Documentation/perf-script.txt
> @@ -106,7 +106,7 @@ OPTIONS
>
> -i::
> --input=::
> - Input file name.
> + Input file name. (default: perf.data unless stdin is a fifo)
>
> -d::
> --debug-mode::
> diff --git a/tools/perf/Documentation/perf-timechart.txt b/tools/perf/Documentation/perf-timechart.txt
> index d7b79e2..1632b0e 100644
> --- a/tools/perf/Documentation/perf-timechart.txt
> +++ b/tools/perf/Documentation/perf-timechart.txt
> @@ -27,7 +27,7 @@ OPTIONS
> Select the output file (default: output.svg)
> -i::
> --input=::
> - Select the input file (default: perf.data)
> + Select the input file (default: perf.data unless stdin is a fifo)
> -w::
> --width=::
> Select the width of the SVG file (default: 1000)
> diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
> index 46b4c24..a6374cd 100644
> --- a/tools/perf/builtin-annotate.c
> +++ b/tools/perf/builtin-annotate.c
> @@ -30,7 +30,7 @@
>
> #include <linux/bitmap.h>
>
> -static char const *input_name = "perf.data";
> +static const char *input_name;
>
> static bool force, use_tui, use_stdio;
>
> @@ -223,7 +223,7 @@ static int __cmd_annotate(void)
> }
>
> if (total_nr_samples == 0) {
> - ui__warning("The %s file has no samples!\n", input_name);
> + ui__warning("The %s file has no samples!\n", session->filename);
> goto out_delete;
> }
> out_delete:
> diff --git a/tools/perf/builtin-buildid-list.c b/tools/perf/builtin-buildid-list.c
> index 4895668..5248046 100644
> --- a/tools/perf/builtin-buildid-list.c
> +++ b/tools/perf/builtin-buildid-list.c
> @@ -18,7 +18,7 @@
>
> #include <libelf.h>
>
> -static char const *input_name = "perf.data";
> +static const char *input_name;
> static bool force;
> static bool show_kernel;
> static bool with_hits;
> @@ -71,16 +71,24 @@ static int perf_session__list_build_ids(void)
> {
> struct perf_session *session;
>
> + elf_version(EV_CURRENT);
> +
> session = perf_session__new(input_name, O_RDONLY, force, false,
> &build_id__mark_dso_hit_ops);
> if (session == NULL)
> return -1;
>
> + /*
> + * See if this is an ELF file first:
> + */
> + if (filename__fprintf_build_id(session->filename, stdout))
> + goto out;
> +
> if (with_hits)
> perf_session__process_events(session, &build_id__mark_dso_hit_ops);
>
> perf_session__fprintf_dsos_buildid(session, stdout, with_hits);
> -
> +out:
> perf_session__delete(session);
> return 0;
> }
> @@ -90,13 +98,6 @@ static int __cmd_buildid_list(void)
> if (show_kernel)
> return sysfs__fprintf_build_id(stdout);
>
> - elf_version(EV_CURRENT);
> - /*
> - * See if this is an ELF file first:
> - */
> - if (filename__fprintf_build_id(input_name, stdout))
> - return 0;
> -
> return perf_session__list_build_ids();
> }
>
> diff --git a/tools/perf/builtin-evlist.c b/tools/perf/builtin-evlist.c
> index 4c5e9e0..2676032 100644
> --- a/tools/perf/builtin-evlist.c
> +++ b/tools/perf/builtin-evlist.c
> @@ -15,7 +15,7 @@
> #include "util/parse-options.h"
> #include "util/session.h"
>
> -static char const *input_name = "perf.data";
> +static const char *input_name;
>
> static int __cmd_evlist(void)
> {
> diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c
> index 225e963..f2a1c33 100644
> --- a/tools/perf/builtin-kmem.c
> +++ b/tools/perf/builtin-kmem.c
> @@ -18,7 +18,7 @@
> struct alloc_stat;
> typedef int (*sort_fn_t)(struct alloc_stat *, struct alloc_stat *);
>
> -static char const *input_name = "perf.data";
> +static const char *input_name;
>
> static int alloc_flag;
> static int caller_flag;
> diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
> index 899080a..c743b2a 100644
> --- a/tools/perf/builtin-lock.c
> +++ b/tools/perf/builtin-lock.c
> @@ -325,7 +325,7 @@ alloc_failed:
> die("memory allocation failed\n");
> }
>
> -static char const *input_name = "perf.data";
> +static const char *input_name;
>
> struct raw_event_sample {
> u32 size;
> diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> index 88ca2d4..19c2217 100644
> --- a/tools/perf/builtin-report.c
> +++ b/tools/perf/builtin-report.c
> @@ -35,7 +35,7 @@
>
> #include <linux/bitmap.h>
>
> -static char const *input_name = "perf.data";
> +static const char *input_name;
>
> static bool force, use_tui, use_stdio;
> static bool hide_unresolved;
> @@ -327,7 +327,7 @@ static int __cmd_report(void)
> }
>
> if (nr_samples == 0) {
> - ui__warning("The %s file has no samples!\n", input_name);
> + ui__warning("The %s file has no samples!\n", session->filename);
> goto out_delete;
> }
>
> diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
> index 5177964..9816fa9 100644
> --- a/tools/perf/builtin-sched.c
> +++ b/tools/perf/builtin-sched.c
> @@ -19,7 +19,7 @@
> #include <pthread.h>
> #include <math.h>
>
> -static char const *input_name = "perf.data";
> +static const char *input_name;
>
> static char default_sort_order[] = "avg, max, switch, runtime";
> static const char *sort_order = default_sort_order;
> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
> index 82cca10..6d74933 100644
> --- a/tools/perf/builtin-script.c
> +++ b/tools/perf/builtin-script.c
> @@ -433,7 +433,7 @@ static int cleanup_scripting(void)
> return scripting_ops->stop_script();
> }
>
> -static char const *input_name = "perf.data";
> +static const char *input_name;
>
> static int process_sample_event(union perf_event *event,
> struct perf_sample *sample,
> @@ -1302,7 +1302,7 @@ int cmd_script(int argc, const char **argv, const char *prefix __used)
> return -1;
> }
>
> - input = open(input_name, O_RDONLY);
> + input = open(session->filename, O_RDONLY); /* input_name */
> if (input < 0) {
> perror("failed to open file");
> exit(-1);
> diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c
> index aa26f4d..08e4fd0 100644
> --- a/tools/perf/builtin-timechart.c
> +++ b/tools/perf/builtin-timechart.c
> @@ -36,8 +36,8 @@
> #define PWR_EVENT_EXIT -1
>
>
> -static char const *input_name = "perf.data";
> -static char const *output_name = "output.svg";
> +static const char *input_name;
> +static const char *output_name = "output.svg";
>
> static unsigned int numcpus;
> static u64 min_freq; /* Lowest CPU frequency seen */
> diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> index 2ad9c10..fdd135d 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -132,8 +132,19 @@ struct perf_session *perf_session__new(const char *filename, int mode,
> bool force, bool repipe,
> struct perf_event_ops *ops)
> {
> - size_t len = filename ? strlen(filename) : 0;
> - struct perf_session *self = zalloc(sizeof(*self) + len);
> + struct perf_session *self;
> + struct stat st;
> + size_t len;
> +
> + if (!filename || !strlen(filename)) {
> + if (!fstat(STDIN_FILENO, &st) && S_ISFIFO(st.st_mode))
> + filename = "-";
> + else
> + filename = "perf.data";
> + }
> +
> + len = strlen(filename);
> + self = zalloc(sizeof(*self) + len);
>
> if (self == NULL)
> goto out;
> --
> 1.7.7
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/