Commit | Line | Data |
---|---|---|
dc447eed JO |
1 | #include "perf.h" |
2 | #include "evlist.h" | |
3 | #include "evsel.h" | |
4 | #include "thread_map.h" | |
5 | #include "tests.h" | |
84f5d36f | 6 | #include "debug.h" |
dc447eed JO |
7 | |
8 | int test__syscall_open_tp_fields(void) | |
9 | { | |
b4006796 | 10 | struct record_opts opts = { |
dc447eed JO |
11 | .target = { |
12 | .uid = UINT_MAX, | |
13 | .uses_mmap = true, | |
14 | }, | |
509051ea ACM |
15 | .no_buffering = true, |
16 | .freq = 1, | |
17 | .mmap_pages = 256, | |
18 | .raw_samples = true, | |
dc447eed JO |
19 | }; |
20 | const char *filename = "/etc/passwd"; | |
21 | int flags = O_RDONLY | O_DIRECTORY; | |
334fe7a3 | 22 | struct perf_evlist *evlist = perf_evlist__new(); |
dc447eed JO |
23 | struct perf_evsel *evsel; |
24 | int err = -1, i, nr_events = 0, nr_polls = 0; | |
ba3dfff8 | 25 | char sbuf[STRERR_BUFSIZE]; |
dc447eed JO |
26 | |
27 | if (evlist == NULL) { | |
28 | pr_debug("%s: perf_evlist__new\n", __func__); | |
29 | goto out; | |
30 | } | |
31 | ||
ef503831 | 32 | evsel = perf_evsel__newtp("syscalls", "sys_enter_open"); |
dc447eed JO |
33 | if (evsel == NULL) { |
34 | pr_debug("%s: perf_evsel__newtp\n", __func__); | |
35 | goto out_delete_evlist; | |
36 | } | |
37 | ||
38 | perf_evlist__add(evlist, evsel); | |
39 | ||
40 | err = perf_evlist__create_maps(evlist, &opts.target); | |
41 | if (err < 0) { | |
42 | pr_debug("%s: perf_evlist__create_maps\n", __func__); | |
43 | goto out_delete_evlist; | |
44 | } | |
45 | ||
cac21425 | 46 | perf_evsel__config(evsel, &opts); |
dc447eed JO |
47 | |
48 | evlist->threads->map[0] = getpid(); | |
49 | ||
50 | err = perf_evlist__open(evlist); | |
51 | if (err < 0) { | |
ba3dfff8 MH |
52 | pr_debug("perf_evlist__open: %s\n", |
53 | strerror_r(errno, sbuf, sizeof(sbuf))); | |
03ad9747 | 54 | goto out_delete_evlist; |
dc447eed JO |
55 | } |
56 | ||
57 | err = perf_evlist__mmap(evlist, UINT_MAX, false); | |
58 | if (err < 0) { | |
ba3dfff8 MH |
59 | pr_debug("perf_evlist__mmap: %s\n", |
60 | strerror_r(errno, sbuf, sizeof(sbuf))); | |
f26e1c7c | 61 | goto out_delete_evlist; |
dc447eed JO |
62 | } |
63 | ||
64 | perf_evlist__enable(evlist); | |
65 | ||
66 | /* | |
67 | * Generate the event: | |
68 | */ | |
69 | open(filename, flags); | |
70 | ||
71 | while (1) { | |
72 | int before = nr_events; | |
73 | ||
74 | for (i = 0; i < evlist->nr_mmaps; i++) { | |
75 | union perf_event *event; | |
76 | ||
77 | while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) { | |
78 | const u32 type = event->header.type; | |
79 | int tp_flags; | |
80 | struct perf_sample sample; | |
81 | ||
82 | ++nr_events; | |
83 | ||
8e50d384 ZZ |
84 | if (type != PERF_RECORD_SAMPLE) { |
85 | perf_evlist__mmap_consume(evlist, i); | |
dc447eed | 86 | continue; |
8e50d384 | 87 | } |
dc447eed JO |
88 | |
89 | err = perf_evsel__parse_sample(evsel, event, &sample); | |
90 | if (err) { | |
91 | pr_err("Can't parse sample, err = %d\n", err); | |
983874d1 | 92 | goto out_delete_evlist; |
dc447eed JO |
93 | } |
94 | ||
95 | tp_flags = perf_evsel__intval(evsel, &sample, "flags"); | |
96 | ||
97 | if (flags != tp_flags) { | |
98 | pr_debug("%s: Expected flags=%#x, got %#x\n", | |
99 | __func__, flags, tp_flags); | |
983874d1 | 100 | goto out_delete_evlist; |
dc447eed JO |
101 | } |
102 | ||
103 | goto out_ok; | |
104 | } | |
105 | } | |
106 | ||
107 | if (nr_events == before) | |
f66a889d | 108 | perf_evlist__poll(evlist, 10); |
dc447eed JO |
109 | |
110 | if (++nr_polls > 5) { | |
111 | pr_debug("%s: no events!\n", __func__); | |
983874d1 | 112 | goto out_delete_evlist; |
dc447eed JO |
113 | } |
114 | } | |
115 | out_ok: | |
116 | err = 0; | |
dc447eed JO |
117 | out_delete_evlist: |
118 | perf_evlist__delete(evlist); | |
119 | out: | |
120 | return err; | |
121 | } |