perf env: Add perf_env__numa_node()
[linux-2.6-microblaze.git] / tools / perf / util / env.c
index 2a91a10..6242a92 100644 (file)
@@ -180,6 +180,7 @@ void perf_env__exit(struct perf_env *env)
        zfree(&env->sibling_threads);
        zfree(&env->pmu_mappings);
        zfree(&env->cpu);
+       zfree(&env->numa_map);
 
        for (i = 0; i < env->nr_numa_nodes; i++)
                perf_cpu_map__put(env->numa_nodes[i].map);
@@ -354,3 +355,42 @@ const char *perf_env__arch(struct perf_env *env)
 
        return normalize_arch(arch_name);
 }
+
+
+int perf_env__numa_node(struct perf_env *env, int cpu)
+{
+       if (!env->nr_numa_map) {
+               struct numa_node *nn;
+               int i, nr = 0;
+
+               for (i = 0; i < env->nr_numa_nodes; i++) {
+                       nn = &env->numa_nodes[i];
+                       nr = max(nr, perf_cpu_map__max(nn->map));
+               }
+
+               nr++;
+
+               /*
+                * We initialize the numa_map array to prepare
+                * it for missing cpus, which return node -1
+                */
+               env->numa_map = malloc(nr * sizeof(int));
+               if (!env->numa_map)
+                       return -1;
+
+               for (i = 0; i < nr; i++)
+                       env->numa_map[i] = -1;
+
+               env->nr_numa_map = nr;
+
+               for (i = 0; i < env->nr_numa_nodes; i++) {
+                       int tmp, j;
+
+                       nn = &env->numa_nodes[i];
+                       perf_cpu_map__for_each_cpu(j, tmp, nn->map)
+                               env->numa_map[j] = i;
+               }
+       }
+
+       return cpu >= 0 && cpu < env->nr_numa_map ? env->numa_map[cpu] : -1;
+}