Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

perf tools: Add support for perf_event_attr::config4

perf_event_attr has gained a new field, config4, so add support for it
extending the existing configN support.

Reviewed-by: Leo Yan <leo.yan@arm.com>
Reviewed-by: Ian Rogers <irogers@google.com>
Tested-by: Leo Yan <leo.yan@arm.com>
Signed-off-by: James Clark <james.clark@linaro.org>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>

authored by

James Clark and committed by
Namhyung Kim
14a84c70 80cdf208

+34 -1
+12 -1
tools/perf/tests/parse-events.c
··· 647 647 TEST_ASSERT_EVSEL("wrong config1", 1 == evsel->core.attr.config1, evsel); 648 648 TEST_ASSERT_EVSEL("wrong config2", 3 == evsel->core.attr.config2, evsel); 649 649 TEST_ASSERT_EVSEL("wrong config3", 0 == evsel->core.attr.config3, evsel); 650 + TEST_ASSERT_EVSEL("wrong config4", 0 == evsel->core.attr.config4, evsel); 650 651 /* 651 652 * The period value gets configured within evlist__config, 652 653 * while this test executes only parse events method. ··· 670 669 TEST_ASSERT_EVSEL("wrong config1", 0 == evsel->core.attr.config1, evsel); 671 670 TEST_ASSERT_EVSEL("wrong config2", 0 == evsel->core.attr.config2, evsel); 672 671 TEST_ASSERT_EVSEL("wrong config3", 0 == evsel->core.attr.config3, evsel); 672 + TEST_ASSERT_EVSEL("wrong config4", 0 == evsel->core.attr.config4, evsel); 673 673 TEST_ASSERT_EVSEL("wrong exclude_user", !evsel->core.attr.exclude_user, evsel); 674 674 TEST_ASSERT_EVSEL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel, evsel); 675 675 TEST_ASSERT_EVSEL("wrong exclude_hv", !evsel->core.attr.exclude_hv, evsel); ··· 850 848 term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); 851 849 TEST_ASSERT_VAL("wrong val", term->val.num == 4); 852 850 TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "config3")); 851 + 852 + /* config4=5 */ 853 + term = list_entry(term->list.next, struct parse_events_term, list); 854 + TEST_ASSERT_VAL("wrong type term", 855 + term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG4); 856 + TEST_ASSERT_VAL("wrong type val", 857 + term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); 858 + TEST_ASSERT_VAL("wrong val", term->val.num == 5); 859 + TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "config4")); 853 860 854 861 /* umask=1*/ 855 862 term = list_entry(term->list.next, struct parse_events_term, list); ··· 2527 2516 2528 2517 static const struct terms_test test__terms[] = { 2529 2518 [0] = { 2530 - .str = "config=10,config1,config2=3,config3=4,umask=1,read,r0xead", 2519 + .str = "config=10,config1,config2=3,config3=4,config4=5,umask=1,read,r0xead", 2531 2520 .check = test__checkterms_simple, 2532 2521 }, 2533 2522 };
+11
tools/perf/util/parse-events.c
··· 216 216 PERF_PMU_FORMAT_VALUE_CONFIG2, "config2"); 217 217 perf_pmu__warn_invalid_config(pmu, attr->config3, name, 218 218 PERF_PMU_FORMAT_VALUE_CONFIG3, "config3"); 219 + perf_pmu__warn_invalid_config(pmu, attr->config4, name, 220 + PERF_PMU_FORMAT_VALUE_CONFIG4, "config4"); 219 221 } 220 222 } 221 223 /* ··· 707 705 [PARSE_EVENTS__TERM_TYPE_CONFIG1] = "config1", 708 706 [PARSE_EVENTS__TERM_TYPE_CONFIG2] = "config2", 709 707 [PARSE_EVENTS__TERM_TYPE_CONFIG3] = "config3", 708 + [PARSE_EVENTS__TERM_TYPE_CONFIG4] = "config4", 710 709 [PARSE_EVENTS__TERM_TYPE_NAME] = "name", 711 710 [PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD] = "period", 712 711 [PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ] = "freq", ··· 757 754 case PARSE_EVENTS__TERM_TYPE_CONFIG1: 758 755 case PARSE_EVENTS__TERM_TYPE_CONFIG2: 759 756 case PARSE_EVENTS__TERM_TYPE_CONFIG3: 757 + case PARSE_EVENTS__TERM_TYPE_CONFIG4: 760 758 case PARSE_EVENTS__TERM_TYPE_NAME: 761 759 case PARSE_EVENTS__TERM_TYPE_METRIC_ID: 762 760 case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD: ··· 827 823 case PARSE_EVENTS__TERM_TYPE_CONFIG3: 828 824 CHECK_TYPE_VAL(NUM); 829 825 attr->config3 = term->val.num; 826 + break; 827 + case PARSE_EVENTS__TERM_TYPE_CONFIG4: 828 + CHECK_TYPE_VAL(NUM); 829 + attr->config4 = term->val.num; 830 830 break; 831 831 case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD: 832 832 CHECK_TYPE_VAL(NUM); ··· 1077 1069 case PARSE_EVENTS__TERM_TYPE_CONFIG1: 1078 1070 case PARSE_EVENTS__TERM_TYPE_CONFIG2: 1079 1071 case PARSE_EVENTS__TERM_TYPE_CONFIG3: 1072 + case PARSE_EVENTS__TERM_TYPE_CONFIG4: 1080 1073 case PARSE_EVENTS__TERM_TYPE_LEGACY_HARDWARE_CONFIG: 1081 1074 case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE_CONFIG: 1082 1075 case PARSE_EVENTS__TERM_TYPE_NAME: ··· 1221 1212 case PARSE_EVENTS__TERM_TYPE_CONFIG1: 1222 1213 case PARSE_EVENTS__TERM_TYPE_CONFIG2: 1223 1214 case PARSE_EVENTS__TERM_TYPE_CONFIG3: 1215 + case PARSE_EVENTS__TERM_TYPE_CONFIG4: 1224 1216 case PARSE_EVENTS__TERM_TYPE_LEGACY_HARDWARE_CONFIG: 1225 1217 case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE_CONFIG: 1226 1218 case PARSE_EVENTS__TERM_TYPE_NAME: ··· 1260 1250 case PARSE_EVENTS__TERM_TYPE_CONFIG1: 1261 1251 case PARSE_EVENTS__TERM_TYPE_CONFIG2: 1262 1252 case PARSE_EVENTS__TERM_TYPE_CONFIG3: 1253 + case PARSE_EVENTS__TERM_TYPE_CONFIG4: 1263 1254 case PARSE_EVENTS__TERM_TYPE_LEGACY_HARDWARE_CONFIG: 1264 1255 case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE_CONFIG: 1265 1256 case PARSE_EVENTS__TERM_TYPE_NAME:
+1
tools/perf/util/parse-events.h
··· 59 59 PARSE_EVENTS__TERM_TYPE_CONFIG1, 60 60 PARSE_EVENTS__TERM_TYPE_CONFIG2, 61 61 PARSE_EVENTS__TERM_TYPE_CONFIG3, 62 + PARSE_EVENTS__TERM_TYPE_CONFIG4, 62 63 PARSE_EVENTS__TERM_TYPE_NAME, 63 64 PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD, 64 65 PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ,
+1
tools/perf/util/parse-events.l
··· 287 287 config1 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG1); } 288 288 config2 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG2); } 289 289 config3 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG3); } 290 + config4 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG4); } 290 291 name { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NAME); } 291 292 period { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); } 292 293 freq { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ); }
+8
tools/perf/util/pmu.c
··· 1574 1574 assert(term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); 1575 1575 pmu_format_value(bits, term->val.num, &attr->config3, zero); 1576 1576 break; 1577 + case PARSE_EVENTS__TERM_TYPE_CONFIG4: 1578 + assert(term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); 1579 + pmu_format_value(bits, term->val.num, &attr->config4, zero); 1580 + break; 1577 1581 case PARSE_EVENTS__TERM_TYPE_LEGACY_HARDWARE_CONFIG: 1578 1582 assert(term->type_val == PARSE_EVENTS__TERM_TYPE_NUM); 1579 1583 assert(term->val.num < PERF_COUNT_HW_MAX); ··· 1652 1648 break; 1653 1649 case PERF_PMU_FORMAT_VALUE_CONFIG3: 1654 1650 vp = &attr->config3; 1651 + break; 1652 + case PERF_PMU_FORMAT_VALUE_CONFIG4: 1653 + vp = &attr->config4; 1655 1654 break; 1656 1655 default: 1657 1656 return -EINVAL; ··· 2015 2008 "config1=0..0xffffffffffffffff", 2016 2009 "config2=0..0xffffffffffffffff", 2017 2010 "config3=0..0xffffffffffffffff", 2011 + "config4=0..0xffffffffffffffff", 2018 2012 "legacy-hardware-config=0..9,", 2019 2013 "legacy-cache-config=0..0xffffff,", 2020 2014 "name=string",
+1
tools/perf/util/pmu.h
··· 23 23 PERF_PMU_FORMAT_VALUE_CONFIG1, 24 24 PERF_PMU_FORMAT_VALUE_CONFIG2, 25 25 PERF_PMU_FORMAT_VALUE_CONFIG3, 26 + PERF_PMU_FORMAT_VALUE_CONFIG4, 26 27 PERF_PMU_FORMAT_VALUE_CONFIG_END, 27 28 }; 28 29