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