Messages in this thread Patch in this message | | | From | Stephane Eranian <> | Subject | [PATCH 1/2] perf tools: add cpu_map__get_socket() | Date | Thu, 31 Jan 2013 14:54:38 +0100 |
| |
To get the socket number associated with a CPU. Useful for uncore output.
Signed-off-by: Stephane Eranian <eranian@google.com> --- tools/perf/util/cpumap.c | 26 ++++++++++++++++++++++++++ tools/perf/util/cpumap.h | 1 + 2 files changed, 27 insertions(+)
diff --git a/tools/perf/util/cpumap.c b/tools/perf/util/cpumap.c index 2b32ffa..adb2e9c 100644 --- a/tools/perf/util/cpumap.c +++ b/tools/perf/util/cpumap.c @@ -1,4 +1,5 @@ #include "util.h" +#include "sysfs.h" #include "../perf.h" #include "cpumap.h" #include <assert.h> @@ -201,3 +202,28 @@ void cpu_map__delete(struct cpu_map *map) { free(map); } + +int cpu_map__get_socket(struct cpu_map *map, int idx) +{ + FILE *fp; + char path[PATH_MAX]; + const char *sysfs; + int cpu, ret; + + if (idx > map->nr) + return -1; + + cpu = map->map[idx]; + + sysfs = sysfs_find_mountpoint(); + if (!sysfs) + return -1; + + sprintf(path, "%s/devices/system/cpu/cpu%d/topology/physical_package_id", sysfs, cpu); + fp = fopen(path, "r"); + if (!fp) + return -1; + ret = fscanf(fp, "%d", &cpu); + fclose(fp); + return ret == 1 ? cpu : -1; +} diff --git a/tools/perf/util/cpumap.h b/tools/perf/util/cpumap.h index 2f68a3b..0178e49 100644 --- a/tools/perf/util/cpumap.h +++ b/tools/perf/util/cpumap.h @@ -14,6 +14,7 @@ struct cpu_map *cpu_map__dummy_new(void); void cpu_map__delete(struct cpu_map *map); struct cpu_map *cpu_map__read(FILE *file); size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp); +int cpu_map__get_socket(struct cpu_map *map, int idx); static inline int cpu_map__nr(const struct cpu_map *map) { -- 1.7.10.4
| |