mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 10:49:33 +00:00
perf tools: Add sysfs mountpoint interface
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>
This commit is contained in:
parent
2837609fef
commit
e90fda0635
3 changed files with 68 additions and 0 deletions
|
@ -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
|
||||
|
|
60
tools/perf/util/sysfs.c
Normal file
60
tools/perf/util/sysfs.c
Normal file
|
@ -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;
|
||||
}
|
6
tools/perf/util/sysfs.h
Normal file
6
tools/perf/util/sysfs.h
Normal file
|
@ -0,0 +1,6 @@
|
|||
#ifndef __SYSFS_H__
|
||||
#define __SYSFS_H__
|
||||
|
||||
const char *sysfs_find_mountpoint(void);
|
||||
|
||||
#endif /* __DEBUGFS_H__ */
|
Loading…
Reference in a new issue