mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-28 17:41:50 +00:00
tools/power turbostat: Calculate additional node information for a package
The code currently assumes each package has exactly one node. This is not the case for AMD systems and Intel systems with COD. AMD systems also may re-enumerate each node's core IDs starting at 0 (for example, an AMD processor may have two nodes, each with core IDs from 0 to 7). In order to properly enumerate the cores we need to track both the physical and logical node IDs. Add physical_node_id to track the node ID assigned by the kernel, and logical_node_id used by turbostat to track the nodes per package ie) a 0-based count within the package. Signed-off-by: Prarit Bhargava <prarit@redhat.com> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
0e2d8f058f
commit
ef6057417a
1 changed files with 61 additions and 4 deletions
|
@ -260,7 +260,8 @@ struct system_summary {
|
||||||
struct cpu_topology {
|
struct cpu_topology {
|
||||||
int physical_package_id;
|
int physical_package_id;
|
||||||
int logical_cpu_id;
|
int logical_cpu_id;
|
||||||
int node_id;
|
int physical_node_id;
|
||||||
|
int logical_node_id; /* 0-based count within the package */
|
||||||
int physical_core_id;
|
int physical_core_id;
|
||||||
cpu_set_t *put_ids; /* Processing Unit/Thread IDs */
|
cpu_set_t *put_ids; /* Processing Unit/Thread IDs */
|
||||||
} *cpus;
|
} *cpus;
|
||||||
|
@ -270,6 +271,8 @@ struct topo_params {
|
||||||
int num_cpus;
|
int num_cpus;
|
||||||
int num_cores;
|
int num_cores;
|
||||||
int max_cpu_num;
|
int max_cpu_num;
|
||||||
|
int max_node_num;
|
||||||
|
int num_nodes_per_pkg;
|
||||||
int num_cores_per_pkg;
|
int num_cores_per_pkg;
|
||||||
int num_threads_per_core;
|
int num_threads_per_core;
|
||||||
} topo;
|
} topo;
|
||||||
|
@ -2399,7 +2402,54 @@ int get_core_id(int cpu)
|
||||||
return parse_int_file("/sys/devices/system/cpu/cpu%d/topology/core_id", cpu);
|
return parse_int_file("/sys/devices/system/cpu/cpu%d/topology/core_id", cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_node_id(struct cpu_topology *thiscpu)
|
void set_node_data(void)
|
||||||
|
{
|
||||||
|
char path[80];
|
||||||
|
FILE *filep;
|
||||||
|
int pkg, node, cpu;
|
||||||
|
|
||||||
|
struct pkg_node_info {
|
||||||
|
int count;
|
||||||
|
int min;
|
||||||
|
} *pni;
|
||||||
|
|
||||||
|
pni = calloc(topo.num_packages, sizeof(struct pkg_node_info));
|
||||||
|
if (!pni)
|
||||||
|
err(1, "calloc pkg_node_count");
|
||||||
|
|
||||||
|
for (pkg = 0; pkg < topo.num_packages; pkg++)
|
||||||
|
pni[pkg].min = topo.num_cpus;
|
||||||
|
|
||||||
|
for (node = 0; node <= topo.max_node_num; node++) {
|
||||||
|
/* find the "first" cpu in the node */
|
||||||
|
sprintf(path, "/sys/bus/node/devices/node%d/cpulist", node);
|
||||||
|
filep = fopen(path, "r");
|
||||||
|
if (!filep)
|
||||||
|
continue;
|
||||||
|
fscanf(filep, "%d", &cpu);
|
||||||
|
fclose(filep);
|
||||||
|
|
||||||
|
pkg = cpus[cpu].physical_package_id;
|
||||||
|
pni[pkg].count++;
|
||||||
|
|
||||||
|
if (node < pni[pkg].min)
|
||||||
|
pni[pkg].min = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (pkg = 0; pkg < topo.num_packages; pkg++)
|
||||||
|
if (pni[pkg].count > topo.num_nodes_per_pkg)
|
||||||
|
topo.num_nodes_per_pkg = pni[0].count;
|
||||||
|
|
||||||
|
for (cpu = 0; cpu < topo.num_cpus; cpu++) {
|
||||||
|
pkg = cpus[cpu].physical_package_id;
|
||||||
|
node = cpus[cpu].physical_node_id;
|
||||||
|
cpus[cpu].logical_node_id = node - pni[pkg].min;
|
||||||
|
}
|
||||||
|
free(pni);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_physical_node_id(struct cpu_topology *thiscpu)
|
||||||
{
|
{
|
||||||
char path[80];
|
char path[80];
|
||||||
FILE *filep;
|
FILE *filep;
|
||||||
|
@ -4675,7 +4725,9 @@ void topology_probe()
|
||||||
max_package_id = cpus[i].physical_package_id;
|
max_package_id = cpus[i].physical_package_id;
|
||||||
|
|
||||||
/* get numa node information */
|
/* get numa node information */
|
||||||
cpus[i].node_id = get_node_id(&cpus[i]);
|
cpus[i].physical_node_id = get_physical_node_id(&cpus[i]);
|
||||||
|
if (cpus[i].physical_node_id > topo.max_node_num)
|
||||||
|
topo.max_node_num = cpus[i].physical_node_id;
|
||||||
|
|
||||||
/* get core information */
|
/* get core information */
|
||||||
cpus[i].physical_core_id = get_core_id(i);
|
cpus[i].physical_core_id = get_core_id(i);
|
||||||
|
@ -4690,9 +4742,10 @@ void topology_probe()
|
||||||
if (debug > 1)
|
if (debug > 1)
|
||||||
fprintf(outf, "cpu %d pkg %d node %d core %d\n",
|
fprintf(outf, "cpu %d pkg %d node %d core %d\n",
|
||||||
i, cpus[i].physical_package_id,
|
i, cpus[i].physical_package_id,
|
||||||
cpus[i].node_id,
|
cpus[i].physical_node_id,
|
||||||
cpus[i].physical_core_id);
|
cpus[i].physical_core_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
topo.num_cores_per_pkg = max_core_id + 1;
|
topo.num_cores_per_pkg = max_core_id + 1;
|
||||||
if (debug > 1)
|
if (debug > 1)
|
||||||
fprintf(outf, "max_core_id %d, sizing for %d cores per package\n",
|
fprintf(outf, "max_core_id %d, sizing for %d cores per package\n",
|
||||||
|
@ -4707,6 +4760,10 @@ void topology_probe()
|
||||||
if (!summary_only && topo.num_packages > 1)
|
if (!summary_only && topo.num_packages > 1)
|
||||||
BIC_PRESENT(BIC_Package);
|
BIC_PRESENT(BIC_Package);
|
||||||
|
|
||||||
|
set_node_data();
|
||||||
|
if (debug > 1)
|
||||||
|
fprintf(outf, "num_nodes_per_pkg %d\n", topo.num_nodes_per_pkg);
|
||||||
|
|
||||||
topo.num_threads_per_core = max_siblings;
|
topo.num_threads_per_core = max_siblings;
|
||||||
if (debug > 1)
|
if (debug > 1)
|
||||||
fprintf(outf, "max_siblings %d\n", max_siblings);
|
fprintf(outf, "max_siblings %d\n", max_siblings);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue