mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-18 16:44:27 +08:00
23773ca18b
As tracefs may be mounted instead of debugfs to get to the event directories, have perf know about tracefs, and use that file system over debugfs if it is present. Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: Namhyung Kim <namhyung@kernel.org> Link: http://lkml.kernel.org/r/20150202193553.340946602@goodmis.org [ Fixed up error messages about tracefs pointed out by Namhyung ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
62 lines
1.5 KiB
C
62 lines
1.5 KiB
C
#include "thread_map.h"
|
|
#include "evsel.h"
|
|
#include "debug.h"
|
|
#include "tests.h"
|
|
|
|
int test__open_syscall_event(void)
|
|
{
|
|
int err = -1, fd;
|
|
struct perf_evsel *evsel;
|
|
unsigned int nr_open_calls = 111, i;
|
|
struct thread_map *threads = thread_map__new(-1, getpid(), UINT_MAX);
|
|
char sbuf[STRERR_BUFSIZE];
|
|
|
|
if (threads == NULL) {
|
|
pr_debug("thread_map__new\n");
|
|
return -1;
|
|
}
|
|
|
|
evsel = perf_evsel__newtp("syscalls", "sys_enter_open");
|
|
if (evsel == NULL) {
|
|
if (tracefs_configured())
|
|
pr_debug("is tracefs mounted on /sys/kernel/tracing?\n");
|
|
else if (debugfs_configured())
|
|
pr_debug("is debugfs mounted on /sys/kernel/debug?\n");
|
|
else
|
|
pr_debug("Neither tracefs or debugfs is enabled in this kernel\n");
|
|
goto out_thread_map_delete;
|
|
}
|
|
|
|
if (perf_evsel__open_per_thread(evsel, threads) < 0) {
|
|
pr_debug("failed to open counter: %s, "
|
|
"tweak /proc/sys/kernel/perf_event_paranoid?\n",
|
|
strerror_r(errno, sbuf, sizeof(sbuf)));
|
|
goto out_evsel_delete;
|
|
}
|
|
|
|
for (i = 0; i < nr_open_calls; ++i) {
|
|
fd = open("/etc/passwd", O_RDONLY);
|
|
close(fd);
|
|
}
|
|
|
|
if (perf_evsel__read_on_cpu(evsel, 0, 0) < 0) {
|
|
pr_debug("perf_evsel__read_on_cpu\n");
|
|
goto out_close_fd;
|
|
}
|
|
|
|
if (evsel->counts->cpu[0].val != nr_open_calls) {
|
|
pr_debug("perf_evsel__read_on_cpu: expected to intercept %d calls, got %" PRIu64 "\n",
|
|
nr_open_calls, evsel->counts->cpu[0].val);
|
|
goto out_close_fd;
|
|
}
|
|
|
|
err = 0;
|
|
out_close_fd:
|
|
perf_evsel__close_fd(evsel, 1, threads->nr);
|
|
out_evsel_delete:
|
|
perf_evsel__delete(evsel);
|
|
out_thread_map_delete:
|
|
thread_map__delete(threads);
|
|
return err;
|
|
}
|