From patchwork Sun Sep 6 01:31:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 76614 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 70D7AA04C5; Sun, 6 Sep 2020 03:31:57 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CBF791C0D2; Sun, 6 Sep 2020 03:31:46 +0200 (CEST) Received: from mail-pj1-f65.google.com (mail-pj1-f65.google.com [209.85.216.65]) by dpdk.org (Postfix) with ESMTP id 9FDED2BAB for ; Sun, 6 Sep 2020 03:31:43 +0200 (CEST) Received: by mail-pj1-f65.google.com with SMTP id b16so4944467pjp.0 for ; Sat, 05 Sep 2020 18:31:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ciLvjNOIsfeYXD5MxG0NqKGDF/Q594uMpv3G9vdvQyE=; b=va9dZJwp54rz0Z1c4Ws4PXQClBBb47q/nmu7XOEmF15xR/GDsPpX6GN6s/m8gpk9E8 rkOBHs13EwyfyWxoDD7FzGfvWIEv6S5XVbPuHnVNrnGnnbv39NfKgOXHe5QHpJJNyOip WR29luOUG6pRonXTwOFZjdTsnkMILwuupT21IjjCJtCLrlgVw58J9Ngqpr2zOR/wm7u1 4JqHQ7KcUbMmhUG+NH3thlYXramXlQh1TH7Y/UJ8SgY0ZLy0ulqFcrHQrDzsfHcAvtd9 NUjgQqvwqWs4Kh3KichIF43PWY5NBbawEf54pBS40hrGAUztCY/ZH7x+4JOkKKWA/PKy jNbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ciLvjNOIsfeYXD5MxG0NqKGDF/Q594uMpv3G9vdvQyE=; b=lVYkF/v4cmiv1AudwMfOKaAIIMVpKZN0bqMWrWB0y9y4LYRuE5L8fioTFIyHHVlaF5 CL5jPsIla8a6nUs+n30WjFxW0rWhIdexCEPkV9CXyWw7Iwsy/XoG7QGRgXdcdAkvfkDJ /k9Wd7URgY/NjsKs2TWo9eHOMPGE8o2brkXgmHnjxW8ztLhOvAybBdtA3DVooEC7/ZCj wOj1/qlJDqMkPF3Nz98/91x5lGRVFvJz/mxVboaF1jChqod1yjGs2p0wEhPw0XyUPdD3 vVuAibAYEiNhroI3/wsto8nio+9YslP1BM9mtitsbto3YYW2nDqrYnYZkGJGIZyJNotP /zFg== X-Gm-Message-State: AOAM531ESH9PpaYXzgLP9cXaLEnvLCZ6Zp6HiwtPIEwr5pXyLu3T4o1J kza61XqGEJ2DiYIwNoGWn63xjo1kj0LrLw== X-Google-Smtp-Source: ABdhPJwPwl7Cleq2HjYPLPgSJUMIc7vyJdjhMshRyGKxCWKGnchsc/9uzxeUA3KGGry5wMIJU4iRqg== X-Received: by 2002:a17:902:6ac3:: with SMTP id i3mr14263892plt.21.1599355902498; Sat, 05 Sep 2020 18:31:42 -0700 (PDT) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id n127sm10731863pfn.155.2020.09.05.18.31.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 05 Sep 2020 18:31:41 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Date: Sat, 5 Sep 2020 18:31:23 -0700 Message-Id: <20200906013133.26360-2-stephen@networkplumber.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200906013133.26360-1-stephen@networkplumber.org> References: <20200906013133.26360-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 01/11] cpu_layout: refactor to meet python standards X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Rearrange code to make it pass python lint. This includes add a main function, docstring, and some variable name changes. Signed-off-by: Stephen Hemminger --- usertools/cpu_layout.py | 145 +++++++++++++++++++++++----------------- 1 file changed, 85 insertions(+), 60 deletions(-) diff --git a/usertools/cpu_layout.py b/usertools/cpu_layout.py index 89a48cec463e..1e4577143ac5 100755 --- a/usertools/cpu_layout.py +++ b/usertools/cpu_layout.py @@ -2,67 +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" -import sys - -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()