aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/pmu.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/pmu.c')
-rw-r--r--tools/perf/util/pmu.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index 438bb261f391..22a4ad5a927a 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -3,6 +3,7 @@
3#include <unistd.h> 3#include <unistd.h>
4#include <stdio.h> 4#include <stdio.h>
5#include <stdbool.h> 5#include <stdbool.h>
6#include <stdarg.h>
6#include <dirent.h> 7#include <dirent.h>
7#include <api/fs/fs.h> 8#include <api/fs/fs.h>
8#include <locale.h> 9#include <locale.h>
@@ -804,3 +805,39 @@ bool pmu_have_event(const char *pname, const char *name)
804 } 805 }
805 return false; 806 return false;
806} 807}
808
809static FILE *perf_pmu__open_file(struct perf_pmu *pmu, const char *name)
810{
811 struct stat st;
812 char path[PATH_MAX];
813 const char *sysfs;
814
815 sysfs = sysfs__mountpoint();
816 if (!sysfs)
817 return NULL;
818
819 snprintf(path, PATH_MAX,
820 "%s" EVENT_SOURCE_DEVICE_PATH "%s/%s", sysfs, pmu->name, name);
821
822 if (stat(path, &st) < 0)
823 return NULL;
824
825 return fopen(path, "r");
826}
827
828int perf_pmu__scan_file(struct perf_pmu *pmu, const char *name, const char *fmt,
829 ...)
830{
831 va_list args;
832 FILE *file;
833 int ret = EOF;
834
835 va_start(args, fmt);
836 file = perf_pmu__open_file(pmu, name);
837 if (file) {
838 ret = vfscanf(file, fmt, args);
839 fclose(file);
840 }
841 va_end(args);
842 return ret;
843}