xref: /openbmc/linux/tools/perf/tests/evsel-roundtrip-name.c (revision d68f0365087395fe232e39ac9c8ee53627522c3c)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2cfffae2eSJiri Olsa #include "evlist.h"
3cfffae2eSJiri Olsa #include "evsel.h"
4cfffae2eSJiri Olsa #include "parse-events.h"
5cfffae2eSJiri Olsa #include "tests.h"
684f5d36fSJiri Olsa #include "debug.h"
7afff9f31SJin Yao #include "pmu.h"
8212f3d97SJin Yao #include "pmu-hybrid.h"
9a43783aeSArnaldo Carvalho de Melo #include <errno.h>
10877a7a11SArnaldo Carvalho de Melo #include <linux/kernel.h>
11cfffae2eSJiri Olsa 
12cfffae2eSJiri Olsa static int perf_evsel__roundtrip_cache_name_test(void)
13cfffae2eSJiri Olsa {
14cfffae2eSJiri Olsa 	char name[128];
15cfffae2eSJiri Olsa 	int type, op, err = 0, ret = 0, i, idx;
1632dcd021SJiri Olsa 	struct evsel *evsel;
170f98b11cSJiri Olsa 	struct evlist *evlist = evlist__new();
18cfffae2eSJiri Olsa 
19cfffae2eSJiri Olsa         if (evlist == NULL)
20cfffae2eSJiri Olsa                 return -ENOMEM;
21cfffae2eSJiri Olsa 
22cfffae2eSJiri Olsa 	for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
23cfffae2eSJiri Olsa 		for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
24cfffae2eSJiri Olsa 			/* skip invalid cache type */
25c754c382SArnaldo Carvalho de Melo 			if (!evsel__is_cache_op_valid(type, op))
26cfffae2eSJiri Olsa 				continue;
27cfffae2eSJiri Olsa 
28cfffae2eSJiri Olsa 			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
298ab2e96dSArnaldo Carvalho de Melo 				__evsel__hw_cache_type_op_res_name(type, op, i, name, sizeof(name));
30b39b8393SJiri Olsa 				err = parse_events(evlist, name, NULL);
31cfffae2eSJiri Olsa 				if (err)
32cfffae2eSJiri Olsa 					ret = err;
33cfffae2eSJiri Olsa 			}
34cfffae2eSJiri Olsa 		}
35cfffae2eSJiri Olsa 	}
36cfffae2eSJiri Olsa 
37cfffae2eSJiri Olsa 	idx = 0;
38515dbe48SJiri Olsa 	evsel = evlist__first(evlist);
39cfffae2eSJiri Olsa 
40cfffae2eSJiri Olsa 	for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
41cfffae2eSJiri Olsa 		for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
42cfffae2eSJiri Olsa 			/* skip invalid cache type */
43c754c382SArnaldo Carvalho de Melo 			if (!evsel__is_cache_op_valid(type, op))
44cfffae2eSJiri Olsa 				continue;
45cfffae2eSJiri Olsa 
46cfffae2eSJiri Olsa 			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
478ab2e96dSArnaldo Carvalho de Melo 				__evsel__hw_cache_type_op_res_name(type, op, i, name, sizeof(name));
4838fe0e01SJiri Olsa 				if (evsel->core.idx != idx)
49cfffae2eSJiri Olsa 					continue;
50cfffae2eSJiri Olsa 
51cfffae2eSJiri Olsa 				++idx;
52cfffae2eSJiri Olsa 
538ab2e96dSArnaldo Carvalho de Melo 				if (strcmp(evsel__name(evsel), name)) {
548ab2e96dSArnaldo Carvalho de Melo 					pr_debug("%s != %s\n", evsel__name(evsel), name);
55cfffae2eSJiri Olsa 					ret = -1;
56cfffae2eSJiri Olsa 				}
57cfffae2eSJiri Olsa 
58e470daeaSArnaldo Carvalho de Melo 				evsel = evsel__next(evsel);
59cfffae2eSJiri Olsa 			}
60cfffae2eSJiri Olsa 		}
61cfffae2eSJiri Olsa 	}
62cfffae2eSJiri Olsa 
63c12995a5SJiri Olsa 	evlist__delete(evlist);
64cfffae2eSJiri Olsa 	return ret;
65cfffae2eSJiri Olsa }
66cfffae2eSJiri Olsa 
67afff9f31SJin Yao static int __perf_evsel__name_array_test(const char *names[], int nr_names,
68afff9f31SJin Yao 					 int distance)
69cfffae2eSJiri Olsa {
70cfffae2eSJiri Olsa 	int i, err;
7132dcd021SJiri Olsa 	struct evsel *evsel;
720f98b11cSJiri Olsa 	struct evlist *evlist = evlist__new();
73cfffae2eSJiri Olsa 
74cfffae2eSJiri Olsa         if (evlist == NULL)
75cfffae2eSJiri Olsa                 return -ENOMEM;
76cfffae2eSJiri Olsa 
77cfffae2eSJiri Olsa 	for (i = 0; i < nr_names; ++i) {
78b39b8393SJiri Olsa 		err = parse_events(evlist, names[i], NULL);
79cfffae2eSJiri Olsa 		if (err) {
80cfffae2eSJiri Olsa 			pr_debug("failed to parse event '%s', err %d\n",
81cfffae2eSJiri Olsa 				 names[i], err);
82cfffae2eSJiri Olsa 			goto out_delete_evlist;
83cfffae2eSJiri Olsa 		}
84cfffae2eSJiri Olsa 	}
85cfffae2eSJiri Olsa 
86cfffae2eSJiri Olsa 	err = 0;
87e5cadb93SArnaldo Carvalho de Melo 	evlist__for_each_entry(evlist, evsel) {
8838fe0e01SJiri Olsa 		if (strcmp(evsel__name(evsel), names[evsel->core.idx / distance])) {
89cfffae2eSJiri Olsa 			--err;
9038fe0e01SJiri Olsa 			pr_debug("%s != %s\n", evsel__name(evsel), names[evsel->core.idx / distance]);
91cfffae2eSJiri Olsa 		}
92cfffae2eSJiri Olsa 	}
93cfffae2eSJiri Olsa 
94cfffae2eSJiri Olsa out_delete_evlist:
95c12995a5SJiri Olsa 	evlist__delete(evlist);
96cfffae2eSJiri Olsa 	return err;
97cfffae2eSJiri Olsa }
98cfffae2eSJiri Olsa 
99afff9f31SJin Yao #define perf_evsel__name_array_test(names, distance) \
100afff9f31SJin Yao 	__perf_evsel__name_array_test(names, ARRAY_SIZE(names), distance)
101cfffae2eSJiri Olsa 
102*d68f0365SIan Rogers static int test__perf_evsel__roundtrip_name_test(struct test *test __maybe_unused,
103*d68f0365SIan Rogers 						 int subtest __maybe_unused)
104cfffae2eSJiri Olsa {
105cfffae2eSJiri Olsa 	int err = 0, ret = 0;
106cfffae2eSJiri Olsa 
107212f3d97SJin Yao 	if (perf_pmu__has_hybrid() && perf_pmu__hybrid_mounted("cpu_atom"))
108afff9f31SJin Yao 		return perf_evsel__name_array_test(evsel__hw_names, 2);
109afff9f31SJin Yao 
110afff9f31SJin Yao 	err = perf_evsel__name_array_test(evsel__hw_names, 1);
111cfffae2eSJiri Olsa 	if (err)
112cfffae2eSJiri Olsa 		ret = err;
113cfffae2eSJiri Olsa 
114afff9f31SJin Yao 	err = __perf_evsel__name_array_test(evsel__sw_names, PERF_COUNT_SW_DUMMY + 1, 1);
115cfffae2eSJiri Olsa 	if (err)
116cfffae2eSJiri Olsa 		ret = err;
117cfffae2eSJiri Olsa 
118cfffae2eSJiri Olsa 	err = perf_evsel__roundtrip_cache_name_test();
119cfffae2eSJiri Olsa 	if (err)
120cfffae2eSJiri Olsa 		ret = err;
121cfffae2eSJiri Olsa 
122cfffae2eSJiri Olsa 	return ret;
123cfffae2eSJiri Olsa }
124*d68f0365SIan Rogers 
125*d68f0365SIan Rogers DEFINE_SUITE("Roundtrip evsel->name", perf_evsel__roundtrip_name_test);
126