Commit 23773ca1 authored by Steven Rostedt (Red Hat)'s avatar Steven Rostedt (Red Hat) Committed by Arnaldo Carvalho de Melo

perf tools: Make perf aware of tracefs

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: default avatarSteven Rostedt <rostedt@goodmis.org>
Acked-by: default avatarJiri 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent dd6dda27
...@@ -29,7 +29,12 @@ int test__open_syscall_event_on_all_cpus(void) ...@@ -29,7 +29,12 @@ int test__open_syscall_event_on_all_cpus(void)
evsel = perf_evsel__newtp("syscalls", "sys_enter_open"); evsel = perf_evsel__newtp("syscalls", "sys_enter_open");
if (evsel == NULL) { if (evsel == NULL) {
pr_debug("is debugfs mounted on /sys/kernel/debug?\n"); 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; goto out_thread_map_delete;
} }
......
...@@ -18,7 +18,12 @@ int test__open_syscall_event(void) ...@@ -18,7 +18,12 @@ int test__open_syscall_event(void)
evsel = perf_evsel__newtp("syscalls", "sys_enter_open"); evsel = perf_evsel__newtp("syscalls", "sys_enter_open");
if (evsel == NULL) { if (evsel == NULL) {
pr_debug("is debugfs mounted on /sys/kernel/debug?\n"); 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; goto out_thread_map_delete;
} }
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include "evsel.h" #include "evsel.h"
#include "evlist.h" #include "evlist.h"
#include <api/fs/fs.h> #include <api/fs/fs.h>
#include <api/fs/tracefs.h>
#include <api/fs/debugfs.h> #include <api/fs/debugfs.h>
#include "tests.h" #include "tests.h"
#include "debug.h" #include "debug.h"
...@@ -1192,11 +1193,19 @@ static int count_tracepoints(void) ...@@ -1192,11 +1193,19 @@ static int count_tracepoints(void)
{ {
char events_path[PATH_MAX]; char events_path[PATH_MAX];
struct dirent *events_ent; struct dirent *events_ent;
const char *mountpoint;
DIR *events_dir; DIR *events_dir;
int cnt = 0; int cnt = 0;
scnprintf(events_path, PATH_MAX, "%s/tracing/events", mountpoint = tracefs_find_mountpoint();
debugfs_find_mountpoint()); if (mountpoint) {
scnprintf(events_path, PATH_MAX, "%s/events",
mountpoint);
} else {
mountpoint = debugfs_find_mountpoint();
scnprintf(events_path, PATH_MAX, "%s/tracing/events",
mountpoint);
}
events_dir = opendir(events_path); events_dir = opendir(events_path);
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#define EXEC_PATH_ENVIRONMENT "PERF_EXEC_PATH" #define EXEC_PATH_ENVIRONMENT "PERF_EXEC_PATH"
#define DEFAULT_PERF_DIR_ENVIRONMENT ".perf" #define DEFAULT_PERF_DIR_ENVIRONMENT ".perf"
#define PERF_DEBUGFS_ENVIRONMENT "PERF_DEBUGFS_DIR" #define PERF_DEBUGFS_ENVIRONMENT "PERF_DEBUGFS_DIR"
#define PERF_TRACEFS_ENVIRONMENT "PERF_TRACEFS_DIR"
typedef int (*config_fn_t)(const char *, const char *, void *); typedef int (*config_fn_t)(const char *, const char *, void *);
extern int perf_default_config(const char *, const char *, void *); extern int perf_default_config(const char *, const char *, void *);
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
* Released under the GPL v2. (and only v2, not any later version) * Released under the GPL v2. (and only v2, not any later version)
*/ */
#include "util.h" #include "util.h"
#include <api/fs/debugfs.h>
#include <api/fs/fs.h> #include <api/fs/fs.h>
#include <poll.h> #include <poll.h>
#include "cpumap.h" #include "cpumap.h"
......
...@@ -122,6 +122,6 @@ void print_tracepoint_events(const char *subsys_glob, const char *event_glob, ...@@ -122,6 +122,6 @@ void print_tracepoint_events(const char *subsys_glob, const char *event_glob,
int print_hwcache_events(const char *event_glob, bool name_only); int print_hwcache_events(const char *event_glob, bool name_only);
extern int is_valid_tracepoint(const char *event_string); extern int is_valid_tracepoint(const char *event_string);
extern int valid_debugfs_mount(const char *debugfs); int valid_event_mount(const char *eventfs);
#endif /* __PERF_PARSE_EVENTS_H */ #endif /* __PERF_PARSE_EVENTS_H */
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include "symbol.h" #include "symbol.h"
#include "thread.h" #include "thread.h"
#include <api/fs/debugfs.h> #include <api/fs/debugfs.h>
#include <api/fs/tracefs.h>
#include "trace-event.h" /* For __maybe_unused */ #include "trace-event.h" /* For __maybe_unused */
#include "probe-event.h" #include "probe-event.h"
#include "probe-finder.h" #include "probe-finder.h"
...@@ -1805,7 +1806,7 @@ static void print_open_warning(int err, bool is_kprobe) ...@@ -1805,7 +1806,7 @@ static void print_open_warning(int err, bool is_kprobe)
" - please rebuild kernel with %s.\n", " - please rebuild kernel with %s.\n",
is_kprobe ? 'k' : 'u', config); is_kprobe ? 'k' : 'u', config);
} else if (err == -ENOTSUP) } else if (err == -ENOTSUP)
pr_warning("Debugfs is not mounted.\n"); pr_warning("Tracefs or debugfs is not mounted.\n");
else else
pr_warning("Failed to open %cprobe_events: %s\n", pr_warning("Failed to open %cprobe_events: %s\n",
is_kprobe ? 'k' : 'u', is_kprobe ? 'k' : 'u',
...@@ -1816,7 +1817,7 @@ static void print_both_open_warning(int kerr, int uerr) ...@@ -1816,7 +1817,7 @@ static void print_both_open_warning(int kerr, int uerr)
{ {
/* Both kprobes and uprobes are disabled, warn it. */ /* Both kprobes and uprobes are disabled, warn it. */
if (kerr == -ENOTSUP && uerr == -ENOTSUP) if (kerr == -ENOTSUP && uerr == -ENOTSUP)
pr_warning("Debugfs is not mounted.\n"); pr_warning("Tracefs or debugfs is not mounted.\n");
else if (kerr == -ENOENT && uerr == -ENOENT) else if (kerr == -ENOENT && uerr == -ENOENT)
pr_warning("Please rebuild kernel with CONFIG_KPROBE_EVENTS " pr_warning("Please rebuild kernel with CONFIG_KPROBE_EVENTS "
"or/and CONFIG_UPROBE_EVENTS.\n"); "or/and CONFIG_UPROBE_EVENTS.\n");
...@@ -1833,13 +1834,20 @@ static int open_probe_events(const char *trace_file, bool readwrite) ...@@ -1833,13 +1834,20 @@ static int open_probe_events(const char *trace_file, bool readwrite)
{ {
char buf[PATH_MAX]; char buf[PATH_MAX];
const char *__debugfs; const char *__debugfs;
const char *tracing_dir = "";
int ret; int ret;
__debugfs = debugfs_find_mountpoint(); __debugfs = tracefs_find_mountpoint();
if (__debugfs == NULL) if (__debugfs == NULL) {
return -ENOTSUP; tracing_dir = "tracing/";
ret = e_snprintf(buf, PATH_MAX, "%s/%s", __debugfs, trace_file); __debugfs = debugfs_find_mountpoint();
if (__debugfs == NULL)
return -ENOTSUP;
}
ret = e_snprintf(buf, PATH_MAX, "%s/%s%s",
__debugfs, tracing_dir, trace_file);
if (ret >= 0) { if (ret >= 0) {
pr_debug("Opening %s write=%d\n", buf, readwrite); pr_debug("Opening %s write=%d\n", buf, readwrite);
if (readwrite && !probe_event_dry_run) if (readwrite && !probe_event_dry_run)
...@@ -1855,12 +1863,12 @@ static int open_probe_events(const char *trace_file, bool readwrite) ...@@ -1855,12 +1863,12 @@ static int open_probe_events(const char *trace_file, bool readwrite)
static int open_kprobe_events(bool readwrite) static int open_kprobe_events(bool readwrite)
{ {
return open_probe_events("tracing/kprobe_events", readwrite); return open_probe_events("kprobe_events", readwrite);
} }
static int open_uprobe_events(bool readwrite) static int open_uprobe_events(bool readwrite)
{ {
return open_probe_events("tracing/uprobe_events", readwrite); return open_probe_events("uprobe_events", readwrite);
} }
/* Get raw string list of current kprobe_events or uprobe_events */ /* Get raw string list of current kprobe_events or uprobe_events */
......
...@@ -303,13 +303,26 @@ void set_term_quiet_input(struct termios *old) ...@@ -303,13 +303,26 @@ void set_term_quiet_input(struct termios *old)
tcsetattr(0, TCSANOW, &tc); tcsetattr(0, TCSANOW, &tc);
} }
static void set_tracing_events_path(const char *mountpoint) static void set_tracing_events_path(const char *tracing, const char *mountpoint)
{ {
snprintf(tracing_events_path, sizeof(tracing_events_path), "%s/%s", snprintf(tracing_events_path, sizeof(tracing_events_path), "%s/%s%s",
mountpoint, "tracing/events"); mountpoint, tracing, "events");
} }
const char *perf_debugfs_mount(const char *mountpoint) static const char *__perf_tracefs_mount(const char *mountpoint)
{
const char *mnt;
mnt = tracefs_mount(mountpoint);
if (!mnt)
return NULL;
set_tracing_events_path("", mnt);
return mnt;
}
static const char *__perf_debugfs_mount(const char *mountpoint)
{ {
const char *mnt; const char *mnt;
...@@ -317,7 +330,20 @@ const char *perf_debugfs_mount(const char *mountpoint) ...@@ -317,7 +330,20 @@ const char *perf_debugfs_mount(const char *mountpoint)
if (!mnt) if (!mnt)
return NULL; return NULL;
set_tracing_events_path(mnt); set_tracing_events_path("tracing/", mnt);
return mnt;
}
const char *perf_debugfs_mount(const char *mountpoint)
{
const char *mnt;
mnt = __perf_tracefs_mount(mountpoint);
if (mnt)
return mnt;
mnt = __perf_debugfs_mount(mountpoint);
return mnt; return mnt;
} }
...@@ -325,12 +351,19 @@ const char *perf_debugfs_mount(const char *mountpoint) ...@@ -325,12 +351,19 @@ const char *perf_debugfs_mount(const char *mountpoint)
void perf_debugfs_set_path(const char *mntpt) void perf_debugfs_set_path(const char *mntpt)
{ {
snprintf(debugfs_mountpoint, strlen(debugfs_mountpoint), "%s", mntpt); snprintf(debugfs_mountpoint, strlen(debugfs_mountpoint), "%s", mntpt);
set_tracing_events_path(mntpt); set_tracing_events_path("tracing/", mntpt);
}
static const char *find_tracefs(void)
{
const char *path = __perf_tracefs_mount(NULL);
return path;
} }
static const char *find_debugfs(void) static const char *find_debugfs(void)
{ {
const char *path = perf_debugfs_mount(NULL); const char *path = __perf_debugfs_mount(NULL);
if (!path) if (!path)
fprintf(stderr, "Your kernel does not support the debugfs filesystem"); fprintf(stderr, "Your kernel does not support the debugfs filesystem");
...@@ -344,6 +377,7 @@ static const char *find_debugfs(void) ...@@ -344,6 +377,7 @@ static const char *find_debugfs(void)
*/ */
const char *find_tracing_dir(void) const char *find_tracing_dir(void)
{ {
const char *tracing_dir = "";
static char *tracing; static char *tracing;
static int tracing_found; static int tracing_found;
const char *debugfs; const char *debugfs;
...@@ -351,11 +385,15 @@ const char *find_tracing_dir(void) ...@@ -351,11 +385,15 @@ const char *find_tracing_dir(void)
if (tracing_found) if (tracing_found)
return tracing; return tracing;
debugfs = find_debugfs(); debugfs = find_tracefs();
if (!debugfs) if (!debugfs) {
return NULL; tracing_dir = "/tracing";
debugfs = find_debugfs();
if (!debugfs)
return NULL;
}
if (asprintf(&tracing, "%s/tracing", debugfs) < 0) if (asprintf(&tracing, "%s%s", debugfs, tracing_dir) < 0)
return NULL; return NULL;
tracing_found = 1; tracing_found = 1;
......
...@@ -75,6 +75,7 @@ ...@@ -75,6 +75,7 @@
#include <linux/types.h> #include <linux/types.h>
#include <sys/ttydefaults.h> #include <sys/ttydefaults.h>
#include <api/fs/debugfs.h> #include <api/fs/debugfs.h>
#include <api/fs/tracefs.h>
#include <termios.h> #include <termios.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <termios.h> #include <termios.h>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment