diff options
Diffstat (limited to 'tools/lib/api/fs/tracefs.c')
| -rw-r--r-- | tools/lib/api/fs/tracefs.c | 78 | 
1 files changed, 78 insertions, 0 deletions
diff --git a/tools/lib/api/fs/tracefs.c b/tools/lib/api/fs/tracefs.c new file mode 100644 index 000000000000..e4aa9688b71e --- /dev/null +++ b/tools/lib/api/fs/tracefs.c @@ -0,0 +1,78 @@ +#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; +}  |