Root/
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 | static int test__checkevent_pmu_name(struct perf_evlist *evlist) |
413 | { |
414 | struct perf_evsel *evsel; |
415 | |
416 | /* cpu/config=1,name=krava1/u */ |
417 | evsel = list_entry(evlist->entries.next, struct perf_evsel, node); |
418 | TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries); |
419 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type); |
420 | TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config); |
421 | TEST_ASSERT_VAL("wrong name", !strcmp(evsel->name, "krava")); |
422 | |
423 | /* cpu/config=2/" */ |
424 | evsel = list_entry(evsel->node.next, struct perf_evsel, node); |
425 | TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries); |
426 | TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type); |
427 | TEST_ASSERT_VAL("wrong config", 2 == evsel->attr.config); |
428 | TEST_ASSERT_VAL("wrong name", !strcmp(evsel->name, "raw 0x2")); |
429 | |
430 | return 0; |
431 | } |
432 | |
433 | struct test__event_st { |
434 | const char *name; |
435 | __u32 type; |
436 | int (*check)(struct perf_evlist *evlist); |
437 | }; |
438 | |
439 | static struct test__event_st test__events[] = { |
440 | [0] = { |
441 | .name = "syscalls:sys_enter_open", |
442 | .check = test__checkevent_tracepoint, |
443 | }, |
444 | [1] = { |
445 | .name = "syscalls:*", |
446 | .check = test__checkevent_tracepoint_multi, |
447 | }, |
448 | [2] = { |
449 | .name = "r1a", |
450 | .check = test__checkevent_raw, |
451 | }, |
452 | [3] = { |
453 | .name = "1:1", |
454 | .check = test__checkevent_numeric, |
455 | }, |
456 | [4] = { |
457 | .name = "instructions", |
458 | .check = test__checkevent_symbolic_name, |
459 | }, |
460 | [5] = { |
461 | .name = "cycles/period=100000,config2/", |
462 | .check = test__checkevent_symbolic_name_config, |
463 | }, |
464 | [6] = { |
465 | .name = "faults", |
466 | .check = test__checkevent_symbolic_alias, |
467 | }, |
468 | [7] = { |
469 | .name = "L1-dcache-load-miss", |
470 | .check = test__checkevent_genhw, |
471 | }, |
472 | [8] = { |
473 | .name = "mem:0", |
474 | .check = test__checkevent_breakpoint, |
475 | }, |
476 | [9] = { |
477 | .name = "mem:0:x", |
478 | .check = test__checkevent_breakpoint_x, |
479 | }, |
480 | [10] = { |
481 | .name = "mem:0:r", |
482 | .check = test__checkevent_breakpoint_r, |
483 | }, |
484 | [11] = { |
485 | .name = "mem:0:w", |
486 | .check = test__checkevent_breakpoint_w, |
487 | }, |
488 | [12] = { |
489 | .name = "syscalls:sys_enter_open:k", |
490 | .check = test__checkevent_tracepoint_modifier, |
491 | }, |
492 | [13] = { |
493 | .name = "syscalls:*:u", |
494 | .check = test__checkevent_tracepoint_multi_modifier, |
495 | }, |
496 | [14] = { |
497 | .name = "r1a:kp", |
498 | .check = test__checkevent_raw_modifier, |
499 | }, |
500 | [15] = { |
501 | .name = "1:1:hp", |
502 | .check = test__checkevent_numeric_modifier, |
503 | }, |
504 | [16] = { |
505 | .name = "instructions:h", |
506 | .check = test__checkevent_symbolic_name_modifier, |
507 | }, |
508 | [17] = { |
509 | .name = "faults:u", |
510 | .check = test__checkevent_symbolic_alias_modifier, |
511 | }, |
512 | [18] = { |
513 | .name = "L1-dcache-load-miss:kp", |
514 | .check = test__checkevent_genhw_modifier, |
515 | }, |
516 | [19] = { |
517 | .name = "mem:0:u", |
518 | .check = test__checkevent_breakpoint_modifier, |
519 | }, |
520 | [20] = { |
521 | .name = "mem:0:x:k", |
522 | .check = test__checkevent_breakpoint_x_modifier, |
523 | }, |
524 | [21] = { |
525 | .name = "mem:0:r:hp", |
526 | .check = test__checkevent_breakpoint_r_modifier, |
527 | }, |
528 | [22] = { |
529 | .name = "mem:0:w:up", |
530 | .check = test__checkevent_breakpoint_w_modifier, |
531 | }, |
532 | [23] = { |
533 | .name = "r1,syscalls:sys_enter_open:k,1:1:hp", |
534 | .check = test__checkevent_list, |
535 | }, |
536 | [24] = { |
537 | .name = "instructions:G", |
538 | .check = test__checkevent_exclude_host_modifier, |
539 | }, |
540 | [25] = { |
541 | .name = "instructions:H", |
542 | .check = test__checkevent_exclude_guest_modifier, |
543 | }, |
544 | }; |
545 | |
546 | #define TEST__EVENTS_CNT (sizeof(test__events) / sizeof(struct test__event_st)) |
547 | |
548 | static struct test__event_st test__events_pmu[] = { |
549 | [0] = { |
550 | .name = "cpu/config=10,config1,config2=3,period=1000/u", |
551 | .check = test__checkevent_pmu, |
552 | }, |
553 | [1] = { |
554 | .name = "cpu/config=1,name=krava/u,cpu/config=2/u", |
555 | .check = test__checkevent_pmu_name, |
556 | }, |
557 | }; |
558 | |
559 | #define TEST__EVENTS_PMU_CNT (sizeof(test__events_pmu) / \ |
560 | sizeof(struct test__event_st)) |
561 | |
562 | static int test(struct test__event_st *e) |
563 | { |
564 | struct perf_evlist *evlist; |
565 | int ret; |
566 | |
567 | evlist = perf_evlist__new(NULL, NULL); |
568 | if (evlist == NULL) |
569 | return -ENOMEM; |
570 | |
571 | ret = parse_events(evlist, e->name, 0); |
572 | if (ret) { |
573 | pr_debug("failed to parse event '%s', err %d\n", |
574 | e->name, ret); |
575 | return ret; |
576 | } |
577 | |
578 | ret = e->check(evlist); |
579 | perf_evlist__delete(evlist); |
580 | |
581 | return ret; |
582 | } |
583 | |
584 | static int test_events(struct test__event_st *events, unsigned cnt) |
585 | { |
586 | int ret = 0; |
587 | unsigned i; |
588 | |
589 | for (i = 0; i < cnt; i++) { |
590 | struct test__event_st *e = &events[i]; |
591 | |
592 | pr_debug("running test %d '%s'\n", i, e->name); |
593 | ret = test(e); |
594 | if (ret) |
595 | break; |
596 | } |
597 | |
598 | return ret; |
599 | } |
600 | |
601 | static int test_pmu(void) |
602 | { |
603 | struct stat st; |
604 | char path[PATH_MAX]; |
605 | int ret; |
606 | |
607 | snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/format/", |
608 | sysfs_find_mountpoint()); |
609 | |
610 | ret = stat(path, &st); |
611 | if (ret) |
612 | pr_debug("ommiting PMU cpu tests\n"); |
613 | return !ret; |
614 | } |
615 | |
616 | int parse_events__test(void) |
617 | { |
618 | int ret; |
619 | |
620 | ret = test_events(test__events, TEST__EVENTS_CNT); |
621 | if (!ret && test_pmu()) |
622 | ret = test_events(test__events_pmu, TEST__EVENTS_PMU_CNT); |
623 | |
624 | return ret; |
625 | } |
626 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9