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