linux/tools/perf/tests/open-syscall.c
<<
>>
Prefs
   1#include "thread_map.h"
   2#include "evsel.h"
   3#include "debug.h"
   4#include "tests.h"
   5
   6int test__open_syscall_event(void)
   7{
   8        int err = -1, fd;
   9        struct perf_evsel *evsel;
  10        unsigned int nr_open_calls = 111, i;
  11        struct thread_map *threads = thread_map__new(-1, getpid(), UINT_MAX);
  12
  13        if (threads == NULL) {
  14                pr_debug("thread_map__new\n");
  15                return -1;
  16        }
  17
  18        evsel = perf_evsel__newtp("syscalls", "sys_enter_open", 0);
  19        if (evsel == NULL) {
  20                pr_debug("is debugfs mounted on /sys/kernel/debug?\n");
  21                goto out_thread_map_delete;
  22        }
  23
  24        if (perf_evsel__open_per_thread(evsel, threads) < 0) {
  25                pr_debug("failed to open counter: %s, "
  26                         "tweak /proc/sys/kernel/perf_event_paranoid?\n",
  27                         strerror(errno));
  28                goto out_evsel_delete;
  29        }
  30
  31        for (i = 0; i < nr_open_calls; ++i) {
  32                fd = open("/etc/passwd", O_RDONLY);
  33                close(fd);
  34        }
  35
  36        if (perf_evsel__read_on_cpu(evsel, 0, 0) < 0) {
  37                pr_debug("perf_evsel__read_on_cpu\n");
  38                goto out_close_fd;
  39        }
  40
  41        if (evsel->counts->cpu[0].val != nr_open_calls) {
  42                pr_debug("perf_evsel__read_on_cpu: expected to intercept %d calls, got %" PRIu64 "\n",
  43                         nr_open_calls, evsel->counts->cpu[0].val);
  44                goto out_close_fd;
  45        }
  46
  47        err = 0;
  48out_close_fd:
  49        perf_evsel__close_fd(evsel, 1, threads->nr);
  50out_evsel_delete:
  51        perf_evsel__delete(evsel);
  52out_thread_map_delete:
  53        thread_map__delete(threads);
  54        return err;
  55}
  56