Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / tools / lib / api / fs / tracefs.c
diff --git a/kernel/tools/lib/api/fs/tracefs.c b/kernel/tools/lib/api/fs/tracefs.c
new file mode 100644 (file)
index 0000000..e4aa968
--- /dev/null
@@ -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;
+}