From: Arnaldo Carvalho de Melo <arnaldo.melo@gmail.com>
To: kan.liang@linux.intel.com
Cc: Jiri Olsa <jolsa@kernel.org>, Ingo Molnar <mingo@kernel.org>,
linux-kernel@vger.kernel.org, Andi Kleen <ak@linux.intel.com>,
linux-perf-users@vger.kernel.org,
Namhyung Kim <namhyung@kernel.org>,
Adrian Hunter <adrian.hunter@intel.com>
Subject: Re: [PATCH 2/3] perf parse-regs: Add generic support for non-gprs
Date: Tue, 14 May 2019 15:19:02 -0300 [thread overview]
Message-ID: <20190514181902.GB1756@kernel.org> (raw)
In-Reply-To: <1557844753-58223-2-git-send-email-kan.liang@linux.intel.com>
Em Tue, May 14, 2019 at 07:39:12AM -0700, kan.liang@linux.intel.com escreveu:
> From: Kan Liang <kan.liang@linux.intel.com>
>
> Some non general purpose registers, e.g. XMM, can be collected on some
> platforms, e.g. X86 Icelake.
>
> Add a weak function has_non_gprs_support() to check if the
> kernel/hardware support non-gprs collection.
> Add a weak function non_gprs_mask() to return non-gprs mask.
>
> By default, the non-gprs collection is not support. Specific platforms
> should implement their own non-gprs functions if they can collect
> non-gprs.
>
> Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
> ---
> tools/perf/util/parse-regs-options.c | 10 +++++++++-
> tools/perf/util/perf_regs.c | 10 ++++++++++
> tools/perf/util/perf_regs.h | 2 ++
> 3 files changed, 21 insertions(+), 1 deletion(-)
>
> diff --git a/tools/perf/util/parse-regs-options.c b/tools/perf/util/parse-regs-options.c
> index b21617f..2f90f31 100644
> --- a/tools/perf/util/parse-regs-options.c
> +++ b/tools/perf/util/parse-regs-options.c
> @@ -12,6 +12,7 @@ __parse_regs(const struct option *opt, const char *str, int unset, bool intr)
> const struct sample_reg *r;
> char *s, *os = NULL, *p;
> int ret = -1;
> + bool has_non_gprs = has_non_gprs_support(intr);
This is generic code, what does "non gprs" means for !Intel? Can we come
up with a better, not architecture specific jargon? Or you mean "general
purpose registers"?
Perhaps we can ask for a register mask for use with intr? I.e.:
For the -I/--intr-regs
uint64_t mask = arch__intr_reg_mask();
And for --user-regs
uint64_t mask = arch__user_reg_mask();
And then on that loop do:
for (r = sample_reg_masks; r->name; r++) {
if (r->mask & mask))
fprintf(stderr, "%s ", r->name);
}
?
> if (unset)
> return 0;
> @@ -37,6 +38,8 @@ __parse_regs(const struct option *opt, const char *str, int unset, bool intr)
> if (!strcmp(s, "?")) {
> fprintf(stderr, "available registers: ");
> for (r = sample_reg_masks; r->name; r++) {
> + if (!has_non_gprs && (r->mask & ~PERF_REGS_MASK))
> + break;
> fprintf(stderr, "%s ", r->name);
> }
> fputc('\n', stderr);
> @@ -44,6 +47,8 @@ __parse_regs(const struct option *opt, const char *str, int unset, bool intr)
> return -1;
> }
> for (r = sample_reg_masks; r->name; r++) {
> + if (!has_non_gprs && (r->mask & ~PERF_REGS_MASK))
> + continue;
> if (!strcasecmp(s, r->name))
> break;
> }
> @@ -64,8 +69,11 @@ __parse_regs(const struct option *opt, const char *str, int unset, bool intr)
> ret = 0;
>
> /* default to all possible regs */
> - if (*mode == 0)
> + if (*mode == 0) {
> *mode = PERF_REGS_MASK;
> + if (has_non_gprs)
> + *mode |= non_gprs_mask(intr);
> + }
> error:
> free(os);
> return ret;
> diff --git a/tools/perf/util/perf_regs.c b/tools/perf/util/perf_regs.c
> index 2acfcc5..0d278b6 100644
> --- a/tools/perf/util/perf_regs.c
> +++ b/tools/perf/util/perf_regs.c
> @@ -13,6 +13,16 @@ int __weak arch_sdt_arg_parse_op(char *old_op __maybe_unused,
> return SDT_ARG_SKIP;
> }
>
> +bool __weak has_non_gprs_support(bool intr __maybe_unused)
> +{
> + return false;
> +}
> +
> +u64 __weak non_gprs_mask(bool intr __maybe_unused)
> +{
> + return 0;
> +}
> +
> #ifdef HAVE_PERF_REGS_SUPPORT
> int perf_reg_value(u64 *valp, struct regs_dump *regs, int id)
> {
> diff --git a/tools/perf/util/perf_regs.h b/tools/perf/util/perf_regs.h
> index 1a15a4b..983b4e6 100644
> --- a/tools/perf/util/perf_regs.h
> +++ b/tools/perf/util/perf_regs.h
> @@ -23,6 +23,8 @@ enum {
> };
>
> int arch_sdt_arg_parse_op(char *old_op, char **new_op);
> +bool has_non_gprs_support(bool intr);
> +u64 non_gprs_mask(bool intr);
>
> #ifdef HAVE_PERF_REGS_SUPPORT
> #include <perf_regs.h>
> --
> 2.7.4
--
- Arnaldo
next prev parent reply other threads:[~2019-05-14 18:19 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-14 14:39 [PATCH 1/3] perf parse-regs: Split parse_regs kan.liang
2019-05-14 14:39 ` [PATCH 2/3] perf parse-regs: Add generic support for non-gprs kan.liang
2019-05-14 18:19 ` Arnaldo Carvalho de Melo [this message]
2019-05-14 19:25 ` Liang, Kan
2019-05-14 19:34 ` Arnaldo Carvalho de Melo
2019-05-14 14:39 ` [PATCH 3/3] perf regs x86: Add X86 " kan.liang
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=20190514181902.GB1756@kernel.org \
--to=arnaldo.melo@gmail.com \
--cc=adrian.hunter@intel.com \
--cc=ak@linux.intel.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@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 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.