Commit 14a84c70 authored by James Clark's avatar James Clark Committed by Namhyung Kim
Browse files

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: default avatarLeo Yan <leo.yan@arm.com>
Reviewed-by: default avatarIan Rogers <irogers@google.com>
Tested-by: default avatarLeo Yan <leo.yan@arm.com>
Signed-off-by: default avatarJames Clark <james.clark@linaro.org>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
parent 80cdf208
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -647,6 +647,7 @@ static int test__checkevent_pmu(struct evlist *evlist)
	TEST_ASSERT_EVSEL("wrong config1",    1 == evsel->core.attr.config1, evsel);
	TEST_ASSERT_EVSEL("wrong config2",    3 == evsel->core.attr.config2, evsel);
	TEST_ASSERT_EVSEL("wrong config3",    0 == evsel->core.attr.config3, evsel);
	TEST_ASSERT_EVSEL("wrong config4",    0 == evsel->core.attr.config4, evsel);
	/*
	 * The period value gets configured within evlist__config,
	 * while this test executes only parse events method.
@@ -669,6 +670,7 @@ static int test__checkevent_list(struct evlist *evlist)
		TEST_ASSERT_EVSEL("wrong config1", 0 == evsel->core.attr.config1, evsel);
		TEST_ASSERT_EVSEL("wrong config2", 0 == evsel->core.attr.config2, evsel);
		TEST_ASSERT_EVSEL("wrong config3", 0 == evsel->core.attr.config3, evsel);
		TEST_ASSERT_EVSEL("wrong config4", 0 == evsel->core.attr.config4, evsel);
		TEST_ASSERT_EVSEL("wrong exclude_user", !evsel->core.attr.exclude_user, evsel);
		TEST_ASSERT_EVSEL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel, evsel);
		TEST_ASSERT_EVSEL("wrong exclude_hv", !evsel->core.attr.exclude_hv, evsel);
@@ -849,6 +851,15 @@ static int test__checkterms_simple(struct parse_events_terms *terms)
	TEST_ASSERT_VAL("wrong val", term->val.num == 4);
	TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "config3"));

	/* config4=5 */
	term = list_entry(term->list.next, struct parse_events_term, list);
	TEST_ASSERT_VAL("wrong type term",
			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG4);
	TEST_ASSERT_VAL("wrong type val",
			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
	TEST_ASSERT_VAL("wrong val", term->val.num == 5);
	TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "config4"));

	/* umask=1*/
	term = list_entry(term->list.next, struct parse_events_term, list);
	TEST_ASSERT_VAL("wrong type term",
@@ -2516,7 +2527,7 @@ struct terms_test {

static const struct terms_test test__terms[] = {
	[0] = {
		.str   = "config=10,config1,config2=3,config3=4,umask=1,read,r0xead",
		.str   = "config=10,config1,config2=3,config3=4,config4=5,umask=1,read,r0xead",
		.check = test__checkterms_simple,
	},
};
+11 −0
Original line number Diff line number Diff line
@@ -216,6 +216,8 @@ __add_event(struct list_head *list, int *idx,
						PERF_PMU_FORMAT_VALUE_CONFIG2, "config2");
			perf_pmu__warn_invalid_config(pmu, attr->config3, name,
						PERF_PMU_FORMAT_VALUE_CONFIG3, "config3");
			perf_pmu__warn_invalid_config(pmu, attr->config4, name,
						PERF_PMU_FORMAT_VALUE_CONFIG4, "config4");
		}
	}
	/*
@@ -705,6 +707,7 @@ const char *parse_events__term_type_str(enum parse_events__term_type term_type)
		[PARSE_EVENTS__TERM_TYPE_CONFIG1]		= "config1",
		[PARSE_EVENTS__TERM_TYPE_CONFIG2]		= "config2",
		[PARSE_EVENTS__TERM_TYPE_CONFIG3]		= "config3",
		[PARSE_EVENTS__TERM_TYPE_CONFIG4]		= "config4",
		[PARSE_EVENTS__TERM_TYPE_NAME]			= "name",
		[PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD]		= "period",
		[PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ]		= "freq",
@@ -754,6 +757,7 @@ config_term_avail(enum parse_events__term_type term_type, struct parse_events_er
	case PARSE_EVENTS__TERM_TYPE_CONFIG1:
	case PARSE_EVENTS__TERM_TYPE_CONFIG2:
	case PARSE_EVENTS__TERM_TYPE_CONFIG3:
	case PARSE_EVENTS__TERM_TYPE_CONFIG4:
	case PARSE_EVENTS__TERM_TYPE_NAME:
	case PARSE_EVENTS__TERM_TYPE_METRIC_ID:
	case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
@@ -824,6 +828,10 @@ do { \
		CHECK_TYPE_VAL(NUM);
		attr->config3 = term->val.num;
		break;
	case PARSE_EVENTS__TERM_TYPE_CONFIG4:
		CHECK_TYPE_VAL(NUM);
		attr->config4 = term->val.num;
		break;
	case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
		CHECK_TYPE_VAL(NUM);
		break;
@@ -1069,6 +1077,7 @@ static int config_term_tracepoint(struct perf_event_attr *attr,
	case PARSE_EVENTS__TERM_TYPE_CONFIG1:
	case PARSE_EVENTS__TERM_TYPE_CONFIG2:
	case PARSE_EVENTS__TERM_TYPE_CONFIG3:
	case PARSE_EVENTS__TERM_TYPE_CONFIG4:
	case PARSE_EVENTS__TERM_TYPE_LEGACY_HARDWARE_CONFIG:
	case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE_CONFIG:
	case PARSE_EVENTS__TERM_TYPE_NAME:
@@ -1212,6 +1221,7 @@ do { \
		case PARSE_EVENTS__TERM_TYPE_CONFIG1:
		case PARSE_EVENTS__TERM_TYPE_CONFIG2:
		case PARSE_EVENTS__TERM_TYPE_CONFIG3:
		case PARSE_EVENTS__TERM_TYPE_CONFIG4:
		case PARSE_EVENTS__TERM_TYPE_LEGACY_HARDWARE_CONFIG:
		case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE_CONFIG:
		case PARSE_EVENTS__TERM_TYPE_NAME:
@@ -1250,6 +1260,7 @@ static int get_config_chgs(struct perf_pmu *pmu, struct parse_events_terms *head
		case PARSE_EVENTS__TERM_TYPE_CONFIG1:
		case PARSE_EVENTS__TERM_TYPE_CONFIG2:
		case PARSE_EVENTS__TERM_TYPE_CONFIG3:
		case PARSE_EVENTS__TERM_TYPE_CONFIG4:
		case PARSE_EVENTS__TERM_TYPE_LEGACY_HARDWARE_CONFIG:
		case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE_CONFIG:
		case PARSE_EVENTS__TERM_TYPE_NAME:
+1 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ enum parse_events__term_type {
	PARSE_EVENTS__TERM_TYPE_CONFIG1,
	PARSE_EVENTS__TERM_TYPE_CONFIG2,
	PARSE_EVENTS__TERM_TYPE_CONFIG3,
	PARSE_EVENTS__TERM_TYPE_CONFIG4,
	PARSE_EVENTS__TERM_TYPE_NAME,
	PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD,
	PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ,
+1 −0
Original line number Diff line number Diff line
@@ -287,6 +287,7 @@ 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); }
config4			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG4); }
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); }
+8 −0
Original line number Diff line number Diff line
@@ -1574,6 +1574,10 @@ static int pmu_config_term(const struct perf_pmu *pmu,
			assert(term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
			pmu_format_value(bits, term->val.num, &attr->config3, zero);
			break;
		case PARSE_EVENTS__TERM_TYPE_CONFIG4:
			assert(term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
			pmu_format_value(bits, term->val.num, &attr->config4, zero);
			break;
		case PARSE_EVENTS__TERM_TYPE_LEGACY_HARDWARE_CONFIG:
			assert(term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
			assert(term->val.num < PERF_COUNT_HW_MAX);
@@ -1649,6 +1653,9 @@ static int pmu_config_term(const struct perf_pmu *pmu,
	case PERF_PMU_FORMAT_VALUE_CONFIG3:
		vp = &attr->config3;
		break;
	case PERF_PMU_FORMAT_VALUE_CONFIG4:
		vp = &attr->config4;
		break;
	default:
		return -EINVAL;
	}
@@ -2008,6 +2015,7 @@ int perf_pmu__for_each_format(struct perf_pmu *pmu, void *state, pmu_format_call
		"config1=0..0xffffffffffffffff",
		"config2=0..0xffffffffffffffff",
		"config3=0..0xffffffffffffffff",
		"config4=0..0xffffffffffffffff",
		"legacy-hardware-config=0..9,",
		"legacy-cache-config=0..0xffffff,",
		"name=string",
Loading