perf tools: Add sysfs mountpoint interface
authorJiri Olsa <jolsa@redhat.com>
Fri, 27 Jan 2012 14:34:22 +0000 (15:34 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 14 Feb 2012 01:27:15 +0000 (23:27 -0200)
Adding sysfs object to provide sysfs mount information in the same way
as debugfs object does.

The object provides following function:
  sysfs_find_mountpoint

which returns the sysfs mount mount.

Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1327674868-10486-4-git-send-email-jolsa@redhat.com
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Makefile
tools/perf/util/sysfs.c [new file with mode: 0644]
tools/perf/util/sysfs.h [new file with mode: 0644]

index 8359fa140d2d8c5e30d356688fb5b23230643be8..e011b5060f922bc6e714ef7ec944b85d141d9386 100644 (file)
@@ -259,6 +259,7 @@ LIB_H += util/callchain.h
 LIB_H += util/build-id.h
 LIB_H += util/debug.h
 LIB_H += util/debugfs.h
+LIB_H += util/sysfs.h
 LIB_H += util/event.h
 LIB_H += util/evsel.h
 LIB_H += util/evlist.h
@@ -305,6 +306,7 @@ LIB_OBJS += $(OUTPUT)util/build-id.o
 LIB_OBJS += $(OUTPUT)util/config.o
 LIB_OBJS += $(OUTPUT)util/ctype.o
 LIB_OBJS += $(OUTPUT)util/debugfs.o
+LIB_OBJS += $(OUTPUT)util/sysfs.o
 LIB_OBJS += $(OUTPUT)util/environment.o
 LIB_OBJS += $(OUTPUT)util/event.o
 LIB_OBJS += $(OUTPUT)util/evlist.o
diff --git a/tools/perf/util/sysfs.c b/tools/perf/util/sysfs.c
new file mode 100644 (file)
index 0000000..48c6902
--- /dev/null
@@ -0,0 +1,60 @@
+
+#include "util.h"
+#include "sysfs.h"
+
+static const char * const sysfs_known_mountpoints[] = {
+       "/sys",
+       0,
+};
+
+static int sysfs_found;
+char sysfs_mountpoint[PATH_MAX];
+
+static int sysfs_valid_mountpoint(const char *sysfs)
+{
+       struct statfs st_fs;
+
+       if (statfs(sysfs, &st_fs) < 0)
+               return -ENOENT;
+       else if (st_fs.f_type != (long) SYSFS_MAGIC)
+               return -ENOENT;
+
+       return 0;
+}
+
+const char *sysfs_find_mountpoint(void)
+{
+       const char * const *ptr;
+       char type[100];
+       FILE *fp;
+
+       if (sysfs_found)
+               return (const char *) sysfs_mountpoint;
+
+       ptr = sysfs_known_mountpoints;
+       while (*ptr) {
+               if (sysfs_valid_mountpoint(*ptr) == 0) {
+                       sysfs_found = 1;
+                       strcpy(sysfs_mountpoint, *ptr);
+                       return sysfs_mountpoint;
+               }
+               ptr++;
+       }
+
+       /* give up and parse /proc/mounts */
+       fp = fopen("/proc/mounts", "r");
+       if (fp == NULL)
+               return NULL;
+
+       while (!sysfs_found &&
+              fscanf(fp, "%*s %" STR(PATH_MAX) "s %99s %*s %*d %*d\n",
+                     sysfs_mountpoint, type) == 2) {
+
+               if (strcmp(type, "sysfs") == 0)
+                       sysfs_found = 1;
+       }
+
+       fclose(fp);
+
+       return sysfs_found ? sysfs_mountpoint : NULL;
+}
diff --git a/tools/perf/util/sysfs.h b/tools/perf/util/sysfs.h
new file mode 100644 (file)
index 0000000..a813b72
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __SYSFS_H__
+#define __SYSFS_H__
+
+const char *sysfs_find_mountpoint(void);
+
+#endif /* __DEBUGFS_H__ */