perf debug: Remove needless include directives from debug.h
[linux-2.6-block.git] / tools / perf / tests / openat-syscall-tp-fields.c
CommitLineData
b2441318 1// SPDX-License-Identifier: GPL-2.0
aeb00b1a 2#include <stdbool.h>
8dd2a131 3#include <linux/err.h>
8520a98d 4#include <linux/string.h>
bafae98e
ACM
5#include <sys/types.h>
6#include <sys/stat.h>
7#include <fcntl.h>
dc447eed
JO
8#include "evlist.h"
9#include "evsel.h"
10#include "thread_map.h"
aeb00b1a 11#include "record.h"
dc447eed 12#include "tests.h"
84f5d36f 13#include "debug.h"
a43783ae 14#include <errno.h>
dc447eed 15
ab6526b2
ACM
16#ifndef O_DIRECTORY
17#define O_DIRECTORY 00200000
18#endif
19#ifndef AT_FDCWD
20#define AT_FDCWD -100
21#endif
22
81f17c90 23int test__syscall_openat_tp_fields(struct test *test __maybe_unused, int subtest __maybe_unused)
dc447eed 24{
b4006796 25 struct record_opts opts = {
dc447eed
JO
26 .target = {
27 .uid = UINT_MAX,
28 .uses_mmap = true,
29 },
509051ea
ACM
30 .no_buffering = true,
31 .freq = 1,
32 .mmap_pages = 256,
33 .raw_samples = true,
dc447eed
JO
34 };
35 const char *filename = "/etc/passwd";
36 int flags = O_RDONLY | O_DIRECTORY;
0f98b11c 37 struct evlist *evlist = evlist__new();
32dcd021 38 struct evsel *evsel;
dc447eed 39 int err = -1, i, nr_events = 0, nr_polls = 0;
ba3dfff8 40 char sbuf[STRERR_BUFSIZE];
dc447eed
JO
41
42 if (evlist == NULL) {
43 pr_debug("%s: perf_evlist__new\n", __func__);
44 goto out;
45 }
46
43f322b4 47 evsel = perf_evsel__newtp("syscalls", "sys_enter_openat");
8dd2a131 48 if (IS_ERR(evsel)) {
dc447eed
JO
49 pr_debug("%s: perf_evsel__newtp\n", __func__);
50 goto out_delete_evlist;
51 }
52
a1cf3a75 53 evlist__add(evlist, evsel);
dc447eed
JO
54
55 err = perf_evlist__create_maps(evlist, &opts.target);
56 if (err < 0) {
57 pr_debug("%s: perf_evlist__create_maps\n", __func__);
58 goto out_delete_evlist;
59 }
60
e68ae9cf 61 perf_evsel__config(evsel, &opts, NULL);
dc447eed 62
03617c22 63 perf_thread_map__set_pid(evlist->core.threads, 0, getpid());
dc447eed 64
474ddc4c 65 err = evlist__open(evlist);
dc447eed 66 if (err < 0) {
ba3dfff8 67 pr_debug("perf_evlist__open: %s\n",
c8b5f2c9 68 str_error_r(errno, sbuf, sizeof(sbuf)));
03ad9747 69 goto out_delete_evlist;
dc447eed
JO
70 }
71
f74b9d3a 72 err = perf_evlist__mmap(evlist, UINT_MAX);
dc447eed 73 if (err < 0) {
ba3dfff8 74 pr_debug("perf_evlist__mmap: %s\n",
c8b5f2c9 75 str_error_r(errno, sbuf, sizeof(sbuf)));
f26e1c7c 76 goto out_delete_evlist;
dc447eed
JO
77 }
78
1c87f165 79 evlist__enable(evlist);
dc447eed
JO
80
81 /*
82 * Generate the event:
83 */
43f322b4 84 openat(AT_FDCWD, filename, flags);
dc447eed
JO
85
86 while (1) {
87 int before = nr_events;
88
89 for (i = 0; i < evlist->nr_mmaps; i++) {
90 union perf_event *event;
1d1b5632 91 struct perf_mmap *md;
dc447eed 92
1d1b5632 93 md = &evlist->mmap[i];
b9bae2c8 94 if (perf_mmap__read_init(md) < 0)
1d1b5632
KL
95 continue;
96
0019dc87 97 while ((event = perf_mmap__read_event(md)) != NULL) {
dc447eed
JO
98 const u32 type = event->header.type;
99 int tp_flags;
100 struct perf_sample sample;
101
102 ++nr_events;
103
8e50d384 104 if (type != PERF_RECORD_SAMPLE) {
d6ace3df 105 perf_mmap__consume(md);
dc447eed 106 continue;
8e50d384 107 }
dc447eed
JO
108
109 err = perf_evsel__parse_sample(evsel, event, &sample);
110 if (err) {
87191383 111 pr_debug("Can't parse sample, err = %d\n", err);
983874d1 112 goto out_delete_evlist;
dc447eed
JO
113 }
114
115 tp_flags = perf_evsel__intval(evsel, &sample, "flags");
116
117 if (flags != tp_flags) {
118 pr_debug("%s: Expected flags=%#x, got %#x\n",
119 __func__, flags, tp_flags);
983874d1 120 goto out_delete_evlist;
dc447eed
JO
121 }
122
123 goto out_ok;
124 }
1d1b5632 125 perf_mmap__read_done(md);
dc447eed
JO
126 }
127
128 if (nr_events == before)
f66a889d 129 perf_evlist__poll(evlist, 10);
dc447eed
JO
130
131 if (++nr_polls > 5) {
132 pr_debug("%s: no events!\n", __func__);
983874d1 133 goto out_delete_evlist;
dc447eed
JO
134 }
135 }
136out_ok:
137 err = 0;
dc447eed 138out_delete_evlist:
c12995a5 139 evlist__delete(evlist);
dc447eed
JO
140out:
141 return err;
142}