DPDK patches and discussions
 help / color / mirror / Atom feed
From: Stephen Hemminger <stephen@networkplumber.org>
To: dev@dpdk.org
Cc: Stephen Hemminger <stephen@networkplumber.org>
Subject: [dpdk-dev] [PATCH v2] cpu_layout: refactor to meet python standards
Date: Tue,  3 Nov 2020 22:53:04 -0800	[thread overview]
Message-ID: <20201104065304.26886-1-stephen@networkplumber.org> (raw)
In-Reply-To: <20200906013133.26360-2-stephen@networkplumber.org>

Rearrange code to make it pass python lint totally clean!
This includes add a main function, docstring, and some
variable name changes.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
v2 - rebase to current main

 usertools/cpu_layout.py | 143 ++++++++++++++++++++++++----------------
 1 file changed, 85 insertions(+), 58 deletions(-)

diff --git a/usertools/cpu_layout.py b/usertools/cpu_layout.py
index cc39638213d0..1e4577143ac5 100755
--- a/usertools/cpu_layout.py
+++ b/usertools/cpu_layout.py
@@ -2,65 +2,92 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2010-2014 Intel Corporation
 # Copyright(c) 2017 Cavium, Inc. All rights reserved.
+"""
+Show CPU layout
+"""
+SYS_DEVICES_CPU = "/sys/devices/system/cpu"
 
-sockets = []
-cores = []
-core_map = {}
-base_path = "/sys/devices/system/cpu"
-fd = open("{}/kernel_max".format(base_path))
-max_cpus = int(fd.read())
-fd.close()
-for cpu in range(max_cpus + 1):
-    try:
-        fd = open("{}/cpu{}/topology/core_id".format(base_path, cpu))
-    except IOError:
-        continue
-    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(cpu)
-
-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("")
-
-max_processor_len = len(str(len(cores) * len(sockets) * 2 - 1))
-max_thread_count = len(list(core_map.values())[0])
-max_core_map_len = (max_processor_len * max_thread_count)  \
+
+def print_coremap(sockets, cores, core_map):
+    '''print core, thread, socket mapping'''
+    max_processor_len = len(str(len(cores) * len(sockets) * 2 - 1))
+    max_thread_count = len(list(core_map.values())[0])
+    max_core_map_len = (max_processor_len * max_thread_count)  \
                       + len(", ") * (max_thread_count - 1) \
                       + len('[]') + len('Socket ')
-max_core_id_len = len(str(max(cores)))
-
-output = " ".ljust(max_core_id_len + len('Core '))
-for s in sockets:
-    output += " Socket %s" % str(s).ljust(max_core_map_len - len('Socket '))
-print(output)
-
-output = " ".ljust(max_core_id_len + len('Core '))
-for s in sockets:
-    output += " --------".ljust(max_core_map_len)
-    output += " "
-print(output)
-
-for c in cores:
-    output = "Core %s" % str(c).ljust(max_core_id_len)
-    for s in sockets:
-        if (s,c) in core_map:
-            output += " " + str(core_map[(s, c)]).ljust(max_core_map_len)
-        else:
-            output += " " * (max_core_map_len + 1)
+
+    max_core_id_len = len(str(max(cores)))
+
+    output = " ".ljust(max_core_id_len + len('Core '))
+    for socket in sockets:
+        output += " Socket %s" % str(socket).ljust(max_core_map_len -
+                                                   len('Socket '))
+    print(output)
+
+    output = " ".ljust(max_core_id_len + len('Core '))
+    for socket in sockets:
+        output += " --------".ljust(max_core_map_len)
+        output += " "
     print(output)
