| #include <errno.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <unistd.h> | |
| #include <stdbool.h> | |
| #include <sys/vfs.h> | |
| #include <sys/types.h> | |
| #include <sys/stat.h> | |
| #include <sys/mount.h> | |
| #include <linux/kernel.h> | |
| #include "tracefs.h" | |
| #ifndef TRACEFS_DEFAULT_PATH | |
| #define TRACEFS_DEFAULT_PATH "/sys/kernel/tracing" | |
| #endif | |
| char tracefs_mountpoint[PATH_MAX + 1] = TRACEFS_DEFAULT_PATH; | |
| static const char * const tracefs_known_mountpoints[] = { | |
| TRACEFS_DEFAULT_PATH, | |
| "/sys/kernel/debug/tracing", | |
| "/tracing", | |
| "/trace", | |
| 0, | |
| }; | |
| static bool tracefs_found; | |
| bool tracefs_configured(void) | |
| { | |
| return tracefs_find_mountpoint() != NULL; | |
| } | |
| /* find the path to the mounted tracefs */ | |
| const char *tracefs_find_mountpoint(void) | |
| { | |
| const char *ret; | |
| if (tracefs_found) | |
| return (const char *)tracefs_mountpoint; | |
| ret = find_mountpoint("tracefs", (long) TRACEFS_MAGIC, | |
| tracefs_mountpoint, PATH_MAX + 1, | |
| tracefs_known_mountpoints); | |
| if (ret) | |
| tracefs_found = true; | |
| return ret; | |
| } | |
| /* mount the tracefs somewhere if it's not mounted */ | |
| char *tracefs_mount(const char *mountpoint) | |
| { | |
| /* see if it's already mounted */ | |
| if (tracefs_find_mountpoint()) | |
| goto out; | |
| /* if not mounted and no argument */ | |
| if (mountpoint == NULL) { | |
| /* see if environment variable set */ | |
| mountpoint = getenv(PERF_TRACEFS_ENVIRONMENT); | |
| /* if no environment variable, use default */ | |
| if (mountpoint == NULL) | |
| mountpoint = TRACEFS_DEFAULT_PATH; | |
| } | |
| if (mount(NULL, mountpoint, "tracefs", 0, NULL) < 0) | |
| return NULL; | |
| /* save the mountpoint */ | |
| tracefs_found = true; | |
| strncpy(tracefs_mountpoint, mountpoint, sizeof(tracefs_mountpoint)); | |
| out: | |
| return tracefs_mountpoint; | |
| } |