xref: /openbmc/linux/tools/perf/tests/evsel-roundtrip-name.c (revision cfffae2ef7029d38e71d337fbc2a9c6cf1fa5aaf)
1*cfffae2eSJiri Olsa #include "evlist.h"
2*cfffae2eSJiri Olsa #include "evsel.h"
3*cfffae2eSJiri Olsa #include "parse-events.h"
4*cfffae2eSJiri Olsa #include "tests.h"
5*cfffae2eSJiri Olsa 
6*cfffae2eSJiri Olsa static int perf_evsel__roundtrip_cache_name_test(void)
7*cfffae2eSJiri Olsa {
8*cfffae2eSJiri Olsa 	char name[128];
9*cfffae2eSJiri Olsa 	int type, op, err = 0, ret = 0, i, idx;
10*cfffae2eSJiri Olsa 	struct perf_evsel *evsel;
11*cfffae2eSJiri Olsa         struct perf_evlist *evlist = perf_evlist__new(NULL, NULL);
12*cfffae2eSJiri Olsa 
13*cfffae2eSJiri Olsa         if (evlist == NULL)
14*cfffae2eSJiri Olsa                 return -ENOMEM;
15*cfffae2eSJiri Olsa 
16*cfffae2eSJiri Olsa 	for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
17*cfffae2eSJiri Olsa 		for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
18*cfffae2eSJiri Olsa 			/* skip invalid cache type */
19*cfffae2eSJiri Olsa 			if (!perf_evsel__is_cache_op_valid(type, op))
20*cfffae2eSJiri Olsa 				continue;
21*cfffae2eSJiri Olsa 
22*cfffae2eSJiri Olsa 			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
23*cfffae2eSJiri Olsa 				__perf_evsel__hw_cache_type_op_res_name(type, op, i,
24*cfffae2eSJiri Olsa 									name, sizeof(name));
25*cfffae2eSJiri Olsa 				err = parse_events(evlist, name, 0);
26*cfffae2eSJiri Olsa 				if (err)
27*cfffae2eSJiri Olsa 					ret = err;
28*cfffae2eSJiri Olsa 			}
29*cfffae2eSJiri Olsa 		}
30*cfffae2eSJiri Olsa 	}
31*cfffae2eSJiri Olsa 
32*cfffae2eSJiri Olsa 	idx = 0;
33*cfffae2eSJiri Olsa 	evsel = perf_evlist__first(evlist);
34*cfffae2eSJiri Olsa 
35*cfffae2eSJiri Olsa 	for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
36*cfffae2eSJiri Olsa 		for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
37*cfffae2eSJiri Olsa 			/* skip invalid cache type */
38*cfffae2eSJiri Olsa 			if (!perf_evsel__is_cache_op_valid(type, op))
39*cfffae2eSJiri Olsa 				continue;
40*cfffae2eSJiri Olsa 
41*cfffae2eSJiri Olsa 			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
42*cfffae2eSJiri Olsa 				__perf_evsel__hw_cache_type_op_res_name(type, op, i,
43*cfffae2eSJiri Olsa 									name, sizeof(name));
44*cfffae2eSJiri Olsa 				if (evsel->idx != idx)
45*cfffae2eSJiri Olsa 					continue;
46*cfffae2eSJiri Olsa 
47*cfffae2eSJiri Olsa 				++idx;
48*cfffae2eSJiri Olsa 
49*cfffae2eSJiri Olsa 				if (strcmp(perf_evsel__name(evsel), name)) {
50*cfffae2eSJiri Olsa 					pr_debug("%s != %s\n", perf_evsel__name(evsel), name);
51*cfffae2eSJiri Olsa 					ret = -1;
52*cfffae2eSJiri Olsa 				}
53*cfffae2eSJiri Olsa 
54*cfffae2eSJiri Olsa 				evsel = perf_evsel__next(evsel);
55*cfffae2eSJiri Olsa 			}
56*cfffae2eSJiri Olsa 		}
57*cfffae2eSJiri Olsa 	}
58*cfffae2eSJiri Olsa 
59*cfffae2eSJiri Olsa 	perf_evlist__delete(evlist);
60*cfffae2eSJiri Olsa 	return ret;
61*cfffae2eSJiri Olsa }
62*cfffae2eSJiri Olsa 
63*cfffae2eSJiri Olsa static int __perf_evsel__name_array_test(const char *names[], int nr_names)
64*cfffae2eSJiri Olsa {
65*cfffae2eSJiri Olsa 	int i, err;
66*cfffae2eSJiri Olsa 	struct perf_evsel *evsel;
67*cfffae2eSJiri Olsa         struct perf_evlist *evlist = perf_evlist__new(NULL, NULL);
68*cfffae2eSJiri Olsa 
69*cfffae2eSJiri Olsa         if (evlist == NULL)
70*cfffae2eSJiri Olsa                 return -ENOMEM;
71*cfffae2eSJiri Olsa 
72*cfffae2eSJiri Olsa 	for (i = 0; i < nr_names; ++i) {
73*cfffae2eSJiri Olsa 		err = parse_events(evlist, names[i], 0);
74*cfffae2eSJiri Olsa 		if (err) {
75*cfffae2eSJiri Olsa 			pr_debug("failed to parse event '%s', err %d\n",
76*cfffae2eSJiri Olsa 				 names[i], err);
77*cfffae2eSJiri Olsa 			goto out_delete_evlist;
78*cfffae2eSJiri Olsa 		}
79*cfffae2eSJiri Olsa 	}
80*cfffae2eSJiri Olsa 
81*cfffae2eSJiri Olsa 	err = 0;
82*cfffae2eSJiri Olsa 	list_for_each_entry(evsel, &evlist->entries, node) {
83*cfffae2eSJiri Olsa 		if (strcmp(perf_evsel__name(evsel), names[evsel->idx])) {
84*cfffae2eSJiri Olsa 			--err;
85*cfffae2eSJiri Olsa 			pr_debug("%s != %s\n", perf_evsel__name(evsel), names[evsel->idx]);
86*cfffae2eSJiri Olsa 		}
87*cfffae2eSJiri Olsa 	}
88*cfffae2eSJiri Olsa 
89*cfffae2eSJiri Olsa out_delete_evlist:
90*cfffae2eSJiri Olsa 	perf_evlist__delete(evlist);
91*cfffae2eSJiri Olsa 	return err;
92*cfffae2eSJiri Olsa }
93*cfffae2eSJiri Olsa 
94*cfffae2eSJiri Olsa #define perf_evsel__name_array_test(names) \
95*cfffae2eSJiri Olsa 	__perf_evsel__name_array_test(names, ARRAY_SIZE(names))
96*cfffae2eSJiri Olsa 
97*cfffae2eSJiri Olsa int test__perf_evsel__roundtrip_name_test(void)
98*cfffae2eSJiri Olsa {
99*cfffae2eSJiri Olsa 	int err = 0, ret = 0;
100*cfffae2eSJiri Olsa 
101*cfffae2eSJiri Olsa 	err = perf_evsel__name_array_test(perf_evsel__hw_names);
102*cfffae2eSJiri Olsa 	if (err)
103*cfffae2eSJiri Olsa 		ret = err;
104*cfffae2eSJiri Olsa 
105*cfffae2eSJiri Olsa 	err = perf_evsel__name_array_test(perf_evsel__sw_names);
106*cfffae2eSJiri Olsa 	if (err)
107*cfffae2eSJiri Olsa 		ret = err;
108*cfffae2eSJiri Olsa 
109*cfffae2eSJiri Olsa 	err = perf_evsel__roundtrip_cache_name_test();
110*cfffae2eSJiri Olsa 	if (err)
111*cfffae2eSJiri Olsa 		ret = err;
112*cfffae2eSJiri Olsa 
113*cfffae2eSJiri Olsa 	return ret;
114*cfffae2eSJiri Olsa }
115