lkml.org 
[lkml]   [2011]   [Dec]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 07/10] perf report: Accept fifos as input file
    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@amd.com>
    > ---
    > 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
    >


    \
     
     \ /
      Last update: 2011-12-06 14:25    [W:0.050 / U:30.548 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site