diff options
author | Jiri Olsa <jolsa@redhat.com> | 2012-05-21 03:12:49 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-05-22 10:19:16 -0400 |
commit | f50246e2e2e33aacc68ac3ec41cf2d6a08860bc4 (patch) | |
tree | 68421df5c4808a0163d59a47c91e8fe4fe09f894 /tools/perf/util/parse-events-test.c | |
parent | 73787190d04a34e6da745da893b3ae8bedde418f (diff) |
perf test: Move parse event automated tests to separated object
Moving event parsing specific tests into separated file:
util/parse-events-test.c
Also changing the code a bit to ease running separate tests.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1337584373-2741-2-git-send-email-jolsa@redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/parse-events-test.c')
-rw-r--r-- | tools/perf/util/parse-events-test.c | 600 |
1 files changed, 600 insertions, 0 deletions
diff --git a/tools/perf/util/parse-events-test.c b/tools/perf/util/parse-events-test.c new file mode 100644 index 000000000000..2e8f435384a6 --- /dev/null +++ b/tools/perf/util/parse-events-test.c | |||
@@ -0,0 +1,600 @@ | |||
1 | |||
2 | #include "parse-events.h" | ||
3 | #include "evsel.h" | ||
4 | #include "evlist.h" | ||
5 | #include "sysfs.h" | ||
6 | #include "../../../include/linux/hw_breakpoint.h" | ||
7 | |||
8 | #define TEST_ASSERT_VAL(text, cond) \ | ||
9 | do { \ | ||
10 | if (!(cond)) { \ | ||
11 | pr_debug("FAILED %s:%d %s\n", __FILE__, __LINE__, text); \ | ||
12 | return -1; \ | ||
13 | } \ | ||
14 | } while (0) | ||
15 | |||
16 | static int test__checkevent_tracepoint(struct perf_evlist *evlist) | ||
17 | { | ||
18 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
19 | struct perf_evsel, node); | ||
20 | |||
21 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); | ||
22 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type); | ||
23 | TEST_ASSERT_VAL("wrong sample_type", | ||
24 | (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | PERF_SAMPLE_CPU) == | ||
25 | evsel->attr.sample_type); | ||
26 | TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period); | ||
27 | return 0; | ||
28 | } | ||
29 | |||
30 | static int test__checkevent_tracepoint_multi(struct perf_evlist *evlist) | ||
31 | { | ||
32 | struct perf_evsel *evsel; | ||
33 | |||
34 | TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1); | ||
35 | |||
36 | list_for_each_entry(evsel, &evlist->entries, node) { | ||
37 | TEST_ASSERT_VAL("wrong type", | ||
38 | PERF_TYPE_TRACEPOINT == evsel->attr.type); | ||
39 | TEST_ASSERT_VAL("wrong sample_type", | ||
40 | (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | PERF_SAMPLE_CPU) | ||
41 | == evsel->attr.sample_type); | ||
42 | TEST_ASSERT_VAL("wrong sample_period", | ||
43 | 1 == evsel->attr.sample_period); | ||
44 | } | ||
45 | return 0; | ||
46 | } | ||
47 | |||
48 | static int test__checkevent_raw(struct perf_evlist *evlist) | ||
49 | { | ||
50 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
51 | struct perf_evsel, node); | ||
52 | |||
53 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); | ||
54 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type); | ||
55 | TEST_ASSERT_VAL("wrong config", 0x1a == evsel->attr.config); | ||
56 | return 0; | ||
57 | } | ||
58 | |||
59 | static int test__checkevent_numeric(struct perf_evlist *evlist) | ||
60 | { | ||
61 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
62 | struct perf_evsel, node); | ||
63 | |||
64 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); | ||
65 | TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type); | ||
66 | TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config); | ||
67 | return 0; | ||
68 | } | ||
69 | |||
70 | static int test__checkevent_symbolic_name(struct perf_evlist *evlist) | ||
71 | { | ||
72 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
73 | struct perf_evsel, node); | ||
74 | |||
75 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); | ||
76 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type); | ||
77 | TEST_ASSERT_VAL("wrong config", | ||
78 | PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config); | ||
79 | return 0; | ||
80 | } | ||
81 | |||
82 | static int test__checkevent_symbolic_name_config(struct perf_evlist *evlist) | ||
83 | { | ||
84 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
85 | struct perf_evsel, node); | ||
86 | |||
87 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); | ||
88 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type); | ||
89 | TEST_ASSERT_VAL("wrong config", | ||
90 | PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config); | ||
91 | TEST_ASSERT_VAL("wrong period", | ||
92 | 100000 == evsel->attr.sample_period); | ||
93 | TEST_ASSERT_VAL("wrong config1", | ||
94 | 0 == evsel->attr.config1); | ||
95 | TEST_ASSERT_VAL("wrong config2", | ||
96 | 1 == evsel->attr.config2); | ||
97 | return 0; | ||
98 | } | ||
99 | |||
100 | static int test__checkevent_symbolic_alias(struct perf_evlist *evlist) | ||
101 | { | ||
102 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
103 | struct perf_evsel, node); | ||
104 | |||
105 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); | ||
106 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type); | ||
107 | TEST_ASSERT_VAL("wrong config", | ||
108 | PERF_COUNT_SW_PAGE_FAULTS == evsel->attr.config); | ||
109 | return 0; | ||
110 | } | ||
111 | |||
112 | static int test__checkevent_genhw(struct perf_evlist *evlist) | ||
113 | { | ||
114 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
115 | struct perf_evsel, node); | ||
116 | |||
117 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); | ||
118 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->attr.type); | ||
119 | TEST_ASSERT_VAL("wrong config", (1 << 16) == evsel->attr.config); | ||
120 | return 0; | ||
121 | } | ||
122 | |||
123 | static int test__checkevent_breakpoint(struct perf_evlist *evlist) | ||
124 | { | ||
125 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
126 | struct perf_evsel, node); | ||
127 | |||
128 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); | ||
129 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type); | ||
130 | TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config); | ||
131 | TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) == | ||
132 | evsel->attr.bp_type); | ||
133 | TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_4 == | ||
134 | evsel->attr.bp_len); | ||
135 | return 0; | ||
136 | } | ||
137 | |||
138 | static int test__checkevent_breakpoint_x(struct perf_evlist *evlist) | ||
139 | { | ||
140 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
141 | struct perf_evsel, node); | ||
142 | |||
143 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); | ||
144 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type); | ||
145 | TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config); | ||
146 | TEST_ASSERT_VAL("wrong bp_type", | ||
147 | HW_BREAKPOINT_X == evsel->attr.bp_type); | ||
148 | TEST_ASSERT_VAL("wrong bp_len", sizeof(long) == evsel->attr.bp_len); | ||
149 | return 0; | ||
150 | } | ||
151 | |||
152 | static int test__checkevent_breakpoint_r(struct perf_evlist *evlist) | ||
153 | { | ||
154 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
155 | struct perf_evsel, node); | ||
156 | |||
157 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); | ||
158 | TEST_ASSERT_VAL("wrong type", | ||
159 | PERF_TYPE_BREAKPOINT == evsel->attr.type); | ||
160 | TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config); | ||
161 | TEST_ASSERT_VAL("wrong bp_type", | ||
162 | HW_BREAKPOINT_R == evsel->attr.bp_type); | ||
163 | TEST_ASSERT_VAL("wrong bp_len", | ||
164 | HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len); | ||
165 | return 0; | ||
166 | } | ||
167 | |||
168 | static int test__checkevent_breakpoint_w(struct perf_evlist *evlist) | ||
169 | { | ||
170 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
171 | struct perf_evsel, node); | ||
172 | |||
173 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); | ||
174 | TEST_ASSERT_VAL("wrong type", | ||
175 | PERF_TYPE_BREAKPOINT == evsel->attr.type); | ||
176 | TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config); | ||
177 | TEST_ASSERT_VAL("wrong bp_type", | ||
178 | HW_BREAKPOINT_W == evsel->attr.bp_type); | ||
179 | TEST_ASSERT_VAL("wrong bp_len", | ||
180 | HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len); | ||
181 | return 0; | ||
182 | } | ||
183 | |||
184 | static int test__checkevent_tracepoint_modifier(struct perf_evlist *evlist) | ||
185 | { | ||
186 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
187 | struct perf_evsel, node); | ||
188 | |||
189 | TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); | ||
190 | TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); | ||
191 | TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); | ||
192 | TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); | ||
193 | |||
194 | return test__checkevent_tracepoint(evlist); | ||
195 | } | ||
196 | |||
197 | static int | ||
198 | test__checkevent_tracepoint_multi_modifier(struct perf_evlist *evlist) | ||
199 | { | ||
200 | struct perf_evsel *evsel; | ||
201 | |||
202 | TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1); | ||
203 | |||
204 | list_for_each_entry(evsel, &evlist->entries, node) { | ||
205 | TEST_ASSERT_VAL("wrong exclude_user", | ||
206 | !evsel->attr.exclude_user); | ||
207 | TEST_ASSERT_VAL("wrong exclude_kernel", | ||
208 | evsel->attr.exclude_kernel); | ||
209 | TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); | ||
210 | TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); | ||
211 | } | ||
212 | |||
213 | return test__checkevent_tracepoint_multi(evlist); | ||
214 | } | ||
215 | |||
216 | static int test__checkevent_raw_modifier(struct perf_evlist *evlist) | ||
217 | { | ||
218 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
219 | struct perf_evsel, node); | ||
220 | |||
221 | TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); | ||
222 | TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); | ||
223 | TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); | ||
224 | TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); | ||
225 | |||
226 | return test__checkevent_raw(evlist); | ||
227 | } | ||
228 | |||
229 | static int test__checkevent_numeric_modifier(struct perf_evlist *evlist) | ||
230 | { | ||
231 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
232 | struct perf_evsel, node); | ||
233 | |||
234 | TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); | ||
235 | TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); | ||
236 | TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); | ||
237 | TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); | ||
238 | |||
239 | return test__checkevent_numeric(evlist); | ||
240 | } | ||
241 | |||
242 | static int test__checkevent_symbolic_name_modifier(struct perf_evlist *evlist) | ||
243 | { | ||
244 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
245 | struct perf_evsel, node); | ||
246 | |||
247 | TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); | ||
248 | TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); | ||
249 | TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); | ||
250 | TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); | ||
251 | |||
252 | return test__checkevent_symbolic_name(evlist); | ||
253 | } | ||
254 | |||
255 | static int test__checkevent_exclude_host_modifier(struct perf_evlist *evlist) | ||
256 | { | ||
257 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
258 | struct perf_evsel, node); | ||
259 | |||
260 | TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest); | ||
261 | TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host); | ||
262 | |||
263 | return test__checkevent_symbolic_name(evlist); | ||
264 | } | ||
265 | |||
266 | static int test__checkevent_exclude_guest_modifier(struct perf_evlist *evlist) | ||
267 | { | ||
268 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
269 | struct perf_evsel, node); | ||
270 | |||
271 | TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest); | ||
272 | TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); | ||
273 | |||
274 | return test__checkevent_symbolic_name(evlist); | ||
275 | } | ||
276 | |||
277 | static int test__checkevent_symbolic_alias_modifier(struct perf_evlist *evlist) | ||
278 | { | ||
279 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
280 | struct perf_evsel, node); | ||
281 | |||
282 | TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); | ||
283 | TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); | ||
284 | TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); | ||
285 | TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); | ||
286 | |||
287 | return test__checkevent_symbolic_alias(evlist); | ||
288 | } | ||
289 | |||
290 | static int test__checkevent_genhw_modifier(struct perf_evlist *evlist) | ||
291 | { | ||
292 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
293 | struct perf_evsel, node); | ||
294 | |||
295 | TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); | ||
296 | TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); | ||
297 | TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); | ||
298 | TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); | ||
299 | |||
300 | return test__checkevent_genhw(evlist); | ||
301 | } | ||
302 | |||
303 | static int test__checkevent_breakpoint_modifier(struct perf_evlist *evlist) | ||
304 | { | ||
305 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
306 | struct perf_evsel, node); | ||
307 | |||
308 | TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); | ||
309 | TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); | ||
310 | TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); | ||
311 | TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); | ||
312 | |||
313 | return test__checkevent_breakpoint(evlist); | ||
314 | } | ||
315 | |||
316 | static int test__checkevent_breakpoint_x_modifier(struct perf_evlist *evlist) | ||
317 | { | ||
318 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
319 | struct perf_evsel, node); | ||
320 | |||
321 | TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); | ||
322 | TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); | ||
323 | TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); | ||
324 | TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); | ||
325 | |||
326 | return test__checkevent_breakpoint_x(evlist); | ||
327 | } | ||
328 | |||
329 | static int test__checkevent_breakpoint_r_modifier(struct perf_evlist *evlist) | ||
330 | { | ||
331 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
332 | struct perf_evsel, node); | ||
333 | |||
334 | TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); | ||
335 | TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); | ||
336 | TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); | ||
337 | TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); | ||
338 | |||
339 | return test__checkevent_breakpoint_r(evlist); | ||
340 | } | ||
341 | |||
342 | static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist) | ||
343 | { | ||
344 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
345 | struct perf_evsel, node); | ||
346 | |||
347 | TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); | ||
348 | TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); | ||
349 | TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); | ||
350 | TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); | ||
351 | |||
352 | return test__checkevent_breakpoint_w(evlist); | ||
353 | } | ||
354 | |||
355 | static int test__checkevent_pmu(struct perf_evlist *evlist) | ||
356 | { | ||
357 | |||
358 | struct perf_evsel *evsel = list_entry(evlist->entries.next, | ||
359 | struct perf_evsel, node); | ||
360 | |||
361 | TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); | ||
362 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type); | ||
363 | TEST_ASSERT_VAL("wrong config", 10 == evsel->attr.config); | ||
364 | TEST_ASSERT_VAL("wrong config1", 1 == evsel->attr.config1); | ||
365 | TEST_ASSERT_VAL("wrong config2", 3 == evsel->attr.config2); | ||
366 | TEST_ASSERT_VAL("wrong period", 1000 == evsel->attr.sample_period); | ||
367 | |||
368 | return 0; | ||
369 | } | ||
370 | |||
371 | static int test__checkevent_list(struct perf_evlist *evlist) | ||
372 | { | ||
373 | struct perf_evsel *evsel; | ||
374 | |||
375 | TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries); | ||
376 | |||
377 | /* r1 */ | ||
378 | evsel = list_entry(evlist->entries.next, struct perf_evsel, node); | ||
379 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type); | ||
380 | TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config); | ||
381 | TEST_ASSERT_VAL("wrong config1", 0 == evsel->attr.config1); | ||
382 | TEST_ASSERT_VAL("wrong config2", 0 == evsel->attr.config2); | ||
383 | TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); | ||
384 | TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); | ||
385 | TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); | ||
386 | TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); | ||
387 | |||
388 | /* syscalls:sys_enter_open:k */ | ||
389 | evsel = list_entry(evsel->node.next, struct perf_evsel, node); | ||
390 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type); | ||
391 | TEST_ASSERT_VAL("wrong sample_type", | ||
392 | (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | PERF_SAMPLE_CPU) == | ||
393 | evsel->attr.sample_type); | ||
394 | TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period); | ||
395 | TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); | ||
396 | TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); | ||
397 | TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); | ||
398 | TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); | ||
399 | |||
400 | /* 1:1:hp */ | ||
401 | evsel = list_entry(evsel->node.next, struct perf_evsel, node); | ||
402 | TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type); | ||
403 | TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config); | ||
404 | TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); | ||
405 | TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); | ||
406 | TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); | ||
407 | TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); | ||
408 | |||
409 | return 0; | ||
410 | } | ||
411 | |||
412 | struct test__event_st { | ||
413 | const char *name; | ||
414 | __u32 type; | ||
415 | int (*check)(struct perf_evlist *evlist); | ||
416 | }; | ||
417 | |||
418 | static struct test__event_st test__events[] = { | ||
419 | [0] = { | ||
420 | .name = "syscalls:sys_enter_open", | ||
421 | .check = test__checkevent_tracepoint, | ||
422 | }, | ||
423 | [1] = { | ||
424 | .name = "syscalls:*", | ||
425 | .check = test__checkevent_tracepoint_multi, | ||
426 | }, | ||
427 | [2] = { | ||
428 | .name = "r1a", | ||
429 | .check = test__checkevent_raw, | ||
430 | }, | ||
431 | [3] = { | ||
432 | .name = "1:1", | ||
433 | .check = test__checkevent_numeric, | ||
434 | }, | ||
435 | [4] = { | ||
436 | .name = "instructions", | ||
437 | .check = test__checkevent_symbolic_name, | ||
438 | }, | ||
439 | [5] = { | ||
440 | .name = "cycles/period=100000,config2/", | ||
441 | .check = test__checkevent_symbolic_name_config, | ||
442 | }, | ||
443 | [6] = { | ||
444 | .name = "faults", | ||
445 | .check = test__checkevent_symbolic_alias, | ||
446 | }, | ||
447 | [7] = { | ||
448 | .name = "L1-dcache-load-miss", | ||
449 | .check = test__checkevent_genhw, | ||
450 | }, | ||
451 | [8] = { | ||
452 | .name = "mem:0", | ||
453 | .check = test__checkevent_breakpoint, | ||
454 | }, | ||
455 | [9] = { | ||
456 | .name = "mem:0:x", | ||
457 | .check = test__checkevent_breakpoint_x, | ||
458 | }, | ||
459 | [10] = { | ||
460 | .name = "mem:0:r", | ||
461 | .check = test__checkevent_breakpoint_r, | ||
462 | }, | ||
463 | [11] = { | ||
464 | .name = "mem:0:w", | ||
465 | .check = test__checkevent_breakpoint_w, | ||
466 | }, | ||
467 | [12] = { | ||
468 | .name = "syscalls:sys_enter_open:k", | ||
469 | .check = test__checkevent_tracepoint_modifier, | ||
470 | }, | ||
471 | [13] = { | ||
472 | .name = "syscalls:*:u", | ||
473 | .check = test__checkevent_tracepoint_multi_modifier, | ||
474 | }, | ||
475 | [14] = { | ||
476 | .name = "r1a:kp", | ||
477 | .check = test__checkevent_raw_modifier, | ||
478 | }, | ||
479 | [15] = { | ||
480 | .name = "1:1:hp", | ||
481 | .check = test__checkevent_numeric_modifier, | ||
482 | }, | ||
483 | [16] = { | ||
484 | .name = "instructions:h", | ||
485 | .check = test__checkevent_symbolic_name_modifier, | ||
486 | }, | ||
487 | [17] = { | ||
488 | .name = "faults:u", | ||
489 | .check = test__checkevent_symbolic_alias_modifier, | ||
490 | }, | ||
491 | [18] = { | ||
492 | .name = "L1-dcache-load-miss:kp", | ||
493 | .check = test__checkevent_genhw_modifier, | ||
494 | }, | ||
495 | [19] = { | ||
496 | .name = "mem:0:u", | ||
497 | .check = test__checkevent_breakpoint_modifier, | ||
498 | }, | ||
499 | [20] = { | ||
500 | .name = "mem:0:x:k", | ||
501 | .check = test__checkevent_breakpoint_x_modifier, | ||
502 | }, | ||
503 | [21] = { | ||
504 | .name = "mem:0:r:hp", | ||
505 | .check = test__checkevent_breakpoint_r_modifier, | ||
506 | }, | ||
507 | [22] = { | ||
508 | .name = "mem:0:w:up", | ||
509 | .check = test__checkevent_breakpoint_w_modifier, | ||
510 | }, | ||
511 | [23] = { | ||
512 | .name = "r1,syscalls:sys_enter_open:k,1:1:hp", | ||
513 | .check = test__checkevent_list, | ||
514 | }, | ||
515 | [24] = { | ||
516 | .name = "instructions:G", | ||
517 | .check = test__checkevent_exclude_host_modifier, | ||
518 | }, | ||
519 | [25] = { | ||
520 | .name = "instructions:H", | ||
521 | .check = test__checkevent_exclude_guest_modifier, | ||
522 | }, | ||
523 | }; | ||
524 | |||
525 | #define TEST__EVENTS_CNT (sizeof(test__events) / sizeof(struct test__event_st)) | ||
526 | |||
527 | static struct test__event_st test__events_pmu[] = { | ||
528 | [0] = { | ||
529 | .name = "cpu/config=10,config1,config2=3,period=1000/u", | ||
530 | .check = test__checkevent_pmu, | ||
531 | }, | ||
532 | }; | ||
533 | |||
534 | #define TEST__EVENTS_PMU_CNT (sizeof(test__events_pmu) / \ | ||
535 | sizeof(struct test__event_st)) | ||
536 | |||
537 | static int test(struct test__event_st *e) | ||
538 | { | ||
539 | struct perf_evlist *evlist; | ||
540 | int ret; | ||
541 | |||
542 | evlist = perf_evlist__new(NULL, NULL); | ||
543 | if (evlist == NULL) | ||
544 | return -ENOMEM; | ||
545 | |||
546 | ret = parse_events(evlist, e->name, 0); | ||
547 | if (ret) { | ||
548 | pr_debug("failed to parse event '%s', err %d\n", | ||
549 | e->name, ret); | ||
550 | return ret; | ||
551 | } | ||
552 | |||
553 | ret = e->check(evlist); | ||
554 | perf_evlist__delete(evlist); | ||
555 | |||
556 | return ret; | ||
557 | } | ||
558 | |||
559 | static int test_events(struct test__event_st *events, unsigned cnt) | ||
560 | { | ||
561 | int ret = 0; | ||
562 | unsigned i; | ||
563 | |||
564 | for (i = 0; i < cnt; i++) { | ||
565 | struct test__event_st *e = &events[i]; | ||
566 | |||
567 | pr_debug("running test %d '%s'\n", i, e->name); | ||
568 | ret = test(e); | ||
569 | if (ret) | ||
570 | break; | ||
571 | } | ||
572 | |||
573 | return ret; | ||
574 | } | ||
575 | |||
576 | static int test_pmu(void) | ||
577 | { | ||
578 | struct stat st; | ||
579 | char path[PATH_MAX]; | ||
580 | int ret; | ||
581 | |||
582 | snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/format/", | ||
583 | sysfs_find_mountpoint()); | ||
584 | |||
585 | ret = stat(path, &st); | ||
586 | if (ret) | ||
587 | pr_debug("ommiting PMU cpu tests\n"); | ||
588 | return !ret; | ||
589 | } | ||
590 | |||
591 | int parse_events__test(void) | ||
592 | { | ||
593 | int ret; | ||
594 | |||
595 | ret = test_events(test__events, TEST__EVENTS_CNT); | ||
596 | if (!ret && test_pmu()) | ||
597 | ret = test_events(test__events_pmu, TEST__EVENTS_PMU_CNT); | ||
598 | |||
599 | return ret; | ||
600 | } | ||