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
|
@ -1,4 +1,5 @@
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include "sysfs.h"
|
||||||
#include "../perf.h"
|
#include "../perf.h"
|
||||||
#include "cpumap.h"
|
#include "cpumap.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
@ -201,3 +202,56 @@ void cpu_map__delete(struct cpu_map *map)
|
||||||
{
|
{
|
||||||
free(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);
|
void cpu_map__delete(struct cpu_map *map);
|
||||||
struct cpu_map *cpu_map__read(FILE *file);
|
struct cpu_map *cpu_map__read(FILE *file);
|
||||||
size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp);
|
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)
|
static inline int cpu_map__nr(const struct cpu_map *map)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue