Linux Perf
openat-syscall.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0
2 #include <errno.h>
3 #include <inttypes.h>
4 #include <api/fs/tracing_path.h>
5 #include <linux/err.h>
6 #include <sys/types.h>
7 #include <sys/stat.h>
8 #include <fcntl.h>
9 #include "thread_map.h"
10 #include "evsel.h"
11 #include "debug.h"
12 #include "tests.h"
13 
14 int test__openat_syscall_event(struct test *test __maybe_unused, int subtest __maybe_unused)
15 {
16  int err = -1, fd;
17  struct perf_evsel *evsel;
18  unsigned int nr_openat_calls = 111, i;
19  struct thread_map *threads = thread_map__new(-1, getpid(), UINT_MAX);
20  char sbuf[STRERR_BUFSIZE];
21  char errbuf[BUFSIZ];
22 
23  if (threads == NULL) {
24  pr_debug("thread_map__new\n");
25  return -1;
26  }
27 
28  evsel = perf_evsel__newtp("syscalls", "sys_enter_openat");
29  if (IS_ERR(evsel)) {
30  tracing_path__strerror_open_tp(errno, errbuf, sizeof(errbuf), "syscalls", "sys_enter_openat");
31  pr_debug("%s\n", errbuf);
32  goto out_thread_map_delete;
33  }
34 
35  if (perf_evsel__open_per_thread(evsel, threads) < 0) {
36  pr_debug("failed to open counter: %s, "
37  "tweak /proc/sys/kernel/perf_event_paranoid?\n",
38  str_error_r(errno, sbuf, sizeof(sbuf)));
39  goto out_evsel_delete;
40  }
41 
42  for (i = 0; i < nr_openat_calls; ++i) {
43  fd = openat(0, "/etc/passwd", O_RDONLY);
44  close(fd);
45  }
46 
47  if (perf_evsel__read_on_cpu(evsel, 0, 0) < 0) {
48  pr_debug("perf_evsel__read_on_cpu\n");
49  goto out_close_fd;
50  }
51 
52  if (perf_counts(evsel->counts, 0, 0)->val != nr_openat_calls) {
53  pr_debug("perf_evsel__read_on_cpu: expected to intercept %d calls, got %" PRIu64 "\n",
54  nr_openat_calls, perf_counts(evsel->counts, 0, 0)->val);
55  goto out_close_fd;
56  }
57 
58  err = 0;
59 out_close_fd:
60  perf_evsel__close_fd(evsel);
61 out_evsel_delete:
62  perf_evsel__delete(evsel);
63 out_thread_map_delete:
64  thread_map__put(threads);
65  return err;
66 }
static int perf_evsel__read_on_cpu(struct perf_evsel *evsel, int cpu, int thread)
Definition: evsel.h:337
int int err
Definition: 5sec.c:44
void perf_evsel__delete(struct perf_evsel *evsel)
Definition: evsel.c:1261
#define pr_debug(fmt,...)
Definition: json.h:27
int perf_evsel__open_per_thread(struct perf_evsel *evsel, struct thread_map *threads)
Definition: evsel.c:1963
struct perf_counts * counts
Definition: evsel.h:98
void perf_evsel__close_fd(struct perf_evsel *evsel)
Definition: evsel.c:1234
int test__openat_syscall_event(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: tests.h:30
#define STRERR_BUFSIZE
Definition: debug.h:43
void thread_map__put(struct thread_map *map)
Definition: thread_map.c:361
static struct perf_counts_values * perf_counts(struct perf_counts *counts, int cpu, int thread)
Definition: counts.h:27
static struct perf_evsel * perf_evsel__newtp(const char *sys, const char *name)
Definition: evsel.h:207
struct thread_map * thread_map__new(pid_t pid, pid_t tid, uid_t uid)
Definition: thread_map.c:192