1 | // SPDX-License-Identifier: GPL-2.0 |
2 | #include <linux/err.h> |
3 | #include <traceevent/event-parse.h> |
4 | #include "evsel.h" |
5 | #include "tests.h" |
6 | #include "debug.h" |
7 | |
8 | static int evsel__test_field(struct evsel *evsel, const char *name, int size, bool should_be_signed) |
9 | { |
10 | struct tep_format_field *field = evsel__field(evsel, name); |
11 | int is_signed; |
12 | int ret = 0; |
13 | |
14 | if (field == NULL) { |
15 | pr_debug("%s: \"%s\" field not found!\n" , evsel->name, name); |
16 | return -1; |
17 | } |
18 | |
19 | is_signed = !!(field->flags & TEP_FIELD_IS_SIGNED); |
20 | if (should_be_signed && !is_signed) { |
21 | pr_debug("%s: \"%s\" signedness(%d) is wrong, should be %d\n" , |
22 | evsel->name, name, is_signed, should_be_signed); |
23 | ret = -1; |
24 | } |
25 | |
26 | if (field->size != size) { |
27 | pr_debug("%s: \"%s\" size (%d) should be %d!\n" , |
28 | evsel->name, name, field->size, size); |
29 | ret = -1; |
30 | } |
31 | |
32 | return ret; |
33 | } |
34 | |
35 | static int test__perf_evsel__tp_sched_test(struct test_suite *test __maybe_unused, |
36 | int subtest __maybe_unused) |
37 | { |
38 | struct evsel *evsel = evsel__newtp("sched" , "sched_switch" ); |
39 | int ret = 0; |
40 | |
41 | if (IS_ERR(ptr: evsel)) { |
42 | pr_debug("evsel__newtp failed with %ld\n" , PTR_ERR(ptr: evsel)); |
43 | return -1; |
44 | } |
45 | |
46 | if (evsel__test_field(evsel, name: "prev_comm" , size: 16, should_be_signed: false)) |
47 | ret = -1; |
48 | |
49 | if (evsel__test_field(evsel, name: "prev_pid" , size: 4, should_be_signed: true)) |
50 | ret = -1; |
51 | |
52 | if (evsel__test_field(evsel, name: "prev_prio" , size: 4, should_be_signed: true)) |
53 | ret = -1; |
54 | |
55 | if (evsel__test_field(evsel, name: "prev_state" , size: sizeof(long), should_be_signed: true)) |
56 | ret = -1; |
57 | |
58 | if (evsel__test_field(evsel, name: "next_comm" , size: 16, should_be_signed: false)) |
59 | ret = -1; |
60 | |
61 | if (evsel__test_field(evsel, name: "next_pid" , size: 4, should_be_signed: true)) |
62 | ret = -1; |
63 | |
64 | if (evsel__test_field(evsel, name: "next_prio" , size: 4, should_be_signed: true)) |
65 | ret = -1; |
66 | |
67 | evsel__delete(evsel); |
68 | |
69 | evsel = evsel__newtp("sched" , "sched_wakeup" ); |
70 | |
71 | if (IS_ERR(ptr: evsel)) { |
72 | pr_debug("evsel__newtp failed with %ld\n" , PTR_ERR(ptr: evsel)); |
73 | return -1; |
74 | } |
75 | |
76 | if (evsel__test_field(evsel, name: "comm" , size: 16, should_be_signed: false)) |
77 | ret = -1; |
78 | |
79 | if (evsel__test_field(evsel, name: "pid" , size: 4, should_be_signed: true)) |
80 | ret = -1; |
81 | |
82 | if (evsel__test_field(evsel, name: "prio" , size: 4, should_be_signed: true)) |
83 | ret = -1; |
84 | |
85 | if (evsel__test_field(evsel, name: "target_cpu" , size: 4, should_be_signed: true)) |
86 | ret = -1; |
87 | |
88 | evsel__delete(evsel); |
89 | return ret; |
90 | } |
91 | |
92 | DEFINE_SUITE("Parse sched tracepoints fields" , perf_evsel__tp_sched_test); |
93 | |