From: Jiri Olsa <jolsa@kernel.org>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
Ingo Molnar <mingo@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Michael Petlan <mpetlan@redhat.com>,
Ian Rogers <irogers@google.com>,
Stephane Eranian <eranian@google.com>,
Andi Kleen <ak@linux.intel.com>
Subject: [PATCH 04/14] perf tools: Add fake pmu support
Date: Mon, 25 May 2020 00:42:09 +0200 [thread overview]
Message-ID: <20200524224219.234847-5-jolsa@kernel.org> (raw)
In-Reply-To: <20200524224219.234847-1-jolsa@kernel.org>
Adding the way to create pmu event without the actual
PMU being in place. This way we can test metrics defined
for any processors.
The interface is to define fake_pmu in struct parse_events_state
data. It will be used only in tests via special interface
function added in following changes.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/util/parse-events.c | 14 ++++++++++---
tools/perf/util/parse-events.h | 3 ++-
tools/perf/util/parse-events.l | 8 ++++++--
tools/perf/util/parse-events.y | 37 ++++++++++++++++++++++++++++++++--
4 files changed, 54 insertions(+), 8 deletions(-)
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 27b8e49d690e..8304f9b6e6be 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1415,6 +1415,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
bool auto_merge_stats,
bool use_alias)
{
+ bool is_fake = parse_state->fake_pmu;
struct perf_event_attr attr;
struct perf_pmu_info info;
struct perf_pmu *pmu;
@@ -1436,7 +1437,14 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
fprintf(stderr, "' that may result in non-fatal errors\n");
}
- pmu = perf_pmu__find(name);
+ if (is_fake) {
+ static struct perf_pmu fake_pmu = { };
+
+ pmu = &fake_pmu;
+ } else {
+ pmu = perf_pmu__find(name);
+ }
+
if (!pmu) {
char *err_str;
@@ -1469,7 +1477,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
}
}
- if (perf_pmu__check_alias(pmu, head_config, &info))
+ if (!is_fake && perf_pmu__check_alias(pmu, head_config, &info))
return -EINVAL;
if (verbose > 1) {
@@ -1502,7 +1510,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
if (pmu->default_config && get_config_chgs(pmu, head_config, &config_terms))
return -ENOMEM;
- if (perf_pmu__config(pmu, &attr, head_config, parse_state->error)) {
+ if (!is_fake && perf_pmu__config(pmu, &attr, head_config, parse_state->error)) {
struct evsel_config_term *pos, *tmp;
list_for_each_entry_safe(pos, tmp, &config_terms, list) {
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index d60510e0609f..963b0ea6c448 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -126,9 +126,10 @@ struct parse_events_state {
int idx;
int nr_groups;
struct parse_events_error *error;
- struct evlist *evlist;
+ struct evlist *evlist;
struct list_head *terms;
int stoken;
+ bool fake_pmu;
};
void parse_events__handle_error(struct parse_events_error *err, int idx,
diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
index 002802e17059..56912c9641f5 100644
--- a/tools/perf/util/parse-events.l
+++ b/tools/perf/util/parse-events.l
@@ -129,12 +129,16 @@ do { \
yyless(0); \
} while (0)
-static int pmu_str_check(yyscan_t scanner)
+static int pmu_str_check(yyscan_t scanner, struct parse_events_state *parse_state)
{
YYSTYPE *yylval = parse_events_get_lval(scanner);
char *text = parse_events_get_text(scanner);
yylval->str = strdup(text);
+
+ if (parse_state->fake_pmu)
+ return PE_PMU_EVENT_FAKE;
+
switch (perf_pmu__parse_check(text)) {
case PMU_EVENT_SYMBOL_PREFIX:
return PE_PMU_EVENT_PRE;
@@ -376,7 +380,7 @@ r{num_raw_hex} { return raw(yyscanner); }
{modifier_event} { return str(yyscanner, PE_MODIFIER_EVENT); }
{bpf_object} { if (!isbpf(yyscanner)) { USER_REJECT }; return str(yyscanner, PE_BPF_OBJECT); }
{bpf_source} { if (!isbpf(yyscanner)) { USER_REJECT }; return str(yyscanner, PE_BPF_SOURCE); }
-{name} { return pmu_str_check(yyscanner); }
+{name} { return pmu_str_check(yyscanner, _parse_state); }
{name_tag} { return str(yyscanner, PE_NAME); }
"/" { BEGIN(config); return '/'; }
- { return '-'; }
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index c4ca932d092d..d1b04b8d81ea 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -69,7 +69,7 @@ static void inc_group_count(struct list_head *list,
%token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
%token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
%token PE_ERROR
-%token PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT
+%token PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT PE_PMU_EVENT_FAKE
%token PE_ARRAY_ALL PE_ARRAY_RANGE
%token PE_DRV_CFG_TERM
%type <num> PE_VALUE
@@ -87,7 +87,7 @@ static void inc_group_count(struct list_head *list,
%type <str> PE_MODIFIER_EVENT
%type <str> PE_MODIFIER_BP
%type <str> PE_EVENT_NAME
-%type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT
+%type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT PE_PMU_EVENT_FAKE
%type <str> PE_DRV_CFG_TERM
%destructor { free ($$); } <str>
%type <term> event_term
@@ -356,6 +356,39 @@ PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc
YYABORT;
$$ = list;
}
+|
+PE_PMU_EVENT_FAKE sep_dc
+{
+ struct list_head *list;
+ int err;
+
+ list = alloc_list();
+ if (!list)
+ YYABORT;
+
+ err = parse_events_add_pmu(_parse_state, list, $1, NULL, false, false);
+ free($1);
+ if (err < 0)
+ YYABORT;
+ $$ = list;
+}
+|
+PE_PMU_EVENT_FAKE opt_pmu_config
+{
+ struct list_head *list;
+ int err;
+
+ list = alloc_list();
+ if (!list)
+ YYABORT;
+
+ err = parse_events_add_pmu(_parse_state, list, $1, $2, false, false);
+ free($1);
+ parse_events_terms__delete($2);
+ if (err < 0)
+ YYABORT;
+ $$ = list;
+}
value_sym:
PE_VALUE_SYM_HW
--
2.25.4
next prev parent reply other threads:[~2020-05-24 22:42 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-24 22:42 [RFC 00/14] perf tests: Check on subtest for user specified test Jiri Olsa
2020-05-24 22:42 ` [PATCH 01/14] " Jiri Olsa
2020-05-24 22:42 ` [PATCH 02/14] perf tools: Do not pass avg to generic_metric Jiri Olsa
2020-05-24 22:42 ` [PATCH 03/14] perf tools: Add struct parse_events_state pointer to scanner Jiri Olsa
2020-05-24 22:42 ` Jiri Olsa [this message]
2020-06-01 7:22 ` [PATCH 04/14] perf tools: Add fake pmu support Ian Rogers
2020-06-01 9:06 ` Jiri Olsa
2020-05-24 22:42 ` [PATCH 05/14] perf tools: Add parse_events_fake interface Jiri Olsa
2020-06-01 7:28 ` Ian Rogers
2020-06-01 9:08 ` Jiri Olsa
2020-06-01 15:04 ` Arnaldo Carvalho de Melo
2020-06-01 15:49 ` Jiri Olsa
2020-05-24 22:42 ` [PATCH 06/14] perf tests: Add another pmu-events tests Jiri Olsa
2020-06-01 7:44 ` Ian Rogers
2020-06-01 13:21 ` Jiri Olsa
2020-06-01 16:23 ` Ian Rogers
2020-05-24 22:42 ` [PATCH 07/14] perf tools: Factor out parse_groups function Jiri Olsa
2020-05-24 22:42 ` [PATCH 08/14] perf tools: Add metricgroup__parse_groups_test function Jiri Olsa
2020-05-24 22:42 ` [PATCH 09/14] perf tools: Add fake_pmu to parse_events function Jiri Olsa
2020-05-24 22:42 ` [PATCH 10/14] perf tools: Add map " Jiri Olsa
2020-05-24 22:42 ` [PATCH 11/14] perf tools: Factor out prepare_metric function Jiri Olsa
2020-05-24 22:42 ` [PATCH 12/14] perf tools: Add test_generic_metric function Jiri Olsa
2020-05-24 22:42 ` [PATCH 13/14] perf tests: Add parse metric test for ipc metric Jiri Olsa
2020-06-01 7:55 ` Ian Rogers
2020-06-01 13:09 ` Jiri Olsa
2020-06-01 16:12 ` Ian Rogers
2020-06-01 15:08 ` Arnaldo Carvalho de Melo
2020-06-01 15:49 ` Jiri Olsa
2020-05-24 22:42 ` [PATCH 14/14] perf tests: Add parse metric test for frontend metric Jiri Olsa
2020-06-01 8:06 ` Ian Rogers
2020-06-01 15:08 ` Arnaldo Carvalho de Melo
2020-05-25 12:06 ` [RFC 00/14] perf tests: Check on subtest for user specified test Michael Petlan
2020-05-25 12:35 ` Jiri Olsa
2020-05-25 14:23 ` Arnaldo Carvalho de Melo
2020-05-26 11:15 ` Jiri Olsa
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=20200524224219.234847-5-jolsa@kernel.org \
--to=jolsa@kernel.org \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@kernel.org \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=eranian@google.com \
--cc=irogers@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=mpetlan@redhat.com \
--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).