perf tools: Add cpu_map processor socket level functions
This patch adds: - cpu_map__get_socket: get socked id from cpu - cpu_map__build_socket_map: build socket map - cpu_map__socket: gets acutal socket from logical socket Those functions are used by uncore and processor socket-level aggregation modes. Signed-off-by: Stephane Eranian <eranian@google.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung.kim@lge.com> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1360161962-9675-2-git-send-email-eranian@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
0479b8b9cf
commit
5ac59a8a77
2 changed files with 63 additions and 0 deletions
|
@ -1,4 +1,5 @@
|
|||
#include "util.h"
|
||||
#include "sysfs.h"
|
||||
#include "../perf.h"
|
||||
#include "cpumap.h"
|
||||
#include <assert.h>
|
||||
|
@ -201,3 +202,56 @@ void cpu_map__delete(struct cpu_map *map)
|
|||
{
|
||||
free(map);
|
||||
}
|
||||
|
||||
int cpu_map__get_socket(struct cpu_map *map, int idx)
|
||||
{
|
||||
FILE *fp;
|
||||
const char *mnt;
|
||||
char path[PATH_MAX];
|
||||
int cpu, ret;
|
||||
|
||||
if (idx > map->nr)
|
||||
return -1;
|
||||
|
||||
cpu = map->map[idx];
|
||||
|
||||
mnt = sysfs_find_mountpoint();
|
||||
if (!mnt)
|
||||
return -1;
|
||||
|
||||
sprintf(path,
|
||||
"%s/devices/system/cpu/cpu%d/topology/physical_package_id",
|
||||
mnt, cpu);
|
||||
|
||||
fp = fopen(path, "r");
|
||||
if (!fp)
|
||||
return -1;
|
||||
ret = fscanf(fp, "%d", &cpu);
|
||||
fclose(fp);
|
||||
return ret == 1 ? cpu : -1;
|
||||
}
|
||||
|
||||
int cpu_map__build_socket_map(struct cpu_map *cpus, struct cpu_map **sockp)
|
||||
{
|
||||
struct cpu_map *sock;
|
||||
int nr = cpus->nr;
|
||||
int cpu, s1, s2;
|
||||
|
||||
sock = calloc(1, sizeof(*sock) + nr * sizeof(int));
|
||||
if (!sock)
|
||||
return -1;
|
||||
|
||||
for (cpu = 0; cpu < nr; cpu++) {
|
||||
s1 = cpu_map__get_socket(cpus, cpu);
|
||||
for (s2 = 0; s2 < sock->nr; s2++) {
|
||||
if (s1 == sock->map[s2])
|
||||
break;
|
||||
}
|
||||
if (s2 == sock->nr) {
|
||||
sock->map[sock->nr] = s1;
|
||||
sock->nr++;
|
||||
}
|
||||
}
|
||||
*sockp = sock;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -14,6 +14,15 @@ 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);
|
||||
int cpu_map__build_socket_map(struct cpu_map *cpus, struct cpu_map **sockp);
|
||||
|
||||
static inline int cpu_map__socket(struct cpu_map *sock, int s)
|
||||
{
|
||||
if (!sock || s > sock->nr || s < 0)
|
||||
return 0;
|
||||
return sock->map[s];
|
||||
}
|
||||
|
||||
static inline int cpu_map__nr(const struct cpu_map *map)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue