From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Artem Savkov <asavkov@redhat.com>
Cc: linux-perf-users@vger.kernel.org,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Namhyung Kim <namhyung@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
"Liang, Kan" <kan.liang@linux.intel.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] perf record: add a shortcut for metrics
Date: Mon, 27 May 2024 14:02:29 -0300 [thread overview]
Message-ID: <ZlS8pc39t2c1WFye@x1> (raw)
In-Reply-To: <20240527101519.356342-1-asavkov@redhat.com>
On Mon, May 27, 2024 at 12:15:19PM +0200, Artem Savkov wrote:
> Add -M/--metrics option to perf-record providing a shortcut to record
> metrics and metricgroups. This option mirrors the one in perf-stat.
>
> Suggested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
> Signed-off-by: Artem Savkov <asavkov@redhat.com>
Not building for me, I needed to add the rblist.h header and also I
think we need to use metricgroup__rblist_init(&mevents), right?
Testing it now.
- Arnaldo
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 18da3ce380152ad1..5d67b0711c166fae 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -27,6 +27,7 @@
#include "util/session.h"
#include "util/tool.h"
#include "util/symbol.h"
+#include "util/rblist.h"
#include "util/record.h"
#include "util/cpumap.h"
#include "util/thread_map.h"
@@ -4017,6 +4018,7 @@ int cmd_record(int argc, const char **argv)
set_nobuild('\0', "off-cpu", "no BUILD_BPF_SKEL=1", true);
# undef set_nobuild
#endif
+ metricgroup__rblist_init(&mevents);
/* Disable eager loading of kernel symbols that adds overhead to perf record. */
symbol_conf.lazy_load_kernel_maps = true;
> ---
> tools/perf/Documentation/perf-record.txt | 7 +++-
> tools/perf/builtin-record.c | 43 ++++++++++++++++++++++++
> 2 files changed, 49 insertions(+), 1 deletion(-)
>
> diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
> index 6015fdd08fb63..ebb560d137e62 100644
> --- a/tools/perf/Documentation/perf-record.txt
> +++ b/tools/perf/Documentation/perf-record.txt
> @@ -18,7 +18,6 @@ from it, into perf.data - without displaying anything.
>
> This file can then be inspected later on, using 'perf report'.
>
> -
> OPTIONS
> -------
> <command>...::
> @@ -216,6 +215,12 @@ OPTIONS
> na, by_data, by_addr (for mem_blk)
> hops0, hops1, hops2, hops3 (for mem_hops)
>
> +-M::
> +--metrics::
> +Record metrics or metricgroups specified in a comma separated list.
> +For a group all metrics from the group are added.
> +See perf list output for the possible metrics and metricgroups.
> +
> --exclude-perf::
> Don't record events issued by perf itself. This option should follow
> an event selector (-e) which selects tracepoint event(s). It adds a
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index 66a3de8ac6618..5828051ff2736 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -40,6 +40,7 @@
> #include "util/trigger.h"
> #include "util/perf-hooks.h"
> #include "util/cpu-set-sched.h"
> +#include "util/metricgroup.h"
> #include "util/synthetic-events.h"
> #include "util/time-utils.h"
> #include "util/units.h"
> @@ -188,6 +189,7 @@ static volatile int done;
> static volatile int auxtrace_record__snapshot_started;
> static DEFINE_TRIGGER(auxtrace_snapshot_trigger);
> static DEFINE_TRIGGER(switch_output_trigger);
> +static char *metrics;
>
> static const char *affinity_tags[PERF_AFFINITY_MAX] = {
> "SYS", "NODE", "CPU"
> @@ -200,6 +202,25 @@ static inline pid_t gettid(void)
> }
> #endif
>
> +static int append_metric_groups(const struct option *opt __maybe_unused,
> + const char *str,
> + int unset __maybe_unused)
> +{
> + if (metrics) {
> + char *tmp;
> +
> + if (asprintf(&tmp, "%s,%s", metrics, str) < 0)
> + return -ENOMEM;
> + free(metrics);
> + metrics = tmp;
> + } else {
> + metrics = strdup(str);
> + if (!metrics)
> + return -ENOMEM;
> + }
> + return 0;
> +}
> +
> static int record__threads_enabled(struct record *rec)
> {
> return rec->opts.threads_spec;
> @@ -3382,6 +3403,9 @@ static struct option __record_options[] = {
> parse_events_option),
> OPT_CALLBACK(0, "filter", &record.evlist, "filter",
> "event filter", parse_filter),
> + OPT_CALLBACK('M', "metrics", &record.evlist, "metric/metric group list",
> + "monitor specified metrics or metric groups (separated by ,)",
> + append_metric_groups),
> OPT_CALLBACK_NOOPT(0, "exclude-perf", &record.evlist,
> NULL, "don't record events from perf itself",
> exclude_perf),
> @@ -3984,6 +4008,7 @@ int cmd_record(int argc, const char **argv)
> int err;
> struct record *rec = &record;
> char errbuf[BUFSIZ];
> + struct rblist mevents;
>
> setlocale(LC_ALL, "");
>
> @@ -4153,6 +4178,23 @@ int cmd_record(int argc, const char **argv)
> if (record.opts.overwrite)
> record.opts.tail_synthesize = true;
>
> + if (metrics) {
> + const char *pmu = parse_events_option_args.pmu_filter ?: "all";
> + int ret = metricgroup__parse_groups(rec->evlist, pmu, metrics,
> + false, /* metric_no_group */
> + false, /* metric_no_merge */
> + false, /* metric_no_threshold */
> + rec->opts.target.cpu_list,
> + rec->opts.target.system_wide,
> + false, /* hardware_aware_grouping */
> + &mevents);
> + if (ret) {
> + err = ret;
> + goto out;
> + }
> + zfree(&metrics);
> + }
> +
> if (rec->evlist->core.nr_entries == 0) {
> bool can_profile_kernel = perf_event_paranoid_check(1);
>
> @@ -4264,6 +4306,7 @@ int cmd_record(int argc, const char **argv)
> out_opts:
> record__free_thread_masks(rec, rec->nr_threads);
> rec->nr_threads = 0;
> + metricgroup__rblist_exit(&mevents);
> evlist__close_control(rec->opts.ctl_fd, rec->opts.ctl_fd_ack, &rec->opts.ctl_fd_close);
> return err;
> }
> --
> 2.45.1
next prev parent reply other threads:[~2024-05-27 17:02 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-27 10:15 [PATCH] perf record: add a shortcut for metrics Artem Savkov
2024-05-27 17:02 ` Arnaldo Carvalho de Melo [this message]
2024-05-27 17:04 ` Arnaldo Carvalho de Melo
2024-05-27 17:28 ` Arnaldo Carvalho de Melo
2024-05-27 17:46 ` Arnaldo Carvalho de Melo
2024-05-28 5:01 ` Ian Rogers
2024-05-28 11:57 ` Artem Savkov
2024-05-28 15:55 ` Liang, Kan
2024-05-28 18:20 ` Arnaldo Carvalho de Melo
2024-05-29 15:15 ` Guilherme Amadio
2024-05-29 19:41 ` Liang, Kan
2024-05-28 11:45 ` Artem Savkov
2024-05-28 14:47 ` 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=ZlS8pc39t2c1WFye@x1 \
--to=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=asavkov@redhat.com \
--cc=irogers@google.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.