+
+    for core in cores:
+        output = "Core %s" % str(core).ljust(max_core_id_len)
+        for socket in sockets:
+            if (socket, core) in core_map:
+                output += " " + str(core_map[(socket,
+                                              core)]).ljust(max_core_map_len)
+            else:
+                output += " " * (max_core_map_len + 1)
+        print(output)
+
+
+def print_header(sockets, cores):
+    '''print the core socket information header'''
+    header_len = 47 + len(SYS_DEVICES_CPU)
+    print(format("=" * header_len))
+    print("Core and Socket Information (as reported by '{}')".format(
+        SYS_DEVICES_CPU))
+    print("{}\n".format("=" * header_len))
+    print("cores = ", cores)
+    print("sockets = ", sockets)
+    print("")
+
+
+def main():
+    '''program main function'''
+
+    with open("{}/kernel_max".format(SYS_DEVICES_CPU)) as kernel_max:
+        max_cpus = int(kernel_max.read())
+
+    core_map = {}
+    sockets = []
+    cores = []
+
+    for cpu in range(max_cpus + 1):
+        topo_path = "{}/cpu{}/topology/".format(SYS_DEVICES_CPU, cpu)
+        try:
+            with open(topo_path + "core_id") as core_id:
+                core = int(core_id.read())
+        except FileNotFoundError:
+            break
+        except IOError:
+            continue
+
+        with open(topo_path + "physical_package_id") as package_id:
+            socket = int(package_id.read())
+
+        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(cpu)
+
+    print_header(sockets, cores)
+    print_coremap(sockets, cores, core_map)
+
+
+if __name__ == "__main__":
+    main()
-- 
2.27.0


  reply	other threads:[~2020-11-04  6:53 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-06  1:31 [dpdk-dev] [PATCH 00/11] Python script updates Stephen Hemminger
2020-09-06  1:31 ` [dpdk-dev] [PATCH 01/11] cpu_layout: refactor to meet python standards Stephen Hemminger
2020-11-04  6:53   ` Stephen Hemminger [this message]
2020-11-04  9:21     ` [dpdk-dev] [PATCH v2] " Bruce Richardson
2020-11-04 16:22       ` Stephen Hemminger
2020-09-06  1:31 ` [dpdk-dev] [PATCH 02/11] dpdk-pmdinfo: replace string.split with split Stephen Hemminger
2020-11-04  6:48   ` [dpdk-dev] [PATCH v2 0/7] dpdk-pmdinfo: python lint cleanups Stephen Hemminger
2020-11-04  6:48     ` [dpdk-dev] [PATCH v2 1/7] dpdk-pmdinfo: replace string.split with split Stephen Hemminger
2020-11-04  6:48     ` [dpdk-dev] [PATCH v2 2/7] dpdk-pmdinfo: replace io.open with open Stephen Hemminger
2020-11-04  6:48     ` [dpdk-dev] [PATCH v2 3/7] dpdk-pmdinfo: remove unnecessary paren and else Stephen Hemminger
2020-11-04  6:48     ` [dpdk-dev] [PATCH v2 4/7] dpdk-pmdinfo: replace is False and is True Stephen Hemminger
2020-11-04  6:48     ` [dpdk-dev] [PATCH v2 5/7] dpdk-pmdinfo: fix indentation Stephen Hemminger
2020-11-04  6:48     ` [dpdk-dev] [PATCH v2 6/7] dpdk-pmdinfo: replace deprecated optparse with argparse Stephen Hemminger
2020-11-24  6:35       ` Jiang, YuX
2020-11-04  6:48     ` [dpdk-dev] [PATCH v2 7/7] dpdk-pmdinfo: do not use len(x) to test for empty Stephen Hemminger
2020-11-22 20:54     ` [dpdk-dev] [PATCH v2 0/7] dpdk-pmdinfo: python lint cleanups Thomas Monjalon
2020-09-06  1:31 ` [dpdk-dev] [PATCH 03/11] dpdk-pmdinfo: replace io.open with open Stephen Hemminger
2020-09-06  1:31 ` [dpdk-dev] [PATCH 04/11] dpdk-pmdinfo: remove dead code Stephen Hemminger
2020-09-06  1:31 ` [dpdk-dev] [PATCH 05/11] dpdk-pmdinfo: remove unnecessary paren and else Stephen Hemminger
2020-09-06  1:31 ` [dpdk-dev] [PATCH 06/11] dpdk-pmdinfo: replace is False and is True Stephen Hemminger
2020-09-06  1:31 ` [dpdk-dev] [PATCH 07/11] dpdk-pmdinfo: fix indentation Stephen Hemminger
2020-09-06  1:31 ` [dpdk-dev] [PATCH 08/11] dpdk-pmdinfo: replace deprecated optparse with argparse Stephen Hemminger
2020-09-06  1:31 ` [dpdk-dev] [PATCH 09/11] dpdk-pmdinfo: do not use len(x) to test for empty Stephen Hemminger
2020-09-07  9:03   ` Bruce Richardson
2020-09-07 17:20     ` Stephen Hemminger
2020-09-06  1:31 ` [dpdk-dev] [PATCH 10/11] dpdk-telemetry-client: fix some pylint warnings Stephen Hemminger
2020-09-07  9:05   ` Bruce Richardson
2020-11-04  7:00   ` [dpdk-dev] [PATCH v2] " Stephen Hemminger
2020-11-15 23:06     ` Thomas Monjalon
2020-09-06  1:31 ` [dpdk-dev] [PATCH 11/11] dpdk-devbind: use argparse instead of getopt Stephen Hemminger
2020-11-04  7:03   ` [dpdk-dev] [PATCH v2 0/6] dpdk-devbind: python lint cleanups Stephen Hemminger
2020-11-04  7:03     ` [dpdk-dev] [PATCH v2 1/6] dpdk-devbind: use argparse instead of getopt Stephen Hemminger
2020-11-04  7:03     ` [dpdk-dev] [PATCH v2 2/6] dpdk-devbind: fix indentation Stephen Hemminger
2020-11-04  7:03     ` [dpdk-dev] [PATCH v2 3/6] dpdk-devbind: fix python lint warnings for imports Stephen Hemminger
2020-11-04  7:03     ` [dpdk-dev] [PATCH v2 4/6] dpdk-devbind: do not use len(x) to test for empty Stephen Hemminger
2020-11-04  7:03     ` [dpdk-dev] [PATCH v2 5/6] dpdk-devbind: fix unnecessary else after return Stephen Hemminger
2020-11-04  7:03     ` [dpdk-dev] [PATCH v2 6/6] dpdk-devbind: use in to test for multiple strings Stephen Hemminger
2020-11-04  9:28     ` [dpdk-dev] [PATCH v2 0/6] dpdk-devbind: python lint cleanups Bruce Richardson
2020-11-22 21:03       ` Thomas Monjalon
2020-11-04 16:57     ` Stephen Hemminger

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=20201104065304.26886-1-stephen@networkplumber.org \
    --to=stephen@networkplumber.org \
    --cc=dev@dpdk.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).