forked from Minki/linux
4ef92c2ecd
Since tracefs will now hold the event directory for perf, and even though by default, debugfs still mounts tracefs on the debugfs/tracing directory, the system admin may now choose to not mount debugfs and instead just mount tracefs instead. Having tracefs helper functions will facilitate having perf look for tracefs first, and then try debugfs as a fallback. Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Acked-by: Jiri 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/20150202193552.898934751@goodmis.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
71 lines
1.5 KiB
C
71 lines
1.5 KiB
C
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdbool.h>
|
|
#include <sys/vfs.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;
|
|
|
|
/* 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;
|
|
}
|