perf tools: Add support for perf_event_attr::config3
authorRob Herring <robh@kernel.org>
Fri, 17 Feb 2023 22:32:11 +0000 (16:32 -0600)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 21 Mar 2023 13:06:08 +0000 (10:06 -0300)
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>
tools/perf/tests/parse-events.c
tools/perf/util/parse-events.c
tools/perf/util/parse-events.h
tools/perf/util/parse-events.l
tools/perf/util/pmu.c
tools/perf/util/pmu.h

index b1c2f0a..6eb1400 100644 (file)
@@ -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,
        },
 };
index 6c5cf52..cc8e876 100644 (file)
@@ -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;
index 46204c1..86ad443 100644 (file)
@@ -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,
index 3a9ce96..51fe0a9 100644 (file)
@@ -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); }
index 45d9b8e..e3aae73 100644 (file)
@@ -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;
        }
index 6b770f1..24cf69a 100644 (file)
@@ -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,
 };