[dpdk-dev] usertools: use /sys/devices/system/cpu for CPU layout script

Message ID 1490962860-11567-1-git-send-email-Andriy.Berestovskyy@caviumnetworks.com (mailing list archive)
State Accepted, archived
Delegated to: Thomas Monjalon
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Andriy Berestovskyy March 31, 2017, 12:21 p.m. UTC
  Some platforms do not have core/socket info in /proc/cpuinfo.

Signed-off-by: Andriy Berestovskyy <Andriy.Berestovskyy@caviumnetworks.com>
---
 usertools/cpu_layout.py | 53 +++++++++++++++++++++----------------------------
 1 file changed, 23 insertions(+), 30 deletions(-)
  

Comments

Thomas Monjalon April 25, 2017, 8:48 a.m. UTC | #1
Hi,

31/03/2017 14:21, Andriy Berestovskyy:
> Some platforms do not have core/socket info in /proc/cpuinfo.
> 
> Signed-off-by: Andriy Berestovskyy <Andriy.Berestovskyy@caviumnetworks.com>
> ---
>  usertools/cpu_layout.py | 53 +++++++++++++++++++++----------------------------
>  1 file changed, 23 insertions(+), 30 deletions(-)

Applied, thanks for improving this script.

Do you think it is really a good idea to keep and maintain this script
in DPDK? It was intentionnally not exported in "make install".
I think it is a bit out of scope, and I wonder which alternatives
do we have? I know hwloc/lstopo, but there are probably others.
  
Andriy Berestovskyy April 25, 2017, 10:19 a.m. UTC | #2
Hi,

On 25.04.2017 10:48, Thomas Monjalon wrote:
> Do you think it is really a good idea to keep and maintain this script
> in DPDK? It was intentionnally not exported in "make install".
> I think it is a bit out of scope, and I wonder which alternatives
> do we have? I know hwloc/lstopo, but there are probably others.

hwloc does not work on my target, but you are right, there are a variety 
of tools for that. For example, I prefer numactl (option -H) because it 
also allows to do many useful things, like bind CPUs to one node and 
memory allocations to another.

At the moment the script is just like the lscpu, which is preinstalled 
on Ubuntu and mentioned in the documentation alongside with the cpu_layout.

We could try to make the script more useful, for example, show which NIC 
is on which NUMA node. Still, it will be just a subset of functionality 
of tools like hwloc...


Regards,
Andriy
  
Thomas Monjalon April 25, 2017, 11:01 a.m. UTC | #3
25/04/2017 12:19, Andriy Berestovskyy:
> Hi,
> 
> On 25.04.2017 10:48, Thomas Monjalon wrote:
> > Do you think it is really a good idea to keep and maintain this script
> > in DPDK? It was intentionnally not exported in "make install".
> > I think it is a bit out of scope, and I wonder which alternatives
> > do we have? I know hwloc/lstopo, but there are probably others.
> 
> hwloc does not work on my target, but you are right, there are a variety 
> of tools for that. For example, I prefer numactl (option -H) because it 
> also allows to do many useful things, like bind CPUs to one node and 
> memory allocations to another.
> 
> At the moment the script is just like the lscpu, which is preinstalled 
> on Ubuntu and mentioned in the documentation alongside with the cpu_layout.
> 
> We could try to make the script more useful, for example, show which NIC 
> is on which NUMA node. Still, it will be just a subset of functionality 
> of tools like hwloc...

Yes.
The other idea would be to properly document existing tools
and remove this one.

Opinions?
  

Patch

diff --git a/usertools/cpu_layout.py b/usertools/cpu_layout.py
index 0e049a6..5735891 100755
--- a/usertools/cpu_layout.py
+++ b/usertools/cpu_layout.py
@@ -4,6 +4,7 @@ 
 #   BSD LICENSE
 #
 #   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+#   Copyright(c) 2017 Cavium Networks Ltd. All rights reserved.
 #   All rights reserved.
 #
 #   Redistribution and use in source and binary forms, with or without
@@ -38,40 +39,32 @@ 
 sockets = []
 cores = []
 core_map = {}
-
-fd = open("/proc/cpuinfo")
-lines = fd.readlines()
+base_path = "/sys/devices/system/cpu"
+fd = open("{}/kernel_max".format(base_path))
+max_cpus = int(fd.read())
 fd.close()
-
-core_details = []
-core_lines = {}
-for line in lines:
-    if len(line.strip()) != 0:
-        name, value = line.split(":", 1)
-        core_lines[name.strip()] = value.strip()
-    else:
-        core_details.append(core_lines)
-        core_lines = {}
-
-for core in core_details:
-    for field in ["processor", "core id", "physical id"]:
-        if field not in core:
-            print("Error getting '%s' value from /proc/cpuinfo" % field)
-            sys.exit(1)
-        core[field] = int(core[field])
-
-    if core["core id"] not in cores:
-        cores.append(core["core id"])
-    if core["physical id"] not in sockets:
-        sockets.append(core["physical id"])
-    key = (core["physical id"], core["core id"])
+for cpu in xrange(max_cpus + 1):
+    try:
+        fd = open("{}/cpu{}/topology/core_id".format(base_path, cpu))
+    except:
+        break
+    core = int(fd.read())
+    fd.close()
+    fd = open("{}/cpu{}/topology/physical_package_id".format(base_path, cpu))
+    socket = int(fd.read())
+    fd.close()
+    if core not in cores:
+        cores.append(core)
+    if socket not in sockets:
+        sockets.append(socket)
+    key = (socket, core)
     if key not in core_map:
         core_map[key] = []
-    core_map[key].append(core["processor"])
+    core_map[key].append(cpu)
 
-print("============================================================")
-print("Core and Socket Information (as reported by '/proc/cpuinfo')")
-print("============================================================\n")
+print(format("=" * (47 + len(base_path))))
+print("Core and Socket Information (as reported by '{}')".format(base_path))
+print("{}\n".format("=" * (47 + len(base_path))))
 print("cores = ", cores)
 print("sockets = ", sockets)
 print("")