From: Xing Zhengjun <zhengjun.xing@linux.intel.com>
To: Ian Rogers <irogers@google.com>
Cc: acme@kernel.org, peterz@infradead.org, mingo@redhat.com,
alexander.shishkin@intel.com, jolsa@kernel.org,
namhyung@kernel.org, linux-kernel@vger.kernel.org,
linux-perf-users@vger.kernel.org, ak@linux.intel.com,
kan.liang@linux.intel.com
Subject: Re: [PATCH] perf record: Support "--cputype" option for hybrid events
Date: Thu, 16 Jun 2022 16:31:37 +0800 [thread overview]
Message-ID: <bc4d4c51-27ee-d8ef-a190-e5c7e587447b@linux.intel.com> (raw)
In-Reply-To: <CAP-5=fVnD=jiSav=UAV9E_mc8XtcHad107ww8JSeiJ2y4ucxDw@mail.gmail.com>
Hi Ian,
On 6/15/2022 11:16 PM, Ian Rogers wrote:
> On Wed, Jun 15, 2022 at 8:07 AM <zhengjun.xing@linux.intel.com> wrote:
>>
>> From: Zhengjun Xing <zhengjun.xing@linux.intel.com>
>>
>> perf stat already has the "--cputype" option to enable events only on the
>> specified PMU for the hybrid platform, this commit extends the "--cputype"
>> support to perf record.
>>
>> Without "--cputype", it reports events for both cpu_core and cpu_atom.
>>
>> # ./perf record -e cycles -a sleep 1 | ./perf report
>>
>> # To display the perf.data header info, please use --header/--header-only options.
>> #
>> [ perf record: Woken up 1 times to write data ]
>> [ perf record: Captured and wrote 0.000 MB (null) ]
>> #
>> # Total Lost Samples: 0
>> #
>> # Samples: 335 of event 'cpu_core/cycles/'
>> # Event count (approx.): 35855267
>> #
>> # Overhead Command Shared Object Symbol
>> # ........ ............... ................. .........................................
>> #
>> 10.31% swapper [kernel.kallsyms] [k] poll_idle
>> 9.42% swapper [kernel.kallsyms] [k] menu_select
>> ... ... ... ... ...
>>
>> # Samples: 61 of event 'cpu_atom/cycles/'
>> # Event count (approx.): 16453825
>> #
>> # Overhead Command Shared Object Symbol
>> # ........ ............. ................. ......................................
>> #
>> 26.36% snapd [unknown] [.] 0x0000563cc6d03841
>> 7.43% migration/13 [kernel.kallsyms] [k] update_sd_lb_stats.constprop.0
>> ... ... ... ... ...
>>
>> With "--cputype", it reports events only for the specified PMU.
>>
>> # ./perf record --cputype core -e cycles -a sleep 1 | ./perf report
>>
>> # To display the perf.data header info, please use --header/--header-only options.
>> #
>> [ perf record: Woken up 1 times to write data ]
>> [ perf record: Captured and wrote 0.000 MB (null) ]
>> #
>> # Total Lost Samples: 0
>> #
>> # Samples: 221 of event 'cpu_core/cycles/'
>> # Event count (approx.): 27121818
>> #
>> # Overhead Command Shared Object Symbol
>> # ........ ............... ................. .........................................
>> #
>> 11.24% swapper [kernel.kallsyms] [k] e1000_irq_enable
>> 7.77% swapper [kernel.kallsyms] [k] mwait_idle_with_hints.constprop.0
>> ... ... ... ... ...
>
> This is already possible by having the PMU name as part of the event,
> cpu_atom/cycles/ or cpu_core/cycles/. I don't know why we're adding
> "hybrid" all over the code base, I wish it would stop. You are asking
> for an option here for an implied PMU for events that don't specify a
> PMU. The option should be called --pmutype and consider all PMUs. We
> should remove the "hybrid" PMU list and make all of the "hybrid" code
> generic.
>
I can change the option name from "cputype" to "pmutype". We have
planned to clean up the hybrid code, and try to reduce the code with "if
perf_pmu__has_hybrid()", this will be done step by step, from this
patch, we have begun to do some clean-up, move the hybrid API from the
common file to the hybrid-specific files. For the clean-up, Do you have
any ideas? Thanks.
> Thanks,
> Ian
>
>> Signed-off-by: Zhengjun Xing <zhengjun.xing@linux.intel.com>
>> Reviewed-by: Kan Liang <kan.liang@linux.intel.com>
>> ---
>> tools/perf/Documentation/perf-record.txt | 4 ++++
>> tools/perf/builtin-record.c | 3 +++
>> tools/perf/builtin-stat.c | 20 --------------------
>> tools/perf/util/pmu-hybrid.c | 19 +++++++++++++++++++
>> tools/perf/util/pmu-hybrid.h | 2 ++
>> 5 files changed, 28 insertions(+), 20 deletions(-)
>>
>> diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
>> index cf8ad50f3de1..ba8d680da1ac 100644
>> --- a/tools/perf/Documentation/perf-record.txt
>> +++ b/tools/perf/Documentation/perf-record.txt
>> @@ -402,6 +402,10 @@ Enable weightened sampling. An additional weight is recorded per sample and can
>> displayed with the weight and local_weight sort keys. This currently works for TSX
>> abort events and some memory events in precise mode on modern Intel CPUs.
>>
>> +--cputype::
>> +Only enable events on applying cpu with this type for hybrid platform(e.g. core or atom).
>> +For non-hybrid events, it should be no effect.
>> +
>> --namespaces::
>> Record events of type PERF_RECORD_NAMESPACES. This enables 'cgroup_id' sort key.
>>
>> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
>> index 9a71f0330137..e1edd4e98358 100644
>> --- a/tools/perf/builtin-record.c
>> +++ b/tools/perf/builtin-record.c
>> @@ -3183,6 +3183,9 @@ static struct option __record_options[] = {
>> OPT_INCR('v', "verbose", &verbose,
>> "be more verbose (show counter open errors, etc)"),
>> OPT_BOOLEAN('q', "quiet", &quiet, "don't print any message"),
>> + OPT_CALLBACK(0, "cputype", &record.evlist, "hybrid cpu type",
>> + "Only enable events on applying cpu with this type for hybrid platform (e.g. core or atom)",
>> + parse_hybrid_type),
>> OPT_BOOLEAN('s', "stat", &record.opts.inherit_stat,
>> "per thread counts"),
>> OPT_BOOLEAN('d', "data", &record.opts.sample_address, "Record the sample addresses"),
>> diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
>> index 4ce87a8eb7d7..0d95b29273f4 100644
>> --- a/tools/perf/builtin-stat.c
>> +++ b/tools/perf/builtin-stat.c
>> @@ -1184,26 +1184,6 @@ static int parse_stat_cgroups(const struct option *opt,
>> return parse_cgroups(opt, str, unset);
>> }
>>
>> -static int parse_hybrid_type(const struct option *opt,
>> - const char *str,
>> - int unset __maybe_unused)
>> -{
>> - struct evlist *evlist = *(struct evlist **)opt->value;
>> -
>> - if (!list_empty(&evlist->core.entries)) {
>> - fprintf(stderr, "Must define cputype before events/metrics\n");
>> - return -1;
>> - }
>> -
>> - evlist->hybrid_pmu_name = perf_pmu__hybrid_type_to_pmu(str);
>> - if (!evlist->hybrid_pmu_name) {
>> - fprintf(stderr, "--cputype %s is not supported!\n", str);
>> - return -1;
>> - }
>> -
>> - return 0;
>> -}
>> -
>> static struct option stat_options[] = {
>> OPT_BOOLEAN('T', "transaction", &transaction_run,
>> "hardware transaction statistics"),
>> diff --git a/tools/perf/util/pmu-hybrid.c b/tools/perf/util/pmu-hybrid.c
>> index f51ccaac60ee..5c490b5201b7 100644
>> --- a/tools/perf/util/pmu-hybrid.c
>> +++ b/tools/perf/util/pmu-hybrid.c
>> @@ -13,6 +13,7 @@
>> #include <stdarg.h>
>> #include <locale.h>
>> #include <api/fs/fs.h>
>> +#include "util/evlist.h"
>> #include "fncache.h"
>> #include "pmu-hybrid.h"
>>
>> @@ -87,3 +88,21 @@ char *perf_pmu__hybrid_type_to_pmu(const char *type)
>> free(pmu_name);
>> return NULL;
>> }
>> +
>> +int parse_hybrid_type(const struct option *opt, const char *str, int unset __maybe_unused)
>> +{
>> + struct evlist *evlist = *(struct evlist **)opt->value;
>> +
>> + if (!list_empty(&evlist->core.entries)) {
>> + fprintf(stderr, "Must define cputype before events/metrics\n");
>> + return -1;
>> + }
>> +
>> + evlist->hybrid_pmu_name = perf_pmu__hybrid_type_to_pmu(str);
>> + if (!evlist->hybrid_pmu_name) {
>> + fprintf(stderr, "--cputype %s is not supported!\n", str);
>> + return -1;
>> + }
>> +
>> + return 0;
>> +}
>> diff --git a/tools/perf/util/pmu-hybrid.h b/tools/perf/util/pmu-hybrid.h
>> index 2b186c26a43e..26101f134a3a 100644
>> --- a/tools/perf/util/pmu-hybrid.h
>> +++ b/tools/perf/util/pmu-hybrid.h
>> @@ -5,6 +5,7 @@
>> #include <linux/perf_event.h>
>> #include <linux/compiler.h>
>> #include <linux/list.h>
>> +#include <subcmd/parse-options.h>
>> #include <stdbool.h>
>> #include "pmu.h"
>>
>> @@ -18,6 +19,7 @@ bool perf_pmu__hybrid_mounted(const char *name);
>> struct perf_pmu *perf_pmu__find_hybrid_pmu(const char *name);
>> bool perf_pmu__is_hybrid(const char *name);
>> char *perf_pmu__hybrid_type_to_pmu(const char *type);
>> +int parse_hybrid_type(const struct option *opt, const char *str, int unset __maybe_unused);
>>
>> static inline int perf_pmu__hybrid_pmu_num(void)
>> {
>> --
>> 2.25.1
>>
--
Zhengjun Xing
next prev parent reply other threads:[~2022-06-16 8:31 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-15 15:08 [PATCH] perf record: Support "--cputype" option for hybrid events zhengjun.xing
2022-06-15 15:16 ` Ian Rogers
2022-06-16 8:31 ` Xing Zhengjun [this message]
2022-06-16 14:31 ` Liang, Kan
2022-06-21 5:13 ` Xing Zhengjun
2022-07-04 9:10 ` Xing Zhengjun
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=bc4d4c51-27ee-d8ef-a190-e5c7e587447b@linux.intel.com \
--to=zhengjun.xing@linux.intel.com \
--cc=acme@kernel.org \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@intel.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=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.