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