From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Jiri Olsa <jolsa@kernel.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
David Ahern <dsahern@gmail.com>, Ingo Molnar <mingo@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
"Liang, Kan" <kan.liang@intel.com>
Subject: Re: [PATCH 29/52] perf stat record: Add record command
Date: Tue, 27 Oct 2015 11:26:57 -0300 [thread overview]
Message-ID: <20151027142657.GD9405@kernel.org> (raw)
In-Reply-To: <1445784728-21732-30-git-send-email-jolsa@kernel.org>
Em Sun, Oct 25, 2015 at 03:51:45PM +0100, Jiri Olsa escreveu:
> Add 'perf stat record' command support. It creates simple
> (header only) perf.data file ATM.
Huh? Couldn't we have the tools providing a sensible message at this point?
[root@zoo linux]# rm -f perf.data
[root@zoo linux]# perf stat record usleep 1
Performance counter stats for 'usleep 1':
0.575678 task-clock (msec) # 0.508 CPUs utilized
1 context-switches # 0.002 M/sec
0 cpu-migrations # 0.000 K/sec
52 page-faults # 0.090 M/sec
905601 cycles # 1.573 GHz
608259 stalled-cycles-frontend # 67.17% frontend cycles idle
<not supported> stalled-cycles-backend
616889 instructions # 0.68 insns per cycle
# 0.99 stalled cycles per insn
125710 branches # 218.369 M/sec
7589 branch-misses # 6.04% of all branches
0.001134076 seconds time elapsed
[root@zoo linux]# perf evlist
WARNING: The perf.data file's data size field is 0 which is unexpected.
Was the 'perf record' command properly terminated?
non matching sample_type[root@zoo linux]#
[root@zoo linux]# perf report --stdio
WARNING: The perf.data file's data size field is 0 which is unexpected.
Was the 'perf record' command properly terminated?
non matching sample_type[root@zoo linux]#
---------------------------------------------------------------------------------------
Can't we make it so that older tools will juts state that there are no samples, i.e.:
[root@zoo linux]# perf record -e alignment-faults usleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.018 MB perf.data ]
[root@zoo linux]# perf evlist
alignment-faults
[root@zoo linux]# perf report --stdio
Error:
The perf.data file has no samples!
# To display the perf.data header info, please use --header/--header-only options.
#
[root@zoo linux]#
--------------------------------------------------------------------------------
This looks a friendlier message, as the 'perf stat record' file really has no
samples, by definition :-)
This is not a show stopper tho, to make progress, I'll continue processing the
patches here, but please consider changing this patch to improve the output
produced by older tools.
- Arnaldo
> Link: http://lkml.kernel.org/n/tip-0av5yfkwyywwgoiali88w4hi@git.kernel.org
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
> tools/perf/Documentation/perf-stat.txt | 12 ++++++
> tools/perf/builtin-stat.c | 74 +++++++++++++++++++++++++++++++++-
> 2 files changed, 84 insertions(+), 2 deletions(-)
>
> diff --git a/tools/perf/Documentation/perf-stat.txt b/tools/perf/Documentation/perf-stat.txt
> index 4e074a660826..70eee1c2c444 100644
> --- a/tools/perf/Documentation/perf-stat.txt
> +++ b/tools/perf/Documentation/perf-stat.txt
> @@ -10,6 +10,7 @@ SYNOPSIS
> [verse]
> 'perf stat' [-e <EVENT> | --event=EVENT] [-a] <command>
> 'perf stat' [-e <EVENT> | --event=EVENT] [-a] -- <command> [<options>]
> +'perf stat' [-e <EVENT> | --event=EVENT] [-a] record [-o file] -- <command> [<options>]
>
> DESCRIPTION
> -----------
> @@ -22,6 +23,8 @@ OPTIONS
> <command>...::
> Any command you can specify in a shell.
>
> +record::
> + See STAT RECORD.
>
> -e::
> --event=::
> @@ -159,6 +162,15 @@ filter out the startup phase of the program, which is often very different.
>
> Print statistics of transactional execution if supported.
>
> +STAT RECORD
> +-----------
> +Stores stat data into perf data file.
> +
> +-o file::
> +--output file::
> +Output file name.
> +
> +
> EXAMPLES
> --------
>
> diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
> index a3880aa65b04..b65cc6a46226 100644
> --- a/tools/perf/builtin-stat.c
> +++ b/tools/perf/builtin-stat.c
> @@ -59,6 +59,7 @@
> #include "util/thread.h"
> #include "util/thread_map.h"
> #include "util/counts.h"
> +#include "util/session.h"
>
> #include <stdlib.h>
> #include <sys/prctl.h>
> @@ -123,6 +124,16 @@ static struct timespec ref_time;
> static struct cpu_map *aggr_map;
> static aggr_get_id_t aggr_get_id;
>
> +struct perf_stat {
> + bool record;
> + struct perf_data_file file;
> + struct perf_session *session;
> + u64 bytes_written;
> +};
> +
> +static struct perf_stat perf_stat;
> +#define STAT_RECORD perf_stat.record
> +
> static volatile int done = 0;
>
> static struct perf_stat_config stat_config = {
> @@ -341,6 +352,15 @@ static int __run_perf_stat(int argc, const char **argv)
> return -1;
> }
>
> + if (STAT_RECORD) {
> + int err, fd = perf_data_file__fd(&perf_stat.file);
> +
> + err = perf_session__write_header(perf_stat.session, evsel_list,
> + fd, false);
> + if (err < 0)
> + return err;
> + }
> +
> /*
> * Enable counters and exec the command:
> */
> @@ -1192,6 +1212,39 @@ static int add_default_attributes(void)
> return perf_evlist__add_default_attrs(evsel_list, very_very_detailed_attrs);
> }
>
> +static const char * const recort_usage[] = {
> + "perf stat record [<options>]",
> + NULL,
> +};
> +
> +static int __cmd_record(int argc, const char **argv)
> +{
> + struct perf_session *session;
> + struct perf_data_file *file = &perf_stat.file;
> + const struct option options[] = {
> + OPT_STRING('o', "output", &perf_stat.file.path, "file", "output file name"),
> + OPT_END()
> + };
> +
> + argc = parse_options(argc, argv, options, record_usage,
> + PARSE_OPT_STOP_AT_NON_OPTION);
> +
> + session = perf_session__new(file, false, NULL);
> + if (session == NULL) {
> + pr_err("Perf session creation failed.\n");
> + return -1;
> + }
> +
> + /* No pipe support ATM */
> + if (perf_stat.file.is_pipe)
> + return -EINVAL;
> +
> + session->evlist = evsel_list;
> + perf_stat.session = session;
> + perf_stat.record = true;
> + return argc;
> +}
> +
> int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
> {
> bool append_file = false;
> @@ -1265,6 +1318,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
> const char *mode;
> FILE *output = stderr;
> unsigned int interval;
> + const char * const stat_subcommands[] = { "record" };
>
> setlocale(LC_ALL, "");
>
> @@ -1272,8 +1326,15 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
> if (evsel_list == NULL)
> return -ENOMEM;
>
> - argc = parse_options(argc, argv, options, stat_usage,
> - PARSE_OPT_STOP_AT_NON_OPTION);
> + argc = parse_options_subcommand(argc, argv, options, stat_subcommands,
> + (const char **) stat_usage,
> + PARSE_OPT_STOP_AT_NON_OPTION);
> +
> + if (argc && !strncmp(argv[0], "rec", 3)) {
> + argc = __cmd_record(argc, argv);
> + if (argc < 0)
> + return -1;
> + }
>
> interval = stat_config.interval;
>
> @@ -1444,6 +1505,15 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
> if (!forever && status != -1 && !interval)
> print_counters(NULL, argc, argv);
>
> + if (STAT_RECORD) {
> + int fd = perf_data_file__fd(&perf_stat.file);
> +
> + perf_stat.session->header.data_size += perf_stat.bytes_written;
> + perf_session__write_header(perf_stat.session, evsel_list, fd, true);
> +
> + perf_session__delete(perf_stat.session);
> + }
> +
> perf_evlist__free_stats(evsel_list);
> out:
> perf_evlist__delete(evsel_list);
> --
> 2.4.3
next prev parent reply other threads:[~2015-10-27 14:27 UTC|newest]
Thread overview: 99+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-25 14:51 [PATCHv5 00/52] perf stat: Add scripting support Jiri Olsa
2015-10-25 14:51 ` [PATCH 01/52] perf cpu_map: Add cpu_map__empty_new function Jiri Olsa
2015-10-29 9:41 ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 02/52] perf stat: Cache aggregated map entries in extra cpumap Jiri Olsa
2015-10-29 9:41 ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 03/52] perf tools: Add thread_map event Jiri Olsa
2015-10-26 17:42 ` Arnaldo Carvalho de Melo
2015-10-26 17:45 ` Jiri Olsa
2015-10-26 17:48 ` Arnaldo Carvalho de Melo
2015-10-26 17:55 ` Jiri Olsa
2015-10-26 17:57 ` Arnaldo Carvalho de Melo
2015-12-18 9:00 ` [tip:perf/core] perf thread_map: Add thread_map user level event tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 04/52] perf tools: Add thread_map event sythesize function Jiri Olsa
2015-12-18 9:00 ` [tip:perf/core] perf thread_map: " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 05/52] perf tools: Add thread_map__new_event function Jiri Olsa
2015-12-18 9:01 ` [tip:perf/core] perf thread_map: " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 06/52] perf tools: Add perf_event__fprintf_thread_map function Jiri Olsa
2015-12-18 9:01 ` [tip:perf/core] perf thread_map: " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 07/52] perf tools: Add cpu_map event Jiri Olsa
2015-12-18 9:01 ` [tip:perf/core] perf cpu_map: Add cpu_map user level event tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 08/52] perf tools: Add cpu_map event synthesize function Jiri Olsa
2015-12-18 9:02 ` [tip:perf/core] perf cpu_map: " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 09/52] perf tools: Add cpu_map__new_event function Jiri Olsa
2015-12-18 9:02 ` [tip:perf/core] perf cpu_map: " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 10/52] perf tools: Add perf_event__fprintf_cpu_map function Jiri Olsa
2015-12-18 9:02 ` [tip:perf/core] perf cpu_map: " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 11/52] perf tools: Add stat config event Jiri Olsa
2015-10-27 13:16 ` Arnaldo Carvalho de Melo
2015-10-27 13:30 ` Jiri Olsa
2015-10-27 13:44 ` Arnaldo Carvalho de Melo
2015-10-27 13:51 ` Jiri Olsa
2015-10-27 14:13 ` Arnaldo Carvalho de Melo
2015-12-18 9:03 ` [tip:perf/core] perf tools: Add stat config user level event tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 12/52] perf tools: Add stat config event synthesize function Jiri Olsa
2015-12-18 9:03 ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 13/52] perf tools: Add stat config event read function Jiri Olsa
2015-12-18 9:03 ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 14/52] perf tools: Add stat event Jiri Olsa
2015-12-18 9:04 ` [tip:perf/core] perf tools: Add stat user level event tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 15/52] perf tools: Add stat event synthesize function Jiri Olsa
2015-12-18 9:04 ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 16/52] perf tools: Add stat event read function Jiri Olsa
2015-12-18 9:04 ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 17/52] perf tools: Add stat round event Jiri Olsa
2015-12-18 9:05 ` [tip:perf/core] perf tools: Add stat round user level event tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 18/52] perf tools: Add stat round event synthesize function Jiri Olsa
2015-12-18 9:05 ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 19/52] perf tools: Add stat events fprintf functions Jiri Olsa
2015-12-18 9:05 ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 20/52] perf tools: Add event_update event Jiri Olsa
2015-12-18 9:06 ` [tip:perf/core] perf tools: Add event_update user level event tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 21/52] perf tools: Add event_update event unit type Jiri Olsa
2015-12-18 9:06 ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 22/52] perf tools: Add event_update event scale type Jiri Olsa
2015-12-18 9:06 ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 23/52] perf tools: Add event_update event name type Jiri Olsa
2015-12-18 9:07 ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 24/52] perf tools: Add event_update event cpus type Jiri Olsa
2015-12-18 9:07 ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 25/52] perf tools: Add perf_event__fprintf_event_update function Jiri Olsa
2015-12-18 9:07 ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 26/52] perf report: Display newly added events in raw dump Jiri Olsa
2015-12-18 9:07 ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 27/52] perf tools: Introduce stat feature Jiri Olsa
2015-12-18 9:08 ` [tip:perf/core] perf tools: Introduce stat perf.data header feature tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 28/52] perf tools: Move id_offset out of struct perf_evsel union Jiri Olsa
2015-10-29 9:40 ` [tip:perf/core] perf evsel: Move id_offset out of struct perf_evsel union member tip-bot for Jiri Olsa
2015-10-25 14:51 ` [PATCH 29/52] perf stat record: Add record command Jiri Olsa
2015-10-27 14:26 ` Arnaldo Carvalho de Melo [this message]
2015-10-25 14:51 ` [PATCH 30/52] perf stat record: Initialize record features Jiri Olsa
2015-10-25 14:51 ` [PATCH 31/52] perf stat record: Synthesize stat record data Jiri Olsa
2015-10-27 14:42 ` Arnaldo Carvalho de Melo
2015-10-28 12:15 ` Jiri Olsa
2015-10-28 13:03 ` Jiri Olsa
2015-10-28 13:04 ` Jiri Olsa
2015-10-25 14:51 ` [PATCH 32/52] perf stat record: Store events IDs in perf data file Jiri Olsa
2015-10-25 14:51 ` [PATCH 33/52] perf stat record: Add pipe support for record command Jiri Olsa
2015-10-25 14:51 ` [PATCH 34/52] perf stat record: Write stat events on record Jiri Olsa
2015-10-25 14:51 ` [PATCH 35/52] perf stat record: Write stat round " Jiri Olsa
2015-10-25 14:51 ` [PATCH 36/52] perf stat record: Do not allow record with multiple runs mode Jiri Olsa
2015-10-25 14:51 ` [PATCH 37/52] perf stat record: Synthesize event update events Jiri Olsa
2015-10-25 14:51 ` [PATCH 38/52] perf stat report: Add report command Jiri Olsa
2015-10-25 14:51 ` [PATCH 39/52] perf stat report: Process cpu/threads maps Jiri Olsa
2015-10-25 14:51 ` [PATCH 40/52] perf stat report: Process stat config event Jiri Olsa
2015-10-25 14:51 ` [PATCH 41/52] perf stat report: Add support to initialize aggr_map from file Jiri Olsa
2015-10-25 14:51 ` [PATCH 42/52] perf stat report: Process stat and stat round events Jiri Olsa
2015-10-25 14:51 ` [PATCH 43/52] perf stat report: Process event update events Jiri Olsa
2015-10-25 14:52 ` [PATCH 44/52] perf stat report: Move csv_sep initialization before report command Jiri Olsa
2015-10-25 14:52 ` [PATCH 45/52] perf stat report: Allow to override aggr_mode Jiri Olsa
2015-10-25 14:52 ` [PATCH 46/52] perf script: Process cpu/threads maps Jiri Olsa
2015-10-25 14:52 ` [PATCH 47/52] perf script: Process stat config event Jiri Olsa
2015-10-25 14:52 ` [PATCH 48/52] perf script: Add process_stat/process_stat_interval scripting interface Jiri Olsa
2015-10-25 14:52 ` [PATCH 49/52] perf script: Add stat default handlers Jiri Olsa
2015-10-25 14:52 ` [PATCH 50/52] perf script: Display stat events by default Jiri Olsa
2015-10-25 14:52 ` [PATCH 51/52] perf script: Add python support for stat events Jiri Olsa
2015-10-25 14:52 ` [PATCH 52/52] perf script: Add stat-cpi.py script Jiri Olsa
2015-10-26 17:34 ` [PATCHv5 00/52] perf stat: Add scripting support Arnaldo Carvalho de Melo
2015-10-27 14:24 ` Liang, Kan
2015-10-27 14:48 ` Arnaldo Carvalho de Melo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20151027142657.GD9405@kernel.org \
--to=acme@kernel.org \
--cc=a.p.zijlstra@chello.nl \
--cc=dsahern@gmail.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).