diff options
| -rw-r--r-- | tools/perf/tests/open-syscall-all-cpus.c | 7 | ||||
| -rw-r--r-- | tools/perf/tests/open-syscall.c | 7 | ||||
| -rw-r--r-- | tools/perf/tests/parse-events.c | 13 | ||||
| -rw-r--r-- | tools/perf/util/cache.h | 1 | ||||
| -rw-r--r-- | tools/perf/util/evlist.c | 1 | ||||
| -rw-r--r-- | tools/perf/util/parse-events.h | 2 | ||||
| -rw-r--r-- | tools/perf/util/probe-event.c | 24 | ||||
| -rw-r--r-- | tools/perf/util/util.c | 60 | ||||
| -rw-r--r-- | tools/perf/util/util.h | 1 |
9 files changed, 91 insertions, 25 deletions
diff --git a/tools/perf/tests/open-syscall-all-cpus.c b/tools/perf/tests/open-syscall-all-cpus.c index 8fa82d1700c7..3ec885c48f8f 100644 --- a/tools/perf/tests/open-syscall-all-cpus.c +++ b/tools/perf/tests/open-syscall-all-cpus.c | |||
| @@ -29,7 +29,12 @@ int test__open_syscall_event_on_all_cpus(void) | |||
| 29 | 29 | ||
| 30 | evsel = perf_evsel__newtp("syscalls", "sys_enter_open"); | 30 | evsel = perf_evsel__newtp("syscalls", "sys_enter_open"); |
| 31 | if (evsel == NULL) { | 31 | if (evsel == NULL) { |
| 32 | pr_debug("is debugfs mounted on /sys/kernel/debug?\n"); | 32 | if (tracefs_configured()) |
| 33 | pr_debug("is tracefs mounted on /sys/kernel/tracing?\n"); | ||
| 34 | else if (debugfs_configured()) | ||
| 35 | pr_debug("is debugfs mounted on /sys/kernel/debug?\n"); | ||
| 36 | else | ||
| 37 | pr_debug("Neither tracefs or debugfs is enabled in this kernel\n"); | ||
| 33 | goto out_thread_map_delete; | 38 | goto out_thread_map_delete; |
| 34 | } | 39 | } |
| 35 | 40 | ||
diff --git a/tools/perf/tests/open-syscall.c b/tools/perf/tests/open-syscall.c index a33b2daae40f..07aa319bf334 100644 --- a/tools/perf/tests/open-syscall.c +++ b/tools/perf/tests/open-syscall.c | |||
| @@ -18,7 +18,12 @@ int test__open_syscall_event(void) | |||
| 18 | 18 | ||
| 19 | evsel = perf_evsel__newtp("syscalls", "sys_enter_open"); | 19 | evsel = perf_evsel__newtp("syscalls", "sys_enter_open"); |
| 20 | if (evsel == NULL) { | 20 | if (evsel == NULL) { |
| 21 | pr_debug("is debugfs mounted on /sys/kernel/debug?\n"); | 21 | if (tracefs_configured()) |
| 22 | pr_debug("is tracefs mounted on /sys/kernel/tracing?\n"); | ||
| 23 | else if (debugfs_configured()) | ||
| 24 | pr_debug("is debugfs mounted on /sys/kernel/debug?\n"); | ||
| 25 | else | ||
| 26 | pr_debug("Neither tracefs or debugfs is enabled in this kernel\n"); | ||
| 22 | goto out_thread_map_delete; | 27 | goto out_thread_map_delete; |
| 23 | } | 28 | } |
| 24 | 29 | ||
diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c index 1cdab0ce00e2..ac243ebcb20a 100644 --- a/tools/perf/tests/parse-events.c +++ b/tools/perf/tests/parse-events.c | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | #include "evsel.h" | 3 | #include "evsel.h" |
| 4 | #include "evlist.h" | 4 | #include "evlist.h" |
| 5 | #include <api/fs/fs.h> | 5 | #include <api/fs/fs.h> |
| 6 | #include <api/fs/tracefs.h> | ||
| 6 | #include <api/fs/debugfs.h> | 7 | #include <api/fs/debugfs.h> |
| 7 | #include "tests.h" | 8 | #include "tests.h" |
| 8 | #include "debug.h" | 9 | #include "debug.h" |
| @@ -1192,11 +1193,19 @@ static int count_tracepoints(void) | |||
| 1192 | { | 1193 | { |
| 1193 | char events_path[PATH_MAX]; | 1194 | char events_path[PATH_MAX]; |
| 1194 | struct dirent *events_ent; | 1195 | struct dirent *events_ent; |
| 1196 | const char *mountpoint; | ||
| 1195 | DIR *events_dir; | 1197 | DIR *events_dir; |
| 1196 | int cnt = 0; | 1198 | int cnt = 0; |
| 1197 | 1199 | ||
| 1198 | scnprintf(events_path, PATH_MAX, "%s/tracing/events", | 1200 | mountpoint = tracefs_find_mountpoint(); |
| 1199 | debugfs_find_mountpoint()); | 1201 | if (mountpoint) { |
| 1202 | scnprintf(events_path, PATH_MAX, "%s/events", | ||
| 1203 | mountpoint); | ||
| 1204 | } else { | ||
| 1205 | mountpoint = debugfs_find_mountpoint(); | ||
| 1206 | scnprintf(events_path, PATH_MAX, "%s/tracing/events", | ||
| 1207 | mountpoint); | ||
| 1208 | } | ||
| 1200 | 1209 | ||
| 1201 | events_dir = opendir(events_path); | 1210 | events_dir = opendir(events_path); |
| 1202 | 1211 | ||
diff --git a/tools/perf/util/cache.h b/tools/perf/util/cache.h index d04d770d90f6..fbcca21d66ab 100644 --- a/tools/perf/util/cache.h +++ b/tools/perf/util/cache.h | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #define EXEC_PATH_ENVIRONMENT "PERF_EXEC_PATH" | 17 | #define EXEC_PATH_ENVIRONMENT "PERF_EXEC_PATH" |
| 18 | #define DEFAULT_PERF_DIR_ENVIRONMENT ".perf" | 18 | #define DEFAULT_PERF_DIR_ENVIRONMENT ".perf" |
| 19 | #define PERF_DEBUGFS_ENVIRONMENT "PERF_DEBUGFS_DIR" | 19 | #define PERF_DEBUGFS_ENVIRONMENT "PERF_DEBUGFS_DIR" |
| 20 | #define PERF_TRACEFS_ENVIRONMENT "PERF_TRACEFS_DIR" | ||
| 20 | 21 | ||
| 21 | typedef int (*config_fn_t)(const char *, const char *, void *); | 22 | typedef int (*config_fn_t)(const char *, const char *, void *); |
| 22 | extern int perf_default_config(const char *, const char *, void *); | 23 | extern int perf_default_config(const char *, const char *, void *); |
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index c602ebb5b991..a8b2c5726aba 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
| @@ -7,7 +7,6 @@ | |||
| 7 | * Released under the GPL v2. (and only v2, not any later version) | 7 | * Released under the GPL v2. (and only v2, not any later version) |
| 8 | */ | 8 | */ |
| 9 | #include "util.h" | 9 | #include "util.h" |
| 10 | #include <api/fs/debugfs.h> | ||
| 11 | #include <api/fs/fs.h> | 10 | #include <api/fs/fs.h> |
| 12 | #include <poll.h> | 11 | #include <poll.h> |
| 13 | #include "cpumap.h" | 12 | #include "cpumap.h" |
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index ff6e1fa4111e..39c3b57965d1 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h | |||
| @@ -122,6 +122,6 @@ void print_tracepoint_events(const char *subsys_glob, const char *event_glob, | |||
| 122 | int print_hwcache_events(const char *event_glob, bool name_only); | 122 | int print_hwcache_events(const char *event_glob, bool name_only); |
| 123 | extern int is_valid_tracepoint(const char *event_string); | 123 | extern int is_valid_tracepoint(const char *event_string); |
| 124 | 124 | ||
| 125 | extern int valid_debugfs_mount(const char *debugfs); | 125 | int valid_event_mount(const char *eventfs); |
| 126 | 126 | ||
| 127 | #endif /* __PERF_PARSE_EVENTS_H */ | 127 | #endif /* __PERF_PARSE_EVENTS_H */ |
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 919937eb0be2..9dfbed96bf39 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
| @@ -41,6 +41,7 @@ | |||
| 41 | #include "symbol.h" | 41 | #include "symbol.h" |
| 42 | #include "thread.h" | 42 | #include "thread.h" |
| 43 | #include <api/fs/debugfs.h> | 43 | #include <api/fs/debugfs.h> |
| 44 | #include <api/fs/tracefs.h> | ||
| 44 | #include "trace-event.h" /* For __maybe_unused */ | 45 | #include "trace-event.h" /* For __maybe_unused */ |
| 45 | #include "probe-event.h" | 46 | #include "probe-event.h" |
| 46 | #include "probe-finder.h" | 47 | #include "probe-finder.h" |
| @@ -1805,7 +1806,7 @@ static void print_open_warning(int err, bool is_kprobe) | |||
| 1805 | " - please rebuild kernel with %s.\n", | 1806 | " - please rebuild kernel with %s.\n", |
| 1806 | is_kprobe ? 'k' : 'u', config); | 1807 | is_kprobe ? 'k' : 'u', config); |
| 1807 | } else if (err == -ENOTSUP) | 1808 | } else if (err == -ENOTSUP) |
| 1808 | pr_warning("Debugfs is not mounted.\n"); | 1809 | pr_warning("Tracefs or debugfs is not mounted.\n"); |
| 1809 | else | 1810 | else |
| 1810 | pr_warning("Failed to open %cprobe_events: %s\n", | 1811 | pr_warning("Failed to open %cprobe_events: %s\n", |
| 1811 | is_kprobe ? 'k' : 'u', | 1812 | is_kprobe ? 'k' : 'u', |
| @@ -1816,7 +1817,7 @@ static void print_both_open_warning(int kerr, int uerr) | |||
| 1816 | { | 1817 | { |
| 1817 | /* Both kprobes and uprobes are disabled, warn it. */ | 1818 | /* Both kprobes and uprobes are disabled, warn it. */ |
| 1818 | if (kerr == -ENOTSUP && uerr == -ENOTSUP) | 1819 | if (kerr == -ENOTSUP && uerr == -ENOTSUP) |
| 1819 | pr_warning("Debugfs is not mounted.\n"); | 1820 | pr_warning("Tracefs or debugfs is not mounted.\n"); |
| 1820 | else if (kerr == -ENOENT && uerr == -ENOENT) | 1821 | else if (kerr == -ENOENT && uerr == -ENOENT) |
| 1821 | pr_warning("Please rebuild kernel with CONFIG_KPROBE_EVENTS " | 1822 | pr_warning("Please rebuild kernel with CONFIG_KPROBE_EVENTS " |
| 1822 | "or/and CONFIG_UPROBE_EVENTS.\n"); | 1823 | "or/and CONFIG_UPROBE_EVENTS.\n"); |
| @@ -1833,13 +1834,20 @@ static int open_probe_events(const char *trace_file, bool readwrite) | |||
| 1833 | { | 1834 | { |
| 1834 | char buf[PATH_MAX]; | 1835 | char buf[PATH_MAX]; |
| 1835 | const char *__debugfs; | 1836 | const char *__debugfs; |
| 1837 | const char *tracing_dir = ""; | ||
| 1836 | int ret; | 1838 | int ret; |
| 1837 | 1839 | ||
| 1838 | __debugfs = debugfs_find_mountpoint(); | 1840 | __debugfs = tracefs_find_mountpoint(); |
| 1839 | if (__debugfs == NULL) | 1841 | if (__debugfs == NULL) { |
| 1840 | return -ENOTSUP; | 1842 | tracing_dir = "tracing/"; |
| 1841 | 1843 | ||
| 1842 | ret = e_snprintf(buf, PATH_MAX, "%s/%s", __debugfs, trace_file); | 1844 | __debugfs = debugfs_find_mountpoint(); |
| 1845 | if (__debugfs == NULL) | ||
| 1846 | return -ENOTSUP; | ||
| 1847 | } | ||
| 1848 | |||
| 1849 | ret = e_snprintf(buf, PATH_MAX, "%s/%s%s", | ||
| 1850 | __debugfs, tracing_dir, trace_file); | ||
| 1843 | if (ret >= 0) { | 1851 | if (ret >= 0) { |
| 1844 | pr_debug("Opening %s write=%d\n", buf, readwrite); | 1852 | pr_debug("Opening %s write=%d\n", buf, readwrite); |
| 1845 | if (readwrite && !probe_event_dry_run) | 1853 | if (readwrite && !probe_event_dry_run) |
| @@ -1855,12 +1863,12 @@ static int open_probe_events(const char *trace_file, bool readwrite) | |||
| 1855 | 1863 | ||
| 1856 | static int open_kprobe_events(bool readwrite) | 1864 | static int open_kprobe_events(bool readwrite) |
| 1857 | { | 1865 | { |
| 1858 | return open_probe_events("tracing/kprobe_events", readwrite); | 1866 | return open_probe_events("kprobe_events", readwrite); |
| 1859 | } | 1867 | } |
| 1860 | 1868 | ||
| 1861 | static int open_uprobe_events(bool readwrite) | 1869 | static int open_uprobe_events(bool readwrite) |
| 1862 | { | 1870 | { |
| 1863 | return open_probe_events("tracing/uprobe_events", readwrite); | 1871 | return open_probe_events("uprobe_events", readwrite); |
| 1864 | } | 1872 | } |
| 1865 | 1873 | ||
| 1866 | /* Get raw string list of current kprobe_events or uprobe_events */ | 1874 | /* Get raw string list of current kprobe_events or uprobe_events */ |
diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c index b86744f29eef..92db3f156b63 100644 --- a/tools/perf/util/util.c +++ b/tools/perf/util/util.c | |||
| @@ -303,13 +303,26 @@ void set_term_quiet_input(struct termios *old) | |||
| 303 | tcsetattr(0, TCSANOW, &tc); | 303 | tcsetattr(0, TCSANOW, &tc); |
| 304 | } | 304 | } |
| 305 | 305 | ||
| 306 | static void set_tracing_events_path(const char *mountpoint) | 306 | static void set_tracing_events_path(const char *tracing, const char *mountpoint) |
| 307 | { | 307 | { |
| 308 | snprintf(tracing_events_path, sizeof(tracing_events_path), "%s/%s", | 308 | snprintf(tracing_events_path, sizeof(tracing_events_path), "%s/%s%s", |
| 309 | mountpoint, "tracing/events"); | 309 | mountpoint, tracing, "events"); |
| 310 | } | 310 | } |
| 311 | 311 | ||
| 312 | const char *perf_debugfs_mount(const char *mountpoint) | 312 | static const char *__perf_tracefs_mount(const char *mountpoint) |
| 313 | { | ||
| 314 | const char *mnt; | ||
| 315 | |||
| 316 | mnt = tracefs_mount(mountpoint); | ||
| 317 | if (!mnt) | ||
| 318 | return NULL; | ||
| 319 | |||
| 320 | set_tracing_events_path("", mnt); | ||
| 321 | |||
| 322 | return mnt; | ||
| 323 | } | ||
| 324 | |||
| 325 | static const char *__perf_debugfs_mount(const char *mountpoint) | ||
| 313 | { | 326 | { |
| 314 | const char *mnt; | 327 | const char *mnt; |
| 315 | 328 | ||
| @@ -317,7 +330,20 @@ const char *perf_debugfs_mount(const char *mountpoint) | |||
| 317 | if (!mnt) | 330 | if (!mnt) |
| 318 | return NULL; | 331 | return NULL; |
| 319 | 332 | ||
| 320 | set_tracing_events_path(mnt); | 333 | set_tracing_events_path("tracing/", mnt); |
| 334 | |||
| 335 | return mnt; | ||
| 336 | } | ||
| 337 | |||
| 338 | const char *perf_debugfs_mount(const char *mountpoint) | ||
| 339 | { | ||
| 340 | const char *mnt; | ||
| 341 | |||
| 342 | mnt = __perf_tracefs_mount(mountpoint); | ||
| 343 | if (mnt) | ||
| 344 | return mnt; | ||
| 345 | |||
| 346 | mnt = __perf_debugfs_mount(mountpoint); | ||
| 321 | 347 | ||
| 322 | return mnt; | 348 | return mnt; |
| 323 | } | 349 | } |
| @@ -325,12 +351,19 @@ const char *perf_debugfs_mount(const char *mountpoint) | |||
| 325 | void perf_debugfs_set_path(const char *mntpt) | 351 | void perf_debugfs_set_path(const char *mntpt) |
| 326 | { | 352 | { |
| 327 | snprintf(debugfs_mountpoint, strlen(debugfs_mountpoint), "%s", mntpt); | 353 | snprintf(debugfs_mountpoint, strlen(debugfs_mountpoint), "%s", mntpt); |
| 328 | set_tracing_events_path(mntpt); | 354 | set_tracing_events_path("tracing/", mntpt); |
| 355 | } | ||
| 356 | |||
| 357 | static const char *find_tracefs(void) | ||
| 358 | { | ||
| 359 | const char *path = __perf_tracefs_mount(NULL); | ||
| 360 | |||
| 361 | return path; | ||
| 329 | } | 362 | } |
| 330 | 363 | ||
| 331 | static const char *find_debugfs(void) | 364 | static const char *find_debugfs(void) |
| 332 | { | 365 | { |
| 333 | const char *path = perf_debugfs_mount(NULL); | 366 | const char *path = __perf_debugfs_mount(NULL); |
| 334 | 367 | ||
| 335 | if (!path) | 368 | if (!path) |
| 336 | fprintf(stderr, "Your kernel does not support the debugfs filesystem"); | 369 | fprintf(stderr, "Your kernel does not support the debugfs filesystem"); |
| @@ -344,6 +377,7 @@ static const char *find_debugfs(void) | |||
| 344 | */ | 377 | */ |
| 345 | const char *find_tracing_dir(void) | 378 | const char *find_tracing_dir(void) |
| 346 | { | 379 | { |
| 380 | const char *tracing_dir = ""; | ||
| 347 | static char *tracing; | 381 | static char *tracing; |
| 348 | static int tracing_found; | 382 | static int tracing_found; |
| 349 | const char *debugfs; | 383 | const char *debugfs; |
| @@ -351,11 +385,15 @@ const char *find_tracing_dir(void) | |||
| 351 | if (tracing_found) | 385 | if (tracing_found) |
| 352 | return tracing; | 386 | return tracing; |
| 353 | 387 | ||
| 354 | debugfs = find_debugfs(); | 388 | debugfs = find_tracefs(); |
| 355 | if (!debugfs) | 389 | if (!debugfs) { |
| 356 | return NULL; | 390 | tracing_dir = "/tracing"; |
| 391 | debugfs = find_debugfs(); | ||
| 392 | if (!debugfs) | ||
| 393 | return NULL; | ||
| 394 | } | ||
| 357 | 395 | ||
| 358 | if (asprintf(&tracing, "%s/tracing", debugfs) < 0) | 396 | if (asprintf(&tracing, "%s%s", debugfs, tracing_dir) < 0) |
| 359 | return NULL; | 397 | return NULL; |
| 360 | 398 | ||
| 361 | tracing_found = 1; | 399 | tracing_found = 1; |
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index 027a5153495c..73c2f8e557ab 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h | |||
| @@ -75,6 +75,7 @@ | |||
| 75 | #include <linux/types.h> | 75 | #include <linux/types.h> |
| 76 | #include <sys/ttydefaults.h> | 76 | #include <sys/ttydefaults.h> |
| 77 | #include <api/fs/debugfs.h> | 77 | #include <api/fs/debugfs.h> |
| 78 | #include <api/fs/tracefs.h> | ||
| 78 | #include <termios.h> | 79 | #include <termios.h> |
| 79 | #include <linux/bitops.h> | 80 | #include <linux/bitops.h> |
| 80 | #include <termios.h> | 81 | #include <termios.h> |
