summaryrefslogtreecommitdiffstats
path: root/tools/perf/util
diff options
context:
space:
mode:
authorJason Baron <jbaron@redhat.com>2009-07-21 14:16:29 -0400
committerPeter Zijlstra <a.p.zijlstra@chello.nl>2009-07-22 18:05:57 +0200
commit5beeded123c5befa21f1c6e16219f2a3eb7dd197 (patch)
tree4ac812126910994516300c53171c7267b97f6f5d /tools/perf/util
parentf6bdafef2ab911f03321fa83d8da1df99878009e (diff)
downloadlinux-5beeded123c5befa21f1c6e16219f2a3eb7dd197.tar.bz2
perf_counter: Detect debugfs location
If "/sys/kernel/debug" is not a debugfs mount point, search for the debugfs filesystem in /proc/mounts, but also allows the user to specify '--debugfs-dir=blah' or set the environment variable: 'PERF_DEBUGFS_DIR' Signed-off-by: Jason Baron <jbaron@redhat.com> [ also made it probe "/debug" by default ] Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> LKML-Reference: <20090721181629.GA3094@redhat.com>
Diffstat (limited to 'tools/perf/util')
-rw-r--r--tools/perf/util/cache.h1
-rw-r--r--tools/perf/util/parse-events.c33
-rw-r--r--tools/perf/util/parse-events.h5
-rw-r--r--tools/perf/util/string.h3
4 files changed, 26 insertions, 16 deletions
diff --git a/tools/perf/util/cache.h b/tools/perf/util/cache.h
index 161d5f413e28..4b50c412b9c5 100644
--- a/tools/perf/util/cache.h
+++ b/tools/perf/util/cache.h
@@ -18,6 +18,7 @@
#define PERFATTRIBUTES_FILE ".perfattributes"
#define INFOATTRIBUTES_FILE "info/attributes"
#define ATTRIBUTE_MACRO_PREFIX "[attr]"
+#define PERF_DEBUGFS_ENVIRONMENT "PERF_DEBUGFS_DIR"
typedef int (*config_fn_t)(const char *, const char *, void *);
extern int perf_default_config(const char *, const char *, void *);
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 5a3cd3a34af1..7bdad8df22a6 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -5,6 +5,7 @@
#include "parse-events.h"
#include "exec_cmd.h"
#include "string.h"
+#include "cache.h"
extern char *strcasestr(const char *haystack, const char *needle);
@@ -12,8 +13,6 @@ int nr_counters;
struct perf_counter_attr attrs[MAX_COUNTERS];
-static char default_debugfs_path[] = "/sys/kernel/debug/tracing/events";
-
struct event_symbol {
u8 type;
u64 config;
@@ -21,6 +20,8 @@ struct event_symbol {
char *alias;
};
+char debugfs_path[MAXPATHLEN];
+
#define CHW(x) .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_##x
#define CSW(x) .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_##x
@@ -114,27 +115,27 @@ static unsigned long hw_cache_stat[C(MAX)] = {
#define for_each_subsystem(sys_dir, sys_dirent, sys_next, file, st) \
while (!readdir_r(sys_dir, &sys_dirent, &sys_next) && sys_next) \
- if (snprintf(file, MAXPATHLEN, "%s/%s", default_debugfs_path, \
- sys_dirent.d_name) && \
+ if (snprintf(file, MAXPATHLEN, "%s/%s", debugfs_path, \
+ sys_dirent.d_name) && \
(!stat(file, &st)) && (S_ISDIR(st.st_mode)) && \
(strcmp(sys_dirent.d_name, ".")) && \
(strcmp(sys_dirent.d_name, "..")))
#define for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next, file, st) \
while (!readdir_r(evt_dir, &evt_dirent, &evt_next) && evt_next) \
- if (snprintf(file, MAXPATHLEN, "%s/%s/%s", default_debugfs_path, \
- sys_dirent.d_name, evt_dirent.d_name) && \
+ if (snprintf(file, MAXPATHLEN, "%s/%s/%s", debugfs_path, \
+ sys_dirent.d_name, evt_dirent.d_name) && \
(!stat(file, &st)) && (S_ISDIR(st.st_mode)) && \
(strcmp(evt_dirent.d_name, ".")) && \
(strcmp(evt_dirent.d_name, "..")))
#define MAX_EVENT_LENGTH 30
-static int valid_debugfs_mount(void)
+int valid_debugfs_mount(const char *debugfs)
{
struct statfs st_fs;
- if (statfs(default_debugfs_path, &st_fs) < 0)
+ if (statfs(debugfs, &st_fs) < 0)
return -ENOENT;
else if (st_fs.f_type != (long) DEBUGFS_MAGIC)
return -ENOENT;
@@ -152,10 +153,10 @@ static char *tracepoint_id_to_name(u64 config)
u64 id;
char evt_path[MAXPATHLEN];
- if (valid_debugfs_mount())
+ if (valid_debugfs_mount(debugfs_path))
return "unkown";
- sys_dir = opendir(default_debugfs_path);
+ sys_dir = opendir(debugfs_path);
if (!sys_dir)
goto cleanup;
@@ -166,7 +167,7 @@ static char *tracepoint_id_to_name(u64 config)
for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next,
evt_path, st) {
snprintf(evt_path, MAXPATHLEN, "%s/%s/%s/id",
- default_debugfs_path, sys_dirent.d_name,
+ debugfs_path, sys_dirent.d_name,
evt_dirent.d_name);
fd = open(evt_path, O_RDONLY);
if (fd < 0)
@@ -363,7 +364,7 @@ static int parse_tracepoint_event(const char **strp,
u64 id;
char evt_path[MAXPATHLEN];
- if (valid_debugfs_mount())
+ if (valid_debugfs_mount(debugfs_path))
return 0;
evt_name = strchr(*strp, ':');
@@ -381,8 +382,8 @@ static int parse_tracepoint_event(const char **strp,
if (evt_length >= MAX_EVENT_LENGTH)
return 0;
- snprintf(evt_path, MAXPATHLEN, "%s/%s/%s/id", default_debugfs_path,
- sys_name, evt_name);
+ snprintf(evt_path, MAXPATHLEN, "%s/%s/%s/id", debugfs_path,
+ sys_name, evt_name);
fd = open(evt_path, O_RDONLY);
if (fd < 0)
return 0;
@@ -568,10 +569,10 @@ static void print_tracepoint_events(void)
struct stat st;
char evt_path[MAXPATHLEN];
- if (valid_debugfs_mount())
+ if (valid_debugfs_mount(debugfs_path))
return;
- sys_dir = opendir(default_debugfs_path);
+ sys_dir = opendir(debugfs_path);
if (!sys_dir)
goto cleanup;
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index e3d552908e60..1ea5d09b6eb1 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -3,6 +3,8 @@
* Parse symbolic events/counts passed in as options:
*/
+struct option;
+
extern int nr_counters;
extern struct perf_counter_attr attrs[MAX_COUNTERS];
@@ -15,3 +17,6 @@ extern int parse_events(const struct option *opt, const char *str, int unset);
extern void print_events(void);
+extern char debugfs_path[];
+extern int valid_debugfs_mount(const char *debugfs);
+
diff --git a/tools/perf/util/string.h b/tools/perf/util/string.h
index 3dca2f654cd0..bf39dfadfd24 100644
--- a/tools/perf/util/string.h
+++ b/tools/perf/util/string.h
@@ -5,4 +5,7 @@
int hex2u64(const char *ptr, u64 *val);
+#define _STR(x) #x
+#define STR(x) _STR(x)
+
#endif