1 // SPDX-License-Identifier: GPL-2.0
9 #include "thread_map.h"
15 #define O_DIRECTORY 00200000
21 int test__syscall_openat_tp_fields(struct test
*test __maybe_unused
, int subtest __maybe_unused
)
23 struct record_opts opts
= {
33 const char *filename
= "/etc/passwd";
34 int flags
= O_RDONLY
| O_DIRECTORY
;
35 struct perf_evlist
*evlist
= perf_evlist__new();
36 struct perf_evsel
*evsel
;
37 int err
= -1, i
, nr_events
= 0, nr_polls
= 0;
38 char sbuf
[STRERR_BUFSIZE
];
41 pr_debug("%s: perf_evlist__new\n", __func__
);
45 evsel
= perf_evsel__newtp("syscalls", "sys_enter_openat");
47 pr_debug("%s: perf_evsel__newtp\n", __func__
);
48 goto out_delete_evlist
;
51 perf_evlist__add(evlist
, evsel
);
53 err
= perf_evlist__create_maps(evlist
, &opts
.target
);
55 pr_debug("%s: perf_evlist__create_maps\n", __func__
);
56 goto out_delete_evlist
;
59 perf_evsel__config(evsel
, &opts
, NULL
);
61 thread_map__set_pid(evlist
->threads
, 0, getpid());
63 err
= perf_evlist__open(evlist
);
65 pr_debug("perf_evlist__open: %s\n",
66 str_error_r(errno
, sbuf
, sizeof(sbuf
)));
67 goto out_delete_evlist
;
70 err
= perf_evlist__mmap(evlist
, UINT_MAX
);
72 pr_debug("perf_evlist__mmap: %s\n",
73 str_error_r(errno
, sbuf
, sizeof(sbuf
)));
74 goto out_delete_evlist
;
77 perf_evlist__enable(evlist
);
82 openat(AT_FDCWD
, filename
, flags
);
85 int before
= nr_events
;
87 for (i
= 0; i
< evlist
->nr_mmaps
; i
++) {
88 union perf_event
*event
;
91 md
= &evlist
->mmap
[i
];
92 if (perf_mmap__read_init(md
) < 0)
95 while ((event
= perf_mmap__read_event(md
)) != NULL
) {
96 const u32 type
= event
->header
.type
;
98 struct perf_sample sample
;
102 if (type
!= PERF_RECORD_SAMPLE
) {
103 perf_mmap__consume(md
);
107 err
= perf_evsel__parse_sample(evsel
, event
, &sample
);
109 pr_debug("Can't parse sample, err = %d\n", err
);
110 goto out_delete_evlist
;
113 tp_flags
= perf_evsel__intval(evsel
, &sample
, "flags");
115 if (flags
!= tp_flags
) {
116 pr_debug("%s: Expected flags=%#x, got %#x\n",
117 __func__
, flags
, tp_flags
);
118 goto out_delete_evlist
;
123 perf_mmap__read_done(md
);
126 if (nr_events
== before
)
127 perf_evlist__poll(evlist
, 10);
129 if (++nr_polls
> 5) {
130 pr_debug("%s: no events!\n", __func__
);
131 goto out_delete_evlist
;
137 perf_evlist__delete(evlist
);