Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 350062
b: refs/heads/master
c: 5ac59a8
h: refs/heads/master
v: v3
  • Loading branch information
Stephane Eranian authored and Arnaldo Carvalho de Melo committed Feb 6, 2013
1 parent 1dd7067 commit b956c0b
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0479b8b9cf4377df5d2c81506ce93326c31eff40
refs/heads/master: 5ac59a8a77e3faa1eaf9bfe82a61e9396b082c3d
54 changes: 54 additions & 0 deletions trunk/tools/perf/util/cpumap.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "util.h"
#include "sysfs.h"
#include "../perf.h"
#include "cpumap.h"
#include <assert.h>
Expand Down Expand Up @@ -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;
}
9 changes: 9 additions & 0 deletions trunk/tools/perf/util/cpumap.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down

0 comments on commit b956c0b

Please sign in to comment.