Linux Audio

Check our new training course

Loading...
  1#include "util.h"
  2#include "debugfs.h"
  3#include "cache.h"
  4
  5#include <linux/kernel.h>
  6#include <sys/mount.h>
  7
  8static int debugfs_premounted;
  9char debugfs_mountpoint[PATH_MAX + 1] = "/sys/kernel/debug";
 10char tracing_events_path[PATH_MAX + 1] = "/sys/kernel/debug/tracing/events";
 11
 12static const char *debugfs_known_mountpoints[] = {
 13	"/sys/kernel/debug/",
 14	"/debug/",
 15	0,
 16};
 17
 18static int debugfs_found;
 19
 20/* find the path to the mounted debugfs */
 21const char *debugfs_find_mountpoint(void)
 22{
 23	const char **ptr;
 24	char type[100];
 25	FILE *fp;
 26
 27	if (debugfs_found)
 28		return (const char *) debugfs_mountpoint;
 29
 30	ptr = debugfs_known_mountpoints;
 31	while (*ptr) {
 32		if (debugfs_valid_mountpoint(*ptr) == 0) {
 33			debugfs_found = 1;
 34			strcpy(debugfs_mountpoint, *ptr);
 35			return debugfs_mountpoint;
 36		}
 37		ptr++;
 38	}
 39
 40	/* give up and parse /proc/mounts */
 41	fp = fopen("/proc/mounts", "r");
 42	if (fp == NULL)
 43		return NULL;
 44
 45	while (fscanf(fp, "%*s %" STR(PATH_MAX) "s %99s %*s %*d %*d\n",
 46		      debugfs_mountpoint, type) == 2) {
 47		if (strcmp(type, "debugfs") == 0)
 48			break;
 49	}
 50	fclose(fp);
 51
 52	if (strcmp(type, "debugfs") != 0)
 53		return NULL;
 54
 55	debugfs_found = 1;
 56
 57	return debugfs_mountpoint;
 58}
 59
 60/* verify that a mountpoint is actually a debugfs instance */
 61
 62int debugfs_valid_mountpoint(const char *debugfs)
 63{
 64	struct statfs st_fs;
 65
 66	if (statfs(debugfs, &st_fs) < 0)
 67		return -ENOENT;
 68	else if (st_fs.f_type != (long) DEBUGFS_MAGIC)
 69		return -ENOENT;
 70
 71	return 0;
 72}
 73
 74static void debugfs_set_tracing_events_path(const char *mountpoint)
 75{
 76	snprintf(tracing_events_path, sizeof(tracing_events_path), "%s/%s",
 77		 mountpoint, "tracing/events");
 78}
 79
 80/* mount the debugfs somewhere if it's not mounted */
 81
 82char *debugfs_mount(const char *mountpoint)
 83{
 84	/* see if it's already mounted */
 85	if (debugfs_find_mountpoint()) {
 86		debugfs_premounted = 1;
 87		goto out;
 88	}
 89
 90	/* if not mounted and no argument */
 91	if (mountpoint == NULL) {
 92		/* see if environment variable set */
 93		mountpoint = getenv(PERF_DEBUGFS_ENVIRONMENT);
 94		/* if no environment variable, use default */
 95		if (mountpoint == NULL)
 96			mountpoint = "/sys/kernel/debug";
 97	}
 98
 99	if (mount(NULL, mountpoint, "debugfs", 0, NULL) < 0)
100		return NULL;
101
102	/* save the mountpoint */
103	debugfs_found = 1;
104	strncpy(debugfs_mountpoint, mountpoint, sizeof(debugfs_mountpoint));
105out:
106	debugfs_set_tracing_events_path(debugfs_mountpoint);
107	return debugfs_mountpoint;
108}
109
110void debugfs_set_path(const char *mountpoint)
111{
112	snprintf(debugfs_mountpoint, sizeof(debugfs_mountpoint), "%s", mountpoint);
113	debugfs_set_tracing_events_path(mountpoint);
114}