From: Prarit Bhargava <prarit@redhat.com>
To: linux-pm@vger.kernel.org
Cc: lenb@kernel.org, Prarit Bhargava <prarit@redhat.com>,
Len Brown <len.brown@intel.com>
Subject: [PATCH 3/7] turbostat: Calculate additional node information for a package
Date: Fri, 28 Jul 2017 08:06:17 -0400 [thread overview]
Message-ID: <1501243581-31491-5-git-send-email-prarit@redhat.com> (raw)
In-Reply-To: <1501243581-31491-1-git-send-email-prarit@redhat.com>
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>
Cc: Len Brown <len.brown@intel.com>
---
tools/power/x86/turbostat/turbostat.c | 66 ++++++++++++++++++++++++++++++++---
1 file changed, 62 insertions(+), 4 deletions(-)
diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 5f66988b0303..696ced1974c5 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -249,7 +249,8 @@ struct system_summary {
struct cpu_topology {
int physical_package_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;
cpu_set_t *put_ids; /* Processing Unit/Thread IDs */
} *cpus;
@@ -259,6 +260,8 @@ struct topo_params {
int num_cpus;
int num_cores;
int max_cpu_num;
+ int max_node_num;
+ int num_nodes_per_pkg;
int num_cores_per_pkg;
int num_threads_per_core;
} topo;
@@ -2316,7 +2319,54 @@ int get_core_id(int 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];
FILE *filep;
@@ -4361,6 +4411,7 @@ void topology_probe()
int max_core_id = 0;
int max_package_id = 0;
int max_siblings = 0;
+ int max_physical_node_id = 0;
/* Initialize num_cpus, max_cpu_num */
set_max_cpu_num();
@@ -4426,7 +4477,9 @@ void topology_probe()
max_package_id = cpus[i].physical_package_id;
/* 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 > max_physical_node_id)
+ topo.max_node_num = cpus[i].physical_node_id;
/* get core information */
cpus[i].physical_core_id = get_core_id(i);
@@ -4441,9 +4494,10 @@ void topology_probe()
if (debug > 1)
fprintf(outf, "cpu %d pkg %d node %d core %d\n",
i, cpus[i].physical_package_id,
- cpus[i].node_id,
+ cpus[i].physical_node_id,
cpus[i].physical_core_id);
}
+
topo.num_cores_per_pkg = max_core_id + 1;
if (debug > 1)
fprintf(outf, "max_core_id %d, sizing for %d cores per package\n",
@@ -4458,6 +4512,10 @@ void topology_probe()
if (!summary_only && topo.num_packages > 1)
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;
if (debug > 1)
fprintf(outf, "max_siblings %d\n", max_siblings);
--
1.8.5.5
next prev parent reply other threads:[~2017-07-28 12:06 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-28 12:06 [PATCH 0/7 RESEND] turbostat: Fix AMD output by making turbostat aware of nodes Prarit Bhargava
2017-07-28 12:06 ` [PATCH v2] turbostat: Running on virtual machine is not supported Prarit Bhargava
2017-07-28 12:06 ` [PATCH 1/7] turbostat: set max_num_cpus equal to the cpumask length Prarit Bhargava
2017-07-28 12:06 ` [PATCH 2/7] turbostat: Fix node and siblings lookup data Prarit Bhargava
2017-07-28 12:06 ` Prarit Bhargava [this message]
2017-07-28 12:06 ` [PATCH 4/7] turbostat: track thread ID in cpu_topology Prarit Bhargava
2017-07-28 12:06 ` [PATCH 5/7] turbostat: rename num_cores_per_pkg to num_cores_per_node Prarit Bhargava
2017-07-28 12:06 ` [PATCH 6/7] turbostat: remove num_ from cpu_topology struct Prarit Bhargava
2017-07-28 12:06 ` [PATCH 7/7] turbostat: add node information into turbostat calculations Prarit Bhargava
2017-08-05 7:06 ` [PATCH 0/7 RESEND] turbostat: Fix AMD output by making turbostat aware of nodes Len Brown
2017-08-17 13:29 ` Prarit Bhargava
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1501243581-31491-5-git-send-email-prarit@redhat.com \
--to=prarit@redhat.com \
--cc=len.brown@intel.com \
--cc=lenb@kernel.org \
--cc=linux-pm@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).