mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-07 21:53:44 +00:00
perf tools: Add support for perf_event_attr::config3
perf_event_attr has gained a new field, config3, so add support for it extending the existing configN support. Signed-off-by: Rob Herring <robh@kernel.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: James Clark <james.clark@arm.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Leo Yan <leo.yan@linaro.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lore.kernel.org/lkml/20220914-arm-perf-tool-spe1-2-v2-v5-2-2cf5210b2f77@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
7effbd18e4
commit
204e7c499f
@ -449,6 +449,7 @@ static int test__checkevent_pmu(struct evlist *evlist)
|
||||
TEST_ASSERT_VAL("wrong config", 10 == evsel->core.attr.config);
|
||||
TEST_ASSERT_VAL("wrong config1", 1 == evsel->core.attr.config1);
|
||||
TEST_ASSERT_VAL("wrong config2", 3 == evsel->core.attr.config2);
|
||||
TEST_ASSERT_VAL("wrong config3", 0 == evsel->core.attr.config3);
|
||||
/*
|
||||
* The period value gets configured within evlist__config,
|
||||
* while this test executes only parse events method.
|
||||
@ -470,6 +471,7 @@ static int test__checkevent_list(struct evlist *evlist)
|
||||
TEST_ASSERT_VAL("wrong config", 1 == evsel->core.attr.config);
|
||||
TEST_ASSERT_VAL("wrong config1", 0 == evsel->core.attr.config1);
|
||||
TEST_ASSERT_VAL("wrong config2", 0 == evsel->core.attr.config2);
|
||||
TEST_ASSERT_VAL("wrong config3", 0 == evsel->core.attr.config3);
|
||||
TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
|
||||
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
|
||||
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
|
||||
@ -632,6 +634,15 @@ static int test__checkterms_simple(struct list_head *terms)
|
||||
TEST_ASSERT_VAL("wrong val", term->val.num == 3);
|
||||
TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "config2"));
|
||||
|
||||
/* config3=4 */
|
||||
term = list_entry(term->list.next, struct parse_events_term, list);
|
||||
TEST_ASSERT_VAL("wrong type term",
|
||||
term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG3);
|
||||
TEST_ASSERT_VAL("wrong type val",
|
||||
term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
|
||||
TEST_ASSERT_VAL("wrong val", term->val.num == 4);
|
||||
TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "config3"));
|
||||
|
||||
/* umask=1*/
|
||||
term = list_entry(term->list.next, struct parse_events_term, list);
|
||||
TEST_ASSERT_VAL("wrong type term",
|
||||
@ -2004,7 +2015,7 @@ struct terms_test {
|
||||
|
||||
static const struct terms_test test__terms[] = {
|
||||
[0] = {
|
||||
.str = "config=10,config1,config2=3,umask=1,read,r0xead",
|
||||
.str = "config=10,config1,config2=3,config3=4,umask=1,read,r0xead",
|
||||
.check = test__checkterms_simple,
|
||||
},
|
||||
};
|
||||
|
@ -949,6 +949,7 @@ static const char *config_term_names[__PARSE_EVENTS__TERM_TYPE_NR] = {
|
||||
[PARSE_EVENTS__TERM_TYPE_CONFIG] = "config",
|
||||
[PARSE_EVENTS__TERM_TYPE_CONFIG1] = "config1",
|
||||
[PARSE_EVENTS__TERM_TYPE_CONFIG2] = "config2",
|
||||
[PARSE_EVENTS__TERM_TYPE_CONFIG3] = "config3",
|
||||
[PARSE_EVENTS__TERM_TYPE_NAME] = "name",
|
||||
[PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD] = "period",
|
||||
[PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ] = "freq",
|
||||
@ -988,6 +989,7 @@ config_term_avail(int term_type, struct parse_events_error *err)
|
||||
case PARSE_EVENTS__TERM_TYPE_CONFIG:
|
||||
case PARSE_EVENTS__TERM_TYPE_CONFIG1:
|
||||
case PARSE_EVENTS__TERM_TYPE_CONFIG2:
|
||||
case PARSE_EVENTS__TERM_TYPE_CONFIG3:
|
||||
case PARSE_EVENTS__TERM_TYPE_NAME:
|
||||
case PARSE_EVENTS__TERM_TYPE_METRIC_ID:
|
||||
case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
|
||||
@ -1033,6 +1035,10 @@ do { \
|
||||
CHECK_TYPE_VAL(NUM);
|
||||
attr->config2 = term->val.num;
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_CONFIG3:
|
||||
CHECK_TYPE_VAL(NUM);
|
||||
attr->config3 = term->val.num;
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
|
||||
CHECK_TYPE_VAL(NUM);
|
||||
break;
|
||||
|
@ -59,6 +59,7 @@ enum {
|
||||
PARSE_EVENTS__TERM_TYPE_CONFIG,
|
||||
PARSE_EVENTS__TERM_TYPE_CONFIG1,
|
||||
PARSE_EVENTS__TERM_TYPE_CONFIG2,
|
||||
PARSE_EVENTS__TERM_TYPE_CONFIG3,
|
||||
PARSE_EVENTS__TERM_TYPE_NAME,
|
||||
PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD,
|
||||
PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ,
|
||||
|
@ -285,6 +285,7 @@ modifier_bp [rwx]{1,3}
|
||||
config { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG); }
|
||||
config1 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG1); }
|
||||
config2 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG2); }
|
||||
config3 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG3); }
|
||||
name { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NAME); }
|
||||
period { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); }
|
||||
freq { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ); }
|
||||
|
@ -1209,6 +1209,9 @@ static int pmu_config_term(const char *pmu_name,
|
||||
case PERF_PMU_FORMAT_VALUE_CONFIG2:
|
||||
vp = &attr->config2;
|
||||
break;
|
||||
case PERF_PMU_FORMAT_VALUE_CONFIG3:
|
||||
vp = &attr->config3;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ enum {
|
||||
PERF_PMU_FORMAT_VALUE_CONFIG,
|
||||
PERF_PMU_FORMAT_VALUE_CONFIG1,
|
||||
PERF_PMU_FORMAT_VALUE_CONFIG2,
|
||||
PERF_PMU_FORMAT_VALUE_CONFIG3,
|
||||
PERF_PMU_FORMAT_VALUE_CONFIG_END,
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user