]>
git.proxmox.com Git - mirror_ubuntu-kernels.git/blob - tools/perf/tests/openat-syscall-tp-fields.c
1 // SPDX-License-Identifier: GPL-2.0
6 #include "thread_map.h"
12 #define O_DIRECTORY 00200000
18 int test__syscall_openat_tp_fields(struct test
*test __maybe_unused
, int subtest __maybe_unused
)
20 struct record_opts opts
= {
30 const char *filename
= "/etc/passwd";
31 int flags
= O_RDONLY
| O_DIRECTORY
;
32 struct perf_evlist
*evlist
= perf_evlist__new();
33 struct perf_evsel
*evsel
;
34 int err
= -1, i
, nr_events
= 0, nr_polls
= 0;
35 char sbuf
[STRERR_BUFSIZE
];
38 pr_debug("%s: perf_evlist__new\n", __func__
);
42 evsel
= perf_evsel__newtp("syscalls", "sys_enter_openat");
44 pr_debug("%s: perf_evsel__newtp\n", __func__
);
45 goto out_delete_evlist
;
48 perf_evlist__add(evlist
, evsel
);
50 err
= perf_evlist__create_maps(evlist
, &opts
.target
);
52 pr_debug("%s: perf_evlist__create_maps\n", __func__
);
53 goto out_delete_evlist
;
56 perf_evsel__config(evsel
, &opts
, NULL
);
58 thread_map__set_pid(evlist
->threads
, 0, getpid());
60 err
= perf_evlist__open(evlist
);
62 pr_debug("perf_evlist__open: %s\n",
63 str_error_r(errno
, sbuf
, sizeof(sbuf
)));
64 goto out_delete_evlist
;
67 err
= perf_evlist__mmap(evlist
, UINT_MAX
, false);
69 pr_debug("perf_evlist__mmap: %s\n",
70 str_error_r(errno
, sbuf
, sizeof(sbuf
)));
71 goto out_delete_evlist
;
74 perf_evlist__enable(evlist
);
79 openat(AT_FDCWD
, filename
, flags
);
82 int before
= nr_events
;
84 for (i
= 0; i
< evlist
->nr_mmaps
; i
++) {
85 union perf_event
*event
;
87 while ((event
= perf_evlist__mmap_read(evlist
, i
)) != NULL
) {
88 const u32 type
= event
->header
.type
;
90 struct perf_sample sample
;
94 if (type
!= PERF_RECORD_SAMPLE
) {
95 perf_evlist__mmap_consume(evlist
, i
);
99 err
= perf_evsel__parse_sample(evsel
, event
, &sample
);
101 pr_debug("Can't parse sample, err = %d\n", err
);
102 goto out_delete_evlist
;
105 tp_flags
= perf_evsel__intval(evsel
, &sample
, "flags");
107 if (flags
!= tp_flags
) {
108 pr_debug("%s: Expected flags=%#x, got %#x\n",
109 __func__
, flags
, tp_flags
);
110 goto out_delete_evlist
;
117 if (nr_events
== before
)
118 perf_evlist__poll(evlist
, 10);
120 if (++nr_polls
> 5) {
121 pr_debug("%s: no events!\n", __func__
);
122 goto out_delete_evlist
;
128 perf_evlist__delete(evlist
);