* [dpdk-dev] [PATCH 00/11] Python script updates @ 2020-09-06 1:31 Stephen Hemminger 2020-09-06 1:31 ` [dpdk-dev] [PATCH 01/11] cpu_layout: refactor to meet python standards Stephen Hemminger ` (10 more replies) 0 siblings, 11 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-09-06 1:31 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger After writing the hugepages script, decided that the other python scripts need a cleanup and refresh. These changes apply after Louise Kilheeney's patch to change to full Python 3 only. Stephen Hemminger (11): cpu_layout: refactor to meet python standards dpdk-pmdinfo: replace string.split with split dpdk-pmdinfo: replace io.open with open dpdk-pmdinfo: remove dead code dpdk-pmdinfo: remove unnecessary paren and else dpdk-pmdinfo: replace is False and is True dpdk-pmdinfo: fix indentation dpdk-pmdinfo: replace deprecated optionparse with argparse dpdk-pmdinfo: do not use len(x) to test for empty dpdk-telemetry-client: fix some pylint warnings dpdk-devbind: use argparse instead of getopt usertools/cpu_layout.py | 145 ++++++++++++--------- usertools/dpdk-devbind.py | 196 +++++++++++++---------------- usertools/dpdk-pmdinfo.py | 140 +++++++++------------ usertools/dpdk-telemetry-client.py | 28 +++-- 4 files changed, 249 insertions(+), 260 deletions(-) -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH 01/11] cpu_layout: refactor to meet python standards 2020-09-06 1:31 [dpdk-dev] [PATCH 00/11] Python script updates Stephen Hemminger @ 2020-09-06 1:31 ` Stephen Hemminger 2020-11-04 6:53 ` [dpdk-dev] [PATCH v2] " Stephen Hemminger 2020-09-06 1:31 ` [dpdk-dev] [PATCH 02/11] dpdk-pmdinfo: replace string.split with split Stephen Hemminger ` (9 subsequent siblings) 10 siblings, 1 reply; 40+ messages in thread From: Stephen Hemminger @ 2020-09-06 1:31 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger 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 <stephen@networkplumber.org> --- 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() -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2] cpu_layout: refactor to meet python standards 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 2020-11-04 9:21 ` Bruce Richardson 0 siblings, 1 reply; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 6:53 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger 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 ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [dpdk-dev] [PATCH v2] cpu_layout: refactor to meet python standards 2020-11-04 6:53 ` [dpdk-dev] [PATCH v2] " Stephen Hemminger @ 2020-11-04 9:21 ` Bruce Richardson 2020-11-04 16:22 ` Stephen Hemminger 0 siblings, 1 reply; 40+ messages in thread From: Bruce Richardson @ 2020-11-04 9:21 UTC (permalink / raw) To: Stephen Hemminger; +Cc: dev On Tue, Nov 03, 2020 at 10:53:04PM -0800, Stephen Hemminger wrote: > 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(-) > Hi Stephen, Thanks for looking at this, but I honestly query the value of this scale of rework, since we take a 58 line linear script and increase it to an 85 line script with multiple functions being called. Rather than trying for full lint cleanliness, I think we'd be better to keep it simple and just aim for pep8/pycodestyle cleanliness. This shows only two small things to fix and saves massive rework. $ pycodestyle cpu_layout.py cpu_layout.py:18:5: E722 do not use bare 'except' cpu_layout.py:62:14: E231 missing whitespace after ',' Regards, /Bruce ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [dpdk-dev] [PATCH v2] cpu_layout: refactor to meet python standards 2020-11-04 9:21 ` Bruce Richardson @ 2020-11-04 16:22 ` Stephen Hemminger 0 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 16:22 UTC (permalink / raw) To: Bruce Richardson; +Cc: dev On Wed, 4 Nov 2020 09:21:05 +0000 Bruce Richardson <bruce.richardson@intel.com> wrote: > On Tue, Nov 03, 2020 at 10:53:04PM -0800, Stephen Hemminger wrote: > > 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(-) > > > > Hi Stephen, > > Thanks for looking at this, but I honestly query the value of this scale of > rework, since we take a 58 line linear script and increase it to an 85 line > script with multiple functions being called. Rather than trying for full > lint cleanliness, I think we'd be better to keep it simple and just aim for > pep8/pycodestyle cleanliness. This shows only two small things to fix and > saves massive rework. > > $ pycodestyle cpu_layout.py > cpu_layout.py:18:5: E722 do not use bare 'except' > cpu_layout.py:62:14: E231 missing whitespace after ',' > I was mostly hoping that the python code could be cleaned up so that when the next set of python code comes for some new feature it would be more readable. Could you send an alternative patch that addresses those changes. ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH 02/11] dpdk-pmdinfo: replace string.split with split 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-09-06 1:31 ` Stephen Hemminger 2020-11-04 6:48 ` [dpdk-dev] [PATCH v2 0/7] dpdk-pmdinfo: python lint cleanups Stephen Hemminger 2020-09-06 1:31 ` [dpdk-dev] [PATCH 03/11] dpdk-pmdinfo: replace io.open with open Stephen Hemminger ` (8 subsequent siblings) 10 siblings, 1 reply; 40+ messages in thread From: Stephen Hemminger @ 2020-09-06 1:31 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger In python3 the standard way to split strings is to use the split() on the string object itself. The old way is broken and would cause a traceback. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-pmdinfo.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index 16619827911a..7576a3313f36 100755 --- a/usertools/dpdk-pmdinfo.py +++ b/usertools/dpdk-pmdinfo.py @@ -11,7 +11,6 @@ import io import os import platform -import string import sys from elftools.common.exceptions import ELFError from elftools.common.py3compat import byte2int @@ -229,7 +228,7 @@ def loadLocal(self): def search_file(filename, search_path): """ Given a search path, find file with requested name """ - for path in string.split(search_path, ":"): + for path in search_path.split(':'): candidate = os.path.join(path, filename) if os.path.exists(candidate): return os.path.abspath(candidate) -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2 0/7] dpdk-pmdinfo: python lint cleanups 2020-09-06 1:31 ` [dpdk-dev] [PATCH 02/11] dpdk-pmdinfo: replace string.split with split Stephen Hemminger @ 2020-11-04 6:48 ` Stephen Hemminger 2020-11-04 6:48 ` [dpdk-dev] [PATCH v2 1/7] dpdk-pmdinfo: replace string.split with split Stephen Hemminger ` (7 more replies) 0 siblings, 8 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 6:48 UTC (permalink / raw) To: nhorman; +Cc: dev, Stephen Hemminger Ran dpdk-pmdinfo through Python3 lint and it had lots of complaints. These are the obvious simple ones to fix. Skipped adding docstrings everywhere and doing large scale variable recasing. v2 - split out the pmdinfo specific part incorporate feedback from Bruce about last use of len() Stephen Hemminger (7): dpdk-pmdinfo: replace string.split with split dpdk-pmdinfo: replace io.open with open dpdk-pmdinfo: remove unnecessary paren and else dpdk-pmdinfo: replace is False and is True dpdk-pmdinfo: fix indentation dpdk-pmdinfo: replace deprecated optparse with argparse dpdk-pmdinfo: do not use len(x) to test for empty usertools/dpdk-pmdinfo.py | 132 ++++++++++++++++++-------------------- 1 file changed, 61 insertions(+), 71 deletions(-) -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2 1/7] dpdk-pmdinfo: replace string.split with split 2020-11-04 6:48 ` [dpdk-dev] [PATCH v2 0/7] dpdk-pmdinfo: python lint cleanups Stephen Hemminger @ 2020-11-04 6:48 ` Stephen Hemminger 2020-11-04 6:48 ` [dpdk-dev] [PATCH v2 2/7] dpdk-pmdinfo: replace io.open with open Stephen Hemminger ` (6 subsequent siblings) 7 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 6:48 UTC (permalink / raw) To: nhorman; +Cc: dev, Stephen Hemminger In python3 the standard way to split strings is to use the split() on the string object itself. The old way is broken and would cause a traceback. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-pmdinfo.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index 16619827911a..7576a3313f36 100755 --- a/usertools/dpdk-pmdinfo.py +++ b/usertools/dpdk-pmdinfo.py @@ -11,7 +11,6 @@ import io import os import platform -import string import sys from elftools.common.exceptions import ELFError from elftools.common.py3compat import byte2int @@ -229,7 +228,7 @@ def loadLocal(self): def search_file(filename, search_path): """ Given a search path, find file with requested name """ - for path in string.split(search_path, ":"): + for path in search_path.split(':'): candidate = os.path.join(path, filename) if os.path.exists(candidate): return os.path.abspath(candidate) -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2 2/7] dpdk-pmdinfo: replace io.open with open 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 ` Stephen Hemminger 2020-11-04 6:48 ` [dpdk-dev] [PATCH v2 3/7] dpdk-pmdinfo: remove unnecessary paren and else Stephen Hemminger ` (5 subsequent siblings) 7 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 6:48 UTC (permalink / raw) To: nhorman; +Cc: dev, Stephen Hemminger The builtin open() is the recommended approach in python3. io.open was for compatiablity with older versions. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-pmdinfo.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index 7576a3313f36..4fefdc83e583 100755 --- a/usertools/dpdk-pmdinfo.py +++ b/usertools/dpdk-pmdinfo.py @@ -8,7 +8,6 @@ # # ------------------------------------------------------------------------- import json -import io import os import platform import sys @@ -211,7 +210,7 @@ def readLocal(self, filename): """ Reads the local file """ - with io.open(filename, 'r', encoding='utf-8') as f: + with open(filename, 'r', encoding='utf-8') as f: self.contents = f.readlines() self.date = self.findDate(self.contents) @@ -380,7 +379,7 @@ def search_for_autoload_path(self): return (None, None) if raw_output is False: print("Scanning for autoload path in %s" % library) - scanfile = io.open(library, 'rb') + scanfile = open(library, 'rb') scanelf = ReadElf(scanfile, sys.stdout) except AttributeError: # Not a dynamic binary @@ -456,7 +455,7 @@ def process_dt_needed_entries(self): if library is not None: if raw_output is False: print("Scanning %s for pmd information" % library) - with io.open(library, 'rb') as file: + with open(library, 'rb') as file: try: libelf = ReadElf(file, sys.stdout) except ELFError: @@ -499,7 +498,7 @@ def scan_autoload_path(autoload_path): scan_autoload_path(dpath) if os.path.isfile(dpath): try: - file = io.open(dpath, 'rb') + file = open(dpath, 'rb') readelf = ReadElf(file, sys.stdout) except ELFError: # this is likely not an elf file, skip it @@ -526,7 +525,7 @@ def scan_for_autoload_pmds(dpdk_path): print("Must specify a file name") return - file = io.open(dpdk_path, 'rb') + file = open(dpdk_path, 'rb') try: readelf = ReadElf(file, sys.stdout) except ElfError: @@ -621,7 +620,7 @@ def main(stream=None): print("File not found") sys.exit(1) - with io.open(myelffile, 'rb') as file: + with open(myelffile, 'rb') as file: try: readelf = ReadElf(file, sys.stdout) readelf.process_dt_needed_entries() -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2 3/7] dpdk-pmdinfo: remove unnecessary paren and else 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 ` Stephen Hemminger 2020-11-04 6:48 ` [dpdk-dev] [PATCH v2 4/7] dpdk-pmdinfo: replace is False and is True Stephen Hemminger ` (4 subsequent siblings) 7 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 6:48 UTC (permalink / raw) To: nhorman; +Cc: dev, Stephen Hemminger Python lint complains: usertools/dpdk-pmdinfo.py:303:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:328:0: C0325: Unnecessary parens after 'not' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:341:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:394:0: C0325: Unnecessary parens after 'not' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:407:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:515:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:530:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:533:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:534:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:539:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:594:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:602:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:605:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:611:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:110:12: R1705: Unnecessary "else" after "return" (no-else-return) usertools/dpdk-pmdinfo.py:254:12: R1705: Unnecessary "else" after "return" (no-else-return) Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-pmdinfo.py | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index 4fefdc83e583..c9ecf45a72f3 100755 --- a/usertools/dpdk-pmdinfo.py +++ b/usertools/dpdk-pmdinfo.py @@ -109,8 +109,7 @@ def find_subid(self, subven, subdev): except: if (subven == "ffff" and subdev == "ffff"): return SubDevice("ffff", "ffff", "(All Subdevices)") - else: - return SubDevice(subven, subdev, "(Unknown Subdevice)") + return SubDevice(subven, subdev, "(Unknown Subdevice)") class SubDevice: @@ -261,8 +260,7 @@ def _section_from_spec(self, spec): num = int(spec) if num < self.elffile.num_sections(): return self.elffile.get_section(num) - else: - return None + return None except ValueError: # Not a number. Must be a name then section = self.elffile.get_section_by_name(force_unicode(spec)) @@ -308,7 +306,7 @@ def parse_pmd_info_string(self, mystring): except KeyError: continue - if (len(pmdinfo["pci_ids"]) != 0): + if len(pmdinfo["pci_ids"]) != 0: print("PMD HW SUPPORT:") if pcidb is not None: self.pretty_print_pmdinfo(pmdinfo) @@ -333,7 +331,7 @@ def display_pmd_info_strings(self, section_spec): while dataptr < len(data): while (dataptr < len(data) and - not (32 <= byte2int(data[dataptr]) <= 127)): + not 32 <= byte2int(data[dataptr]) <= 127): dataptr += 1 if dataptr >= len(data): @@ -346,7 +344,7 @@ def display_pmd_info_strings(self, section_spec): # pyelftools may return byte-strings, force decode them mystring = force_unicode(data[dataptr:endptr]) rc = mystring.find("PMD_INFO_STRING") - if (rc != -1): + if rc != -1: self.parse_pmd_info_string(mystring) dataptr = endptr @@ -399,7 +397,7 @@ def search_for_autoload_path(self): while dataptr < len(data): while (dataptr < len(data) and - not (32 <= byte2int(data[dataptr]) <= 127)): + not 32 <= byte2int(data[dataptr]) <= 127): dataptr += 1 if dataptr >= len(data): @@ -412,7 +410,7 @@ def search_for_autoload_path(self): # pyelftools may return byte-strings, force decode them mystring = force_unicode(data[dataptr:endptr]) rc = mystring.find("DPDK_PLUGIN_PATH") - if (rc != -1): + if rc != -1: rc = mystring.find("=") return (mystring[rc + 1:], library) @@ -520,7 +518,7 @@ def scan_for_autoload_pmds(dpdk_path): """ global raw_output - if (os.path.isfile(dpdk_path) is False): + if os.path.isfile(dpdk_path) is False: if raw_output is False: print("Must specify a file name") return @@ -535,16 +533,16 @@ def scan_for_autoload_pmds(dpdk_path): (autoload_path, scannedfile) = readelf.search_for_autoload_path() if not autoload_path: - if (raw_output is False): + if raw_output is False: print("No autoload path configured in %s" % dpdk_path) return - if (raw_output is False): - if (scannedfile is None): + if raw_output is False: + if scannedfile is None: scannedfile = dpdk_path print("Found autoload path %s in %s" % (autoload_path, scannedfile)) file.close() - if (raw_output is False): + if raw_output is False: print("Discovered Autoload HW Support:") scan_autoload_path(autoload_path) return @@ -599,7 +597,7 @@ def main(stream=None): options.pcifile = None pcidb = None - if (len(args) == 0): + if len(args) == 0: optparser.print_usage() exit(1) @@ -607,16 +605,16 @@ def main(stream=None): exit(scan_for_autoload_pmds(args[0])) ldlibpath = os.environ.get('LD_LIBRARY_PATH') - if (ldlibpath is None): + if ldlibpath is None: ldlibpath = "" - if (os.path.exists(args[0]) is True): + if os.path.exists(args[0]) is True: myelffile = args[0] else: myelffile = search_file( args[0], ldlibpath + ":/usr/lib64:/lib64:/usr/lib:/lib") - if (myelffile is None): + if myelffile is None: print("File not found") sys.exit(1) -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2 4/7] dpdk-pmdinfo: replace is False and is True 2020-11-04 6:48 ` [dpdk-dev] [PATCH v2 0/7] dpdk-pmdinfo: python lint cleanups Stephen Hemminger ` (2 preceding siblings ...) 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 ` Stephen Hemminger 2020-11-04 6:48 ` [dpdk-dev] [PATCH v2 5/7] dpdk-pmdinfo: fix indentation Stephen Hemminger ` (3 subsequent siblings) 7 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 6:48 UTC (permalink / raw) To: nhorman; +Cc: dev, Stephen Hemminger Code reads better if unnecessary comparison with False and True is not used. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-pmdinfo.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index c9ecf45a72f3..8c4698063fb4 100755 --- a/usertools/dpdk-pmdinfo.py +++ b/usertools/dpdk-pmdinfo.py @@ -375,7 +375,7 @@ def search_for_autoload_path(self): ":/usr/lib64:/lib64:/usr/lib:/lib") if library is None: return (None, None) - if raw_output is False: + if not raw_output: print("Scanning for autoload path in %s" % library) scanfile = open(library, 'rb') scanelf = ReadElf(scanfile, sys.stdout) @@ -451,7 +451,7 @@ def process_dt_needed_entries(self): runpath + ":" + ldlibpath + ":/usr/lib64:/lib64:/usr/lib:/lib") if library is not None: - if raw_output is False: + if not raw_output: print("Scanning %s for pmd information" % library) with open(library, 'rb') as file: try: @@ -481,7 +481,7 @@ def force_bytes(s): def scan_autoload_path(autoload_path): global raw_output - if os.path.exists(autoload_path) is False: + if not os.path.exists(autoload_path): return try: @@ -505,7 +505,7 @@ def scan_autoload_path(autoload_path): # No permission to read the file, skip it continue - if raw_output is False: + if not raw_output: print("Hw Support for library %s" % d) readelf.display_pmd_info_strings(".rodata") file.close() @@ -518,8 +518,8 @@ def scan_for_autoload_pmds(dpdk_path): """ global raw_output - if os.path.isfile(dpdk_path) is False: - if raw_output is False: + if not os.path.isfile(dpdk_path): + if not raw_output: print("Must specify a file name") return @@ -527,22 +527,22 @@ def scan_for_autoload_pmds(dpdk_path): try: readelf = ReadElf(file, sys.stdout) except ElfError: - if raw_output is False: + if not raw_output: print("Unable to parse %s" % file) return (autoload_path, scannedfile) = readelf.search_for_autoload_path() if not autoload_path: - if raw_output is False: + if not raw_output: print("No autoload path configured in %s" % dpdk_path) return - if raw_output is False: + if not raw_output: if scannedfile is None: scannedfile = dpdk_path print("Found autoload path %s in %s" % (autoload_path, scannedfile)) file.close() - if raw_output is False: + if not raw_output: print("Discovered Autoload HW Support:") scan_autoload_path(autoload_path) return @@ -601,14 +601,14 @@ def main(stream=None): optparser.print_usage() exit(1) - if options.pdir is True: + if options.pdir: exit(scan_for_autoload_pmds(args[0])) ldlibpath = os.environ.get('LD_LIBRARY_PATH') if ldlibpath is None: ldlibpath = "" - if os.path.exists(args[0]) is True: + if os.path.exists(args[0]): myelffile = args[0] else: myelffile = search_file( -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2 5/7] dpdk-pmdinfo: fix indentation 2020-11-04 6:48 ` [dpdk-dev] [PATCH v2 0/7] dpdk-pmdinfo: python lint cleanups Stephen Hemminger ` (3 preceding siblings ...) 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 ` Stephen Hemminger 2020-11-04 6:48 ` [dpdk-dev] [PATCH v2 6/7] dpdk-pmdinfo: replace deprecated optparse with argparse Stephen Hemminger ` (2 subsequent siblings) 7 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 6:48 UTC (permalink / raw) To: nhorman; +Cc: dev, Stephen Hemminger This fixes indentation warnings from pylint. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-pmdinfo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index 8c4698063fb4..aec2abe9a683 100755 --- a/usertools/dpdk-pmdinfo.py +++ b/usertools/dpdk-pmdinfo.py @@ -331,7 +331,7 @@ def display_pmd_info_strings(self, section_spec): while dataptr < len(data): while (dataptr < len(data) and - not 32 <= byte2int(data[dataptr]) <= 127): + not 32 <= byte2int(data[dataptr]) <= 127): dataptr += 1 if dataptr >= len(data): @@ -397,7 +397,7 @@ def search_for_autoload_path(self): while dataptr < len(data): while (dataptr < len(data) and - not 32 <= byte2int(data[dataptr]) <= 127): + not 32 <= byte2int(data[dataptr]) <= 127): dataptr += 1 if dataptr >= len(data): -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2 6/7] dpdk-pmdinfo: replace deprecated optparse with argparse 2020-11-04 6:48 ` [dpdk-dev] [PATCH v2 0/7] dpdk-pmdinfo: python lint cleanups Stephen Hemminger ` (4 preceding siblings ...) 2020-11-04 6:48 ` [dpdk-dev] [PATCH v2 5/7] dpdk-pmdinfo: fix indentation Stephen Hemminger @ 2020-11-04 6:48 ` 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 7 siblings, 1 reply; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 6:48 UTC (permalink / raw) To: nhorman; +Cc: dev, Stephen Hemminger The optparse module is deprecated and replaced with new argparse. The code now enforces the rule that only one of the output formats can be specified: raw or json. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-pmdinfo.py | 70 ++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 38 deletions(-) diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index aec2abe9a683..1c2c3d05fea6 100755 --- a/usertools/dpdk-pmdinfo.py +++ b/usertools/dpdk-pmdinfo.py @@ -11,10 +11,11 @@ import os import platform import sys +import argparse from elftools.common.exceptions import ELFError from elftools.common.py3compat import byte2int from elftools.elf.elffile import ELFFile -from optparse import OptionParser + # For running from development directory. It should take precedence over the # installed pyelftools. @@ -563,56 +564,49 @@ def main(stream=None): if not os.path.exists(pcifile_default): pcifile_default = "/usr/share/misc/pci_vendors" - optparser = OptionParser( - usage='usage: %prog [-hrtp] [-d <pci id file] <elf-file>', - description="Dump pmd hardware support info", - add_help_option=True) - optparser.add_option('-r', '--raw', - action='store_true', dest='raw_output', - help='Dump raw json strings') - optparser.add_option("-d", "--pcidb", dest="pcifile", - help="specify a pci database " - "to get vendor names from", - default=pcifile_default, metavar="FILE") - optparser.add_option("-t", "--table", dest="tblout", - help="output information on hw support as a " - "hex table", - action='store_true') - optparser.add_option("-p", "--plugindir", dest="pdir", - help="scan dpdk for autoload plugins", - action='store_true') - - options, args = optparser.parse_args() - - if options.raw_output: + parser = argparse.ArgumentParser( + usage='usage: %(prog)s [-hrtp] [-d <pci id file>] elf_file', + description="Dump pmd hardware support info") + group = parser.add_mutually_exclusive_group() + group.add_argument('-r', '--raw', + action='store_true', dest='raw_output', + help='dump raw json strings') + group.add_argument("-t", "--table", dest="tblout", + help="output information on hw support as a hex table", + action='store_true') + parser.add_argument("-d", "--pcidb", dest="pcifile", + help="specify a pci database to get vendor names from", + default=pcifile_default, metavar="FILE") + parser.add_argument("-p", "--plugindir", dest="pdir", + help="scan dpdk for autoload plugins", + action='store_true') + parser.add_argument("elf_file", help="driver shared object file") + args = parser.parse_args() + + if args.raw_output: raw_output = True - if options.pcifile: - pcidb = PCIIds(options.pcifile) + if args.tblout: + args.pcifile = None + + if args.pcifile: + pcidb = PCIIds(args.pcifile) if pcidb is None: print("Pci DB file not found") exit(1) - if options.tblout: - options.pcifile = None - pcidb = None - - if len(args) == 0: - optparser.print_usage() - exit(1) - - if options.pdir: + if args.pdir: exit(scan_for_autoload_pmds(args[0])) ldlibpath = os.environ.get('LD_LIBRARY_PATH') if ldlibpath is None: ldlibpath = "" - if os.path.exists(args[0]): - myelffile = args[0] + if os.path.exists(args.elf_file): + myelffile = args.elf_file else: - myelffile = search_file( - args[0], ldlibpath + ":/usr/lib64:/lib64:/usr/lib:/lib") + myelffile = search_file(args.elf_file, + ldlibpath + ":/usr/lib64:/lib64:/usr/lib:/lib") if myelffile is None: print("File not found") -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [dpdk-dev] [PATCH v2 6/7] dpdk-pmdinfo: replace deprecated optparse with argparse 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 0 siblings, 0 replies; 40+ messages in thread From: Jiang, YuX @ 2020-11-24 6:35 UTC (permalink / raw) To: Stephen Hemminger, nhorman; +Cc: dev [-- Attachment #1: Type: text/plain, Size: 6030 bytes --] Hi Hemminger, Latest "dpdk-devbind.py --status-dev" just can support {net,baseband,crypto,event,mempool,compress} devices, But can not support show Misc devices, can you fix it or provide new method to show? Notes: Old dpdk-devbind.py can support show cbdma device by cmd " ./usertools/dpdk-devbind.py --status-dev misc " Trace Log: root@dpdk-yaobing-purely147:~/dpdk# ./usertools/dpdk-devbind.py --status-dev misc usage: dpdk-devbind.py [-h] [-s] [--status-dev {net,baseband,crypto,event,mempool,compress}] [-b DRIVER | -u] [--force] [DEVICE [DEVICE ...]] dpdk-devbind.py: error: argument --status-dev: invalid choice: 'misc' (choose from 'net', 'baseband', 'crypto', 'event', 'mempool', 'compress') root@dpdk-yaobing-purely147:~/dpdk# ./usertools/dpdk-devbind.py -s Misc (rawdev) devices using kernel driver ========================================= 0000:00:04.0 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci Best Regards Jiang yu > -----Original Message----- > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Stephen > Hemminger > Sent: Wednesday, November 4, 2020 2:49 PM > To: nhorman@tuxdriver.com > Cc: dev@dpdk.org; Stephen Hemminger <stephen@networkplumber.org> > Subject: [dpdk-dev] [PATCH v2 6/7] dpdk-pmdinfo: replace deprecated > optparse with argparse > > The optparse module is deprecated and replaced with new argparse. > The code now enforces the rule that only one of the output formats can be > specified: raw or json. > > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> > --- > usertools/dpdk-pmdinfo.py | 70 ++++++++++++++++++--------------------- > 1 file changed, 32 insertions(+), 38 deletions(-) > > diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index > aec2abe9a683..1c2c3d05fea6 100755 > --- a/usertools/dpdk-pmdinfo.py > +++ b/usertools/dpdk-pmdinfo.py > @@ -11,10 +11,11 @@ > import os > import platform > import sys > +import argparse > from elftools.common.exceptions import ELFError from > elftools.common.py3compat import byte2int from elftools.elf.elffile import > ELFFile -from optparse import OptionParser > + > > # For running from development directory. It should take precedence over > the # installed pyelftools. > @@ -563,56 +564,49 @@ def main(stream=None): > if not os.path.exists(pcifile_default): > pcifile_default = "/usr/share/misc/pci_vendors" > > - optparser = OptionParser( > - usage='usage: %prog [-hrtp] [-d <pci id file] <elf-file>', > - description="Dump pmd hardware support info", > - add_help_option=True) > - optparser.add_option('-r', '--raw', > - action='store_true', dest='raw_output', > - help='Dump raw json strings') > - optparser.add_option("-d", "--pcidb", dest="pcifile", > - help="specify a pci database " > - "to get vendor names from", > - default=pcifile_default, metavar="FILE") > - optparser.add_option("-t", "--table", dest="tblout", > - help="output information on hw support as a " > - "hex table", > - action='store_true') > - optparser.add_option("-p", "--plugindir", dest="pdir", > - help="scan dpdk for autoload plugins", > - action='store_true') > - > - options, args = optparser.parse_args() > - > - if options.raw_output: > + parser = argparse.ArgumentParser( > + usage='usage: %(prog)s [-hrtp] [-d <pci id file>] elf_file', > + description="Dump pmd hardware support info") > + group = parser.add_mutually_exclusive_group() > + group.add_argument('-r', '--raw', > + action='store_true', dest='raw_output', > + help='dump raw json strings') > + group.add_argument("-t", "--table", dest="tblout", > + help="output information on hw support as a hex table", > + action='store_true') > + parser.add_argument("-d", "--pcidb", dest="pcifile", > + help="specify a pci database to get vendor names from", > + default=pcifile_default, metavar="FILE") > + parser.add_argument("-p", "--plugindir", dest="pdir", > + help="scan dpdk for autoload plugins", > + action='store_true') > + parser.add_argument("elf_file", help="driver shared object file") > + args = parser.parse_args() > + > + if args.raw_output: > raw_output = True > > - if options.pcifile: > - pcidb = PCIIds(options.pcifile) > + if args.tblout: > + args.pcifile = None > + > + if args.pcifile: > + pcidb = PCIIds(args.pcifile) > if pcidb is None: > print("Pci DB file not found") > exit(1) > > - if options.tblout: > - options.pcifile = None > - pcidb = None > - > - if len(args) == 0: > - optparser.print_usage() > - exit(1) > - > - if options.pdir: > + if args.pdir: > exit(scan_for_autoload_pmds(args[0])) > > ldlibpath = os.environ.get('LD_LIBRARY_PATH') > if ldlibpath is None: > ldlibpath = "" > > - if os.path.exists(args[0]): > - myelffile = args[0] > + if os.path.exists(args.elf_file): > + myelffile = args.elf_file > else: > - myelffile = search_file( > - args[0], ldlibpath + ":/usr/lib64:/lib64:/usr/lib:/lib") > + myelffile = search_file(args.elf_file, > + ldlibpath + > + ":/usr/lib64:/lib64:/usr/lib:/lib") > > if myelffile is None: > print("File not found") > -- > 2.27.0 [-- Attachment #2: dpdk-devbind-cmd.txt --] [-- Type: text/plain, Size: 8301 bytes --] root@dpdk-yaobing-purely147:~/dpdk# ./usertools/dpdk-devbind.py -h usage: dpdk-devbind.py [-h] [-s] [--status-dev {net,baseband,crypto,event,mempool,compress}] [-b DRIVER | -u] [--force] [DEVICE [DEVICE ...]] Utility to bind and unbind devices from Linux kernel positional arguments: DEVICE Device specified as PCI "domain:bus:slot.func" syntax or "bus:slot.func" syntax. For devices bound to Linux kernel drivers, they may be referred to by interface name. optional arguments: -h, --help show this help message and exit -s, --status Print the current status of all known devices. --status-dev {net,baseband,crypto,event,mempool,compress} Print the status of given device group. -b DRIVER, --bind DRIVER Select the driver to use or "none" to unbind the device -u, --unbind Unbind a device (equivalent to "-b none") --force Override restriction on binding devices in use by Linux" WARNING: This can lead to loss of network connection and should be used with caution. Examples: --------- To display current device status: dpdk-devbind.py --status To display current network device status: dpdk-devbind.py --status-dev net To bind eth1 from the current driver and move to use vfio-pci dpdk-devbind.py --bind=vfio-pci eth1 To unbind 0000:01:00.0 from using any driver dpdk-devbind.py -u 0000:01:00.0 To bind 0000:02:00.0 and 0000:02:00.1 to the ixgbe kernel driver dpdk-devbind.py -b ixgbe 02:00.0 02:00.1 root@dpdk-yaobing-purely147:~/dpdk# root@dpdk-yaobing-purely147:~/dpdk# ./usertools/dpdk-devbind.py -s Network devices using kernel driver =================================== 0000:20:00.0 'Ethernet Connection X722 for 10GBASE-T 37d2' if=eno1 drv=i40e unused=vfio-pci *Active* 0000:20:00.1 'Ethernet Connection X722 for 10GBASE-T 37d2' if=eno2 drv=i40e unused=vfio-pci 0000:20:00.2 'Ethernet Connection X722 for 10GbE SFP+ 37d3' if=eno3 drv=i40e unused=vfio-pci 0000:20:00.3 'Ethernet Connection X722 for 10GbE SFP+ 37d3' if=eno4 drv=i40e unused=vfio-pci 0000:3b:00.0 'Ethernet Controller XL710 for 40GbE QSFP+ 1583' if=enp59s0f0 drv=i40e unused=vfio-pci 0000:3b:00.1 'Ethernet Controller XL710 for 40GbE QSFP+ 1583' if=enp59s0f1 drv=i40e unused=vfio-pci 0000:60:00.0 'Ethernet Controller XL710 for 40GbE QSFP+ 1583' if=enp96s0f0 drv=i40e unused=vfio-pci 0000:60:00.1 'Ethernet Controller XL710 for 40GbE QSFP+ 1583' if=enp96s0f1 drv=i40e unused=vfio-pci 0000:86:00.0 'Ethernet Controller XL710 for 40GbE QSFP+ 1583' if=enp134s0f0 drv=i40e unused=vfio-pci 0000:86:00.1 'Ethernet Controller XL710 for 40GbE QSFP+ 1583' if=enp134s0f1 drv=i40e unused=vfio-pci 0000:d8:00.0 'Ethernet Controller X710 for 10GbE SFP+ 1572' if=enp216s0f0 drv=i40e unused=vfio-pci 0000:d8:00.1 'Ethernet Controller X710 for 10GbE SFP+ 1572' if=enp216s0f1 drv=i40e unused=vfio-pci 0000:d8:00.2 'Ethernet Controller X710 for 10GbE SFP+ 1572' if=enp216s0f2 drv=i40e unused=vfio-pci 0000:d8:00.3 'Ethernet Controller X710 for 10GbE SFP+ 1572' if=enp216s0f3 drv=i40e unused=vfio-pci No 'Baseband' devices detected ============================== Crypto devices using DPDK-compatible driver =========================================== 0000:1a:01.0 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1a:01.1 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1a:01.2 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1a:01.3 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1a:01.4 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1a:01.5 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1a:01.6 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1a:01.7 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1a:02.0 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1a:02.1 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1a:02.2 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1a:02.3 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1a:02.4 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1a:02.5 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1a:02.6 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1a:02.7 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:01.0 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:01.1 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:01.2 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:01.3 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:01.4 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:01.5 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:01.6 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:01.7 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:02.0 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:02.1 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:02.2 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:02.3 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:02.4 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:02.5 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:02.6 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1c:02.7 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:01.0 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:01.1 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:01.2 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:01.3 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:01.4 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:01.5 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:01.6 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:01.7 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:02.0 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:02.1 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:02.2 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:02.3 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:02.4 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:02.5 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:02.6 'Device 37c9' drv=vfio-pci unused=qat_c62xvf 0000:1e:02.7 'Device 37c9' drv=vfio-pci unused=qat_c62xvf Crypto devices using kernel driver ================================== 0000:1a:00.0 'C62x Chipset QuickAssist Technology 37c8' drv=c6xx unused=qat_c62x,vfio-pci 0000:1c:00.0 'C62x Chipset QuickAssist Technology 37c8' drv=c6xx unused=qat_c62x,vfio-pci 0000:1e:00.0 'C62x Chipset QuickAssist Technology 37c8' drv=c6xx unused=qat_c62x,vfio-pci No 'Eventdev' devices detected ============================== No 'Mempool' devices detected ============================= No 'Compress' devices detected ============================== Misc (rawdev) devices using kernel driver ========================================= 0000:00:04.0 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci 0000:00:04.1 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci 0000:00:04.2 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci 0000:00:04.3 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci 0000:00:04.4 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci 0000:00:04.5 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci 0000:00:04.6 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci 0000:00:04.7 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci 0000:80:04.0 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci 0000:80:04.1 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci 0000:80:04.2 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci 0000:80:04.3 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci 0000:80:04.4 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci 0000:80:04.5 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci 0000:80:04.6 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci 0000:80:04.7 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci No 'Regex' devices detected =========================== ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2 7/7] dpdk-pmdinfo: do not use len(x) to test for empty 2020-11-04 6:48 ` [dpdk-dev] [PATCH v2 0/7] dpdk-pmdinfo: python lint cleanups Stephen Hemminger ` (5 preceding siblings ...) 2020-11-04 6:48 ` [dpdk-dev] [PATCH v2 6/7] dpdk-pmdinfo: replace deprecated optparse with argparse Stephen Hemminger @ 2020-11-04 6:48 ` Stephen Hemminger 2020-11-22 20:54 ` [dpdk-dev] [PATCH v2 0/7] dpdk-pmdinfo: python lint cleanups Thomas Monjalon 7 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 6:48 UTC (permalink / raw) To: nhorman; +Cc: dev, Stephen Hemminger This fixes the following python lint warnings. usertools/dpdk-pmdinfo.py:188:11: C1801: Do not use `len(SEQUENCE)` to determine if a sequence is empty (len-as-condition) usertools/dpdk-pmdinfo.py:196:21: C1801: Do not use `len(SEQUENCE)` to determine if a sequence is empty (len-as-condition) usertools/dpdk-pmdinfo.py:302:11: C1801: Do not use `len(SEQUENCE)` to determine if a sequence is empty (len-as-condition) Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-pmdinfo.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index 1c2c3d05fea6..2bead75da238 100755 --- a/usertools/dpdk-pmdinfo.py +++ b/usertools/dpdk-pmdinfo.py @@ -185,7 +185,7 @@ def findDate(self, content): return None def parse(self): - if len(self.contents) < 1: + if not self.contents: print("data/%s-pci.ids not found" % self.date) else: vendorID = "" @@ -193,7 +193,7 @@ def parse(self): for l in self.contents: if l[0] == "#": continue - elif len(l.strip()) == 0: + elif not l.strip(): continue else: if l.find("\t\t") == 0: @@ -307,7 +307,7 @@ def parse_pmd_info_string(self, mystring): except KeyError: continue - if len(pmdinfo["pci_ids"]) != 0: + if pmdinfo["pci_ids"]: print("PMD HW SUPPORT:") if pcidb is not None: self.pretty_print_pmdinfo(pmdinfo) -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [dpdk-dev] [PATCH v2 0/7] dpdk-pmdinfo: python lint cleanups 2020-11-04 6:48 ` [dpdk-dev] [PATCH v2 0/7] dpdk-pmdinfo: python lint cleanups Stephen Hemminger ` (6 preceding siblings ...) 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 ` Thomas Monjalon 7 siblings, 0 replies; 40+ messages in thread From: Thomas Monjalon @ 2020-11-22 20:54 UTC (permalink / raw) To: Stephen Hemminger; +Cc: dev 04/11/2020 07:48, Stephen Hemminger: > Ran dpdk-pmdinfo through Python3 lint and it had lots of complaints. > These are the obvious simple ones to fix. Skipped adding docstrings > everywhere and doing large scale variable recasing. > > v2 - split out the pmdinfo specific part > incorporate feedback from Bruce about last use of len() > > Stephen Hemminger (7): > dpdk-pmdinfo: replace string.split with split > dpdk-pmdinfo: replace io.open with open > dpdk-pmdinfo: remove unnecessary paren and else > dpdk-pmdinfo: replace is False and is True > dpdk-pmdinfo: fix indentation > dpdk-pmdinfo: replace deprecated optparse with argparse > dpdk-pmdinfo: do not use len(x) to test for empty Applied, thanks ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH 03/11] dpdk-pmdinfo: replace io.open with open 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-09-06 1:31 ` [dpdk-dev] [PATCH 02/11] dpdk-pmdinfo: replace string.split with split Stephen Hemminger @ 2020-09-06 1:31 ` Stephen Hemminger 2020-09-06 1:31 ` [dpdk-dev] [PATCH 04/11] dpdk-pmdinfo: remove dead code Stephen Hemminger ` (7 subsequent siblings) 10 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-09-06 1:31 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger The builtin open() is the recommended approach in python3. io.open was for compatiablity with older versions. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-pmdinfo.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index 7576a3313f36..4fefdc83e583 100755 --- a/usertools/dpdk-pmdinfo.py +++ b/usertools/dpdk-pmdinfo.py @@ -8,7 +8,6 @@ # # ------------------------------------------------------------------------- import json -import io import os import platform import sys @@ -211,7 +210,7 @@ def readLocal(self, filename): """ Reads the local file """ - with io.open(filename, 'r', encoding='utf-8') as f: + with open(filename, 'r', encoding='utf-8') as f: self.contents = f.readlines() self.date = self.findDate(self.contents) @@ -380,7 +379,7 @@ def search_for_autoload_path(self): return (None, None) if raw_output is False: print("Scanning for autoload path in %s" % library) - scanfile = io.open(library, 'rb') + scanfile = open(library, 'rb') scanelf = ReadElf(scanfile, sys.stdout) except AttributeError: # Not a dynamic binary @@ -456,7 +455,7 @@ def process_dt_needed_entries(self): if library is not None: if raw_output is False: print("Scanning %s for pmd information" % library) - with io.open(library, 'rb') as file: + with open(library, 'rb') as file: try: libelf = ReadElf(file, sys.stdout) except ELFError: @@ -499,7 +498,7 @@ def scan_autoload_path(autoload_path): scan_autoload_path(dpath) if os.path.isfile(dpath): try: - file = io.open(dpath, 'rb') + file = open(dpath, 'rb') readelf = ReadElf(file, sys.stdout) except ELFError: # this is likely not an elf file, skip it @@ -526,7 +525,7 @@ def scan_for_autoload_pmds(dpdk_path): print("Must specify a file name") return - file = io.open(dpdk_path, 'rb') + file = open(dpdk_path, 'rb') try: readelf = ReadElf(file, sys.stdout) except ElfError: @@ -621,7 +620,7 @@ def main(stream=None): print("File not found") sys.exit(1) - with io.open(myelffile, 'rb') as file: + with open(myelffile, 'rb') as file: try: readelf = ReadElf(file, sys.stdout) readelf.process_dt_needed_entries() -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH 04/11] dpdk-pmdinfo: remove dead code 2020-09-06 1:31 [dpdk-dev] [PATCH 00/11] Python script updates Stephen Hemminger ` (2 preceding siblings ...) 2020-09-06 1:31 ` [dpdk-dev] [PATCH 03/11] dpdk-pmdinfo: replace io.open with open Stephen Hemminger @ 2020-09-06 1:31 ` Stephen Hemminger 2020-09-06 1:31 ` [dpdk-dev] [PATCH 05/11] dpdk-pmdinfo: remove unnecessary paren and else Stephen Hemminger ` (6 subsequent siblings) 10 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-09-06 1:31 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger The method loadLocal() is never called, and if it was it would throw an exception because it calling readLocal() without a filename. Pylint spotted this. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-pmdinfo.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index 4fefdc83e583..9ee8fe9fa1ec 100755 --- a/usertools/dpdk-pmdinfo.py +++ b/usertools/dpdk-pmdinfo.py @@ -214,14 +214,6 @@ def readLocal(self, filename): self.contents = f.readlines() self.date = self.findDate(self.contents) - def loadLocal(self): - """ - Loads database from local. If there is no file, - it creates a new one from web - """ - self.date = idsfile[0].split("/")[1].split("-")[0] - self.readLocal() - # ======================================= -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH 05/11] dpdk-pmdinfo: remove unnecessary paren and else 2020-09-06 1:31 [dpdk-dev] [PATCH 00/11] Python script updates Stephen Hemminger ` (3 preceding siblings ...) 2020-09-06 1:31 ` [dpdk-dev] [PATCH 04/11] dpdk-pmdinfo: remove dead code Stephen Hemminger @ 2020-09-06 1:31 ` Stephen Hemminger 2020-09-06 1:31 ` [dpdk-dev] [PATCH 06/11] dpdk-pmdinfo: replace is False and is True Stephen Hemminger ` (5 subsequent siblings) 10 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-09-06 1:31 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger Python lint complains: usertools/dpdk-pmdinfo.py:303:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:328:0: C0325: Unnecessary parens after 'not' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:341:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:394:0: C0325: Unnecessary parens after 'not' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:407:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:515:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:530:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:533:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:534:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:539:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:594:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:602:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:605:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:611:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens) usertools/dpdk-pmdinfo.py:110:12: R1705: Unnecessary "else" after "return" (no-else-return) usertools/dpdk-pmdinfo.py:254:12: R1705: Unnecessary "else" after "return" (no-else-return) Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-pmdinfo.py | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index 9ee8fe9fa1ec..32f8a82519fb 100755 --- a/usertools/dpdk-pmdinfo.py +++ b/usertools/dpdk-pmdinfo.py @@ -109,8 +109,7 @@ def find_subid(self, subven, subdev): except: if (subven == "ffff" and subdev == "ffff"): return SubDevice("ffff", "ffff", "(All Subdevices)") - else: - return SubDevice(subven, subdev, "(Unknown Subdevice)") + return SubDevice(subven, subdev, "(Unknown Subdevice)") class SubDevice: @@ -253,8 +252,7 @@ def _section_from_spec(self, spec): num = int(spec) if num < self.elffile.num_sections(): return self.elffile.get_section(num) - else: - return None + return None except ValueError: # Not a number. Must be a name then section = self.elffile.get_section_by_name(force_unicode(spec)) @@ -300,7 +298,7 @@ def parse_pmd_info_string(self, mystring): except KeyError: continue - if (len(pmdinfo["pci_ids"]) != 0): + if len(pmdinfo["pci_ids"]) != 0: print("PMD HW SUPPORT:") if pcidb is not None: self.pretty_print_pmdinfo(pmdinfo) @@ -325,7 +323,7 @@ def display_pmd_info_strings(self, section_spec): while dataptr < len(data): while (dataptr < len(data) and - not (32 <= byte2int(data[dataptr]) <= 127)): + not 32 <= byte2int(data[dataptr]) <= 127): dataptr += 1 if dataptr >= len(data): @@ -338,7 +336,7 @@ def display_pmd_info_strings(self, section_spec): # pyelftools may return byte-strings, force decode them mystring = force_unicode(data[dataptr:endptr]) rc = mystring.find("PMD_INFO_STRING") - if (rc != -1): + if rc != -1: self.parse_pmd_info_string(mystring) dataptr = endptr @@ -391,7 +389,7 @@ def search_for_autoload_path(self): while dataptr < len(data): while (dataptr < len(data) and - not (32 <= byte2int(data[dataptr]) <= 127)): + not 32 <= byte2int(data[dataptr]) <= 127): dataptr += 1 if dataptr >= len(data): @@ -404,7 +402,7 @@ def search_for_autoload_path(self): # pyelftools may return byte-strings, force decode them mystring = force_unicode(data[dataptr:endptr]) rc = mystring.find("DPDK_PLUGIN_PATH") - if (rc != -1): + if rc != -1: rc = mystring.find("=") return (mystring[rc + 1:], library) @@ -512,7 +510,7 @@ def scan_for_autoload_pmds(dpdk_path): """ global raw_output - if (os.path.isfile(dpdk_path) is False): + if os.path.isfile(dpdk_path) is False: if raw_output is False: print("Must specify a file name") return @@ -527,16 +525,16 @@ def scan_for_autoload_pmds(dpdk_path): (autoload_path, scannedfile) = readelf.search_for_autoload_path() if not autoload_path: - if (raw_output is False): + if raw_output is False: print("No autoload path configured in %s" % dpdk_path) return - if (raw_output is False): - if (scannedfile is None): + if raw_output is False: + if scannedfile is None: scannedfile = dpdk_path print("Found autoload path %s in %s" % (autoload_path, scannedfile)) file.close() - if (raw_output is False): + if raw_output is False: print("Discovered Autoload HW Support:") scan_autoload_path(autoload_path) return @@ -591,7 +589,7 @@ def main(stream=None): options.pcifile = None pcidb = None - if (len(args) == 0): + if len(args) == 0: optparser.print_usage() exit(1) @@ -599,16 +597,16 @@ def main(stream=None): exit(scan_for_autoload_pmds(args[0])) ldlibpath = os.environ.get('LD_LIBRARY_PATH') - if (ldlibpath is None): + if ldlibpath is None: ldlibpath = "" - if (os.path.exists(args[0]) is True): + if os.path.exists(args[0]) is True: myelffile = args[0] else: myelffile = search_file( args[0], ldlibpath + ":/usr/lib64:/lib64:/usr/lib:/lib") - if (myelffile is None): + if myelffile is None: print("File not found") sys.exit(1) -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH 06/11] dpdk-pmdinfo: replace is False and is True 2020-09-06 1:31 [dpdk-dev] [PATCH 00/11] Python script updates Stephen Hemminger ` (4 preceding siblings ...) 2020-09-06 1:31 ` [dpdk-dev] [PATCH 05/11] dpdk-pmdinfo: remove unnecessary paren and else Stephen Hemminger @ 2020-09-06 1:31 ` Stephen Hemminger 2020-09-06 1:31 ` [dpdk-dev] [PATCH 07/11] dpdk-pmdinfo: fix indentation Stephen Hemminger ` (4 subsequent siblings) 10 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-09-06 1:31 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger Code reads better if unnecessary comparison with False and True is not used. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-pmdinfo.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index 32f8a82519fb..7c27a91182e4 100755 --- a/usertools/dpdk-pmdinfo.py +++ b/usertools/dpdk-pmdinfo.py @@ -367,7 +367,7 @@ def search_for_autoload_path(self): ":/usr/lib64:/lib64:/usr/lib:/lib") if library is None: return (None, None) - if raw_output is False: + if not raw_output: print("Scanning for autoload path in %s" % library) scanfile = open(library, 'rb') scanelf = ReadElf(scanfile, sys.stdout) @@ -443,7 +443,7 @@ def process_dt_needed_entries(self): runpath + ":" + ldlibpath + ":/usr/lib64:/lib64:/usr/lib:/lib") if library is not None: - if raw_output is False: + if not raw_output: print("Scanning %s for pmd information" % library) with open(library, 'rb') as file: try: @@ -473,7 +473,7 @@ def force_bytes(s): def scan_autoload_path(autoload_path): global raw_output - if os.path.exists(autoload_path) is False: + if not os.path.exists(autoload_path): return try: @@ -497,7 +497,7 @@ def scan_autoload_path(autoload_path): # No permission to read the file, skip it continue - if raw_output is False: + if not raw_output: print("Hw Support for library %s" % d) readelf.display_pmd_info_strings(".rodata") file.close() @@ -510,8 +510,8 @@ def scan_for_autoload_pmds(dpdk_path): """ global raw_output - if os.path.isfile(dpdk_path) is False: - if raw_output is False: + if not os.path.isfile(dpdk_path): + if not raw_output: print("Must specify a file name") return @@ -519,22 +519,22 @@ def scan_for_autoload_pmds(dpdk_path): try: readelf = ReadElf(file, sys.stdout) except ElfError: - if raw_output is False: + if not raw_output: print("Unable to parse %s" % file) return (autoload_path, scannedfile) = readelf.search_for_autoload_path() if not autoload_path: - if raw_output is False: + if not raw_output: print("No autoload path configured in %s" % dpdk_path) return - if raw_output is False: + if not raw_output: if scannedfile is None: scannedfile = dpdk_path print("Found autoload path %s in %s" % (autoload_path, scannedfile)) file.close() - if raw_output is False: + if not raw_output: print("Discovered Autoload HW Support:") scan_autoload_path(autoload_path) return @@ -593,14 +593,14 @@ def main(stream=None): optparser.print_usage() exit(1) - if options.pdir is True: + if options.pdir: exit(scan_for_autoload_pmds(args[0])) ldlibpath = os.environ.get('LD_LIBRARY_PATH') if ldlibpath is None: ldlibpath = "" - if os.path.exists(args[0]) is True: + if os.path.exists(args[0]): myelffile = args[0] else: myelffile = search_file( -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH 07/11] dpdk-pmdinfo: fix indentation 2020-09-06 1:31 [dpdk-dev] [PATCH 00/11] Python script updates Stephen Hemminger ` (5 preceding siblings ...) 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 ` Stephen Hemminger 2020-09-06 1:31 ` [dpdk-dev] [PATCH 08/11] dpdk-pmdinfo: replace deprecated optparse with argparse Stephen Hemminger ` (3 subsequent siblings) 10 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-09-06 1:31 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger This fixes indentation warnings from pylint. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-pmdinfo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index 7c27a91182e4..d72feb308a6c 100755 --- a/usertools/dpdk-pmdinfo.py +++ b/usertools/dpdk-pmdinfo.py @@ -323,7 +323,7 @@ def display_pmd_info_strings(self, section_spec): while dataptr < len(data): while (dataptr < len(data) and - not 32 <= byte2int(data[dataptr]) <= 127): + not 32 <= byte2int(data[dataptr]) <= 127): dataptr += 1 if dataptr >= len(data): @@ -389,7 +389,7 @@ def search_for_autoload_path(self): while dataptr < len(data): while (dataptr < len(data) and - not 32 <= byte2int(data[dataptr]) <= 127): + not 32 <= byte2int(data[dataptr]) <= 127): dataptr += 1 if dataptr >= len(data): -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH 08/11] dpdk-pmdinfo: replace deprecated optparse with argparse 2020-09-06 1:31 [dpdk-dev] [PATCH 00/11] Python script updates Stephen Hemminger ` (6 preceding siblings ...) 2020-09-06 1:31 ` [dpdk-dev] [PATCH 07/11] dpdk-pmdinfo: fix indentation Stephen Hemminger @ 2020-09-06 1:31 ` 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 ` (2 subsequent siblings) 10 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-09-06 1:31 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger The optparse module is deprecated and replaced with new argparse. The code now enforces the rule that only one of the output formats can be specified: raw or json. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-pmdinfo.py | 70 ++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 38 deletions(-) diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index d72feb308a6c..d746348f1415 100755 --- a/usertools/dpdk-pmdinfo.py +++ b/usertools/dpdk-pmdinfo.py @@ -11,10 +11,11 @@ import os import platform import sys +import argparse from elftools.common.exceptions import ELFError from elftools.common.py3compat import byte2int from elftools.elf.elffile import ELFFile -from optparse import OptionParser + # For running from development directory. It should take precedence over the # installed pyelftools. @@ -555,56 +556,49 @@ def main(stream=None): if not os.path.exists(pcifile_default): pcifile_default = "/usr/share/misc/pci_vendors" - optparser = OptionParser( - usage='usage: %prog [-hrtp] [-d <pci id file] <elf-file>', - description="Dump pmd hardware support info", - add_help_option=True) - optparser.add_option('-r', '--raw', - action='store_true', dest='raw_output', - help='Dump raw json strings') - optparser.add_option("-d", "--pcidb", dest="pcifile", - help="specify a pci database " - "to get vendor names from", - default=pcifile_default, metavar="FILE") - optparser.add_option("-t", "--table", dest="tblout", - help="output information on hw support as a " - "hex table", - action='store_true') - optparser.add_option("-p", "--plugindir", dest="pdir", - help="scan dpdk for autoload plugins", - action='store_true') - - options, args = optparser.parse_args() - - if options.raw_output: + parser = argparse.ArgumentParser( + usage='usage: %(prog)s [-hrtp] [-d <pci id file>] elf_file', + description="Dump pmd hardware support info") + group = parser.add_mutually_exclusive_group() + group.add_argument('-r', '--raw', + action='store_true', dest='raw_output', + help='dump raw json strings') + group.add_argument("-t", "--table", dest="tblout", + help="output information on hw support as a hex table", + action='store_true') + parser.add_argument("-d", "--pcidb", dest="pcifile", + help="specify a pci database to get vendor names from", + default=pcifile_default, metavar="FILE") + parser.add_argument("-p", "--plugindir", dest="pdir", + help="scan dpdk for autoload plugins", + action='store_true') + parser.add_argument("elf_file", help="driver shared object file") + args = parser.parse_args() + + if args.raw_output: raw_output = True - if options.pcifile: - pcidb = PCIIds(options.pcifile) + if args.tblout: + args.pcifile = None + + if args.pcifile: + pcidb = PCIIds(args.pcifile) if pcidb is None: print("Pci DB file not found") exit(1) - if options.tblout: - options.pcifile = None - pcidb = None - - if len(args) == 0: - optparser.print_usage() - exit(1) - - if options.pdir: + if args.pdir: exit(scan_for_autoload_pmds(args[0])) ldlibpath = os.environ.get('LD_LIBRARY_PATH') if ldlibpath is None: ldlibpath = "" - if os.path.exists(args[0]): - myelffile = args[0] + if os.path.exists(args.elf_file): + myelffile = args.elf_file else: - myelffile = search_file( - args[0], ldlibpath + ":/usr/lib64:/lib64:/usr/lib:/lib") + myelffile = search_file(args.elf_file, + ldlibpath + ":/usr/lib64:/lib64:/usr/lib:/lib") if myelffile is None: print("File not found") -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH 09/11] dpdk-pmdinfo: do not use len(x) to test for empty 2020-09-06 1:31 [dpdk-dev] [PATCH 00/11] Python script updates Stephen Hemminger ` (7 preceding siblings ...) 2020-09-06 1:31 ` [dpdk-dev] [PATCH 08/11] dpdk-pmdinfo: replace deprecated optparse with argparse Stephen Hemminger @ 2020-09-06 1:31 ` Stephen Hemminger 2020-09-07 9:03 ` Bruce Richardson 2020-09-06 1:31 ` [dpdk-dev] [PATCH 10/11] dpdk-telemetry-client: fix some pylint warnings Stephen Hemminger 2020-09-06 1:31 ` [dpdk-dev] [PATCH 11/11] dpdk-devbind: use argparse instead of getopt Stephen Hemminger 10 siblings, 1 reply; 40+ messages in thread From: Stephen Hemminger @ 2020-09-06 1:31 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger This fixes the following python lint warnings. usertools/dpdk-pmdinfo.py:188:11: C1801: Do not use `len(SEQUENCE)` to determine if a sequence is empty (len-as-condition) usertools/dpdk-pmdinfo.py:196:21: C1801: Do not use `len(SEQUENCE)` to determine if a sequence is empty (len-as-condition) usertools/dpdk-pmdinfo.py:302:11: C1801: Do not use `len(SEQUENCE)` to determine if a sequence is empty (len-as-condition) Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-pmdinfo.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py index d746348f1415..632271e2f1d2 100755 --- a/usertools/dpdk-pmdinfo.py +++ b/usertools/dpdk-pmdinfo.py @@ -185,7 +185,7 @@ def findDate(self, content): return None def parse(self): - if len(self.contents) < 1: + if not len(self.contents): print("data/%s-pci.ids not found" % self.date) else: vendorID = "" @@ -193,7 +193,7 @@ def parse(self): for l in self.contents: if l[0] == "#": continue - elif len(l.strip()) == 0: + elif not l.strip(): continue else: if l.find("\t\t") == 0: @@ -299,7 +299,7 @@ def parse_pmd_info_string(self, mystring): except KeyError: continue - if len(pmdinfo["pci_ids"]) != 0: + if pmdinfo["pci_ids"]: print("PMD HW SUPPORT:") if pcidb is not None: self.pretty_print_pmdinfo(pmdinfo) -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [dpdk-dev] [PATCH 09/11] dpdk-pmdinfo: do not use len(x) to test for empty 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 0 siblings, 1 reply; 40+ messages in thread From: Bruce Richardson @ 2020-09-07 9:03 UTC (permalink / raw) To: Stephen Hemminger; +Cc: dev On Sat, Sep 05, 2020 at 06:31:31PM -0700, Stephen Hemminger wrote: > This fixes the following python lint warnings. > usertools/dpdk-pmdinfo.py:188:11: C1801: Do not use `len(SEQUENCE)` to determine if a sequence is empty (len-as-condition) > usertools/dpdk-pmdinfo.py:196:21: C1801: Do not use `len(SEQUENCE)` to determine if a sequence is empty (len-as-condition) > usertools/dpdk-pmdinfo.py:302:11: C1801: Do not use `len(SEQUENCE)` to determine if a sequence is empty (len-as-condition) > > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> > --- > usertools/dpdk-pmdinfo.py | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/usertools/dpdk-pmdinfo.py b/usertools/dpdk-pmdinfo.py > index d746348f1415..632271e2f1d2 100755 > --- a/usertools/dpdk-pmdinfo.py > +++ b/usertools/dpdk-pmdinfo.py > @@ -185,7 +185,7 @@ def findDate(self, content): > return None > > def parse(self): > - if len(self.contents) < 1: > + if not len(self.contents): Does an empty sequence not directly resolve to false in python? If so, the len should be removable and just use "if not self.contents:" > print("data/%s-pci.ids not found" % self.date) > else: > vendorID = "" > @@ -193,7 +193,7 @@ def parse(self): > for l in self.contents: > if l[0] == "#": > continue > - elif len(l.strip()) == 0: > + elif not l.strip(): > continue > else: > if l.find("\t\t") == 0: > @@ -299,7 +299,7 @@ def parse_pmd_info_string(self, mystring): > except KeyError: > continue > > - if len(pmdinfo["pci_ids"]) != 0: > + if pmdinfo["pci_ids"]: > print("PMD HW SUPPORT:") > if pcidb is not None: > self.pretty_print_pmdinfo(pmdinfo) > -- > 2.27.0 > ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [dpdk-dev] [PATCH 09/11] dpdk-pmdinfo: do not use len(x) to test for empty 2020-09-07 9:03 ` Bruce Richardson @ 2020-09-07 17:20 ` Stephen Hemminger 0 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-09-07 17:20 UTC (permalink / raw) To: Bruce Richardson; +Cc: dev On Mon, 7 Sep 2020 10:03:43 +0100 Bruce Richardson <bruce.richardson@intel.com> wrote: > Does an empty sequence not directly resolve to false in python? If so, the > len should be removable and just use "if not self.contents:" Yes, len should be removed there ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH 10/11] dpdk-telemetry-client: fix some pylint warnings 2020-09-06 1:31 [dpdk-dev] [PATCH 00/11] Python script updates Stephen Hemminger ` (8 preceding siblings ...) 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-06 1:31 ` Stephen Hemminger 2020-09-07 9:05 ` Bruce Richardson 2020-11-04 7:00 ` [dpdk-dev] [PATCH v2] " Stephen Hemminger 2020-09-06 1:31 ` [dpdk-dev] [PATCH 11/11] dpdk-devbind: use argparse instead of getopt Stephen Hemminger 10 siblings, 2 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-09-06 1:31 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger Convert comments to docstrings as appropriate. Remove unnecessary paren in if statement. Remove extra whitespace after print. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-telemetry-client.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/usertools/dpdk-telemetry-client.py b/usertools/dpdk-telemetry-client.py index fa599046a46b..7a22d1b99864 100755 --- a/usertools/dpdk-telemetry-client.py +++ b/usertools/dpdk-telemetry-client.py @@ -32,7 +32,8 @@ def __del__(self): class Client: - def __init__(self): # Creates a client instance + def __init__(self): + ''' Creates a client instance ''' self.socket = Socket() self.file_path = None self.choice = None @@ -45,16 +46,18 @@ def __del__(self): except: print("Error - Client could not be destroyed") - def getFilepath(self, file_path): # Gets arguments from Command-Line and assigns to instance of client + def getFilepath(self, file_path): + '''Gets arguments from Command-Line and assigns to instance of client''' self.file_path = file_path - def register(self): # Connects a client to DPDK-instance + def register(self): + '''Connects a client to DPDK-instance''' if os.path.exists(self.file_path): os.unlink(self.file_path) try: self.socket.recv_fd.bind(self.file_path) except socket.error as msg: - print ("Error - Socket binding error: " + str(msg) + "\n") + print("Error - Socket binding error: " + str(msg) + "\n") self.socket.recv_fd.settimeout(2) self.socket.send_fd.connect("/var/run/dpdk/rte/telemetry") JSON = (API_REG + self.file_path + "\"}}") @@ -63,16 +66,19 @@ def register(self): # Connects a client to DPDK-instance self.socket.recv_fd.listen(1) self.socket.client_fd = self.socket.recv_fd.accept()[0] - def unregister(self): # Unregister a given client + def unregister(self): + ''' Unregister a given client ''' self.socket.client_fd.send((API_UNREG + self.file_path + "\"}}").encode()) self.socket.client_fd.close() - def requestMetrics(self): # Requests metrics for given client + def requestMetrics(self): + ''' Requests metrics for given client ''' self.socket.client_fd.send(METRICS_REQ.encode()) data = self.socket.client_fd.recv(BUFFER_SIZE).decode() print("\nResponse: \n", data) - def repeatedlyRequestMetrics(self, sleep_time): # Recursively requests metrics for given client + def repeatedlyRequestMetrics(self, sleep_time): + ''' Recursively requests metrics for given client ''' print("\nPlease enter the number of times you'd like to continuously request Metrics:") n_requests = int(input("\n:")) print("\033[F") #Removes the user input from screen, cleans it up @@ -81,12 +87,14 @@ def repeatedlyRequestMetrics(self, sleep_time): # Recursively requests metrics f self.requestMetrics() time.sleep(sleep_time) - def requestGlobalMetrics(self): #Requests global metrics for given client + def requestGlobalMetrics(self): + ''' Requests global metrics for given client ''' self.socket.client_fd.send(GLOBAL_METRICS_REQ.encode()) data = self.socket.client_fd.recv(BUFFER_SIZE).decode() print("\nResponse: \n", data) - def interactiveMenu(self, sleep_time): # Creates Interactive menu within the script + def interactiveMenu(self, sleep_time): + ''' Creates Interactive menu within the script ''' while self.choice != 4: print("\nOptions Menu") print("[1] Send for Metrics for all ports") @@ -116,7 +124,7 @@ def interactiveMenu(self, sleep_time): # Creates Interactive menu within the scr sleep_time = 1 file_path = "" - if (len(sys.argv) == 2): + if len(sys.argv) == 2: file_path = sys.argv[1] else: print("Warning - No filepath passed, using default (" + DEFAULT_FP + ").") -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [dpdk-dev] [PATCH 10/11] dpdk-telemetry-client: fix some pylint warnings 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 1 sibling, 0 replies; 40+ messages in thread From: Bruce Richardson @ 2020-09-07 9:05 UTC (permalink / raw) To: Stephen Hemminger; +Cc: dev On Sat, Sep 05, 2020 at 06:31:32PM -0700, Stephen Hemminger wrote: > Convert comments to docstrings as appropriate. > Remove unnecessary paren in if statement. > Remove extra whitespace after print. > > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> > --- > usertools/dpdk-telemetry-client.py | 28 ++++++++++++++++++---------- > 1 file changed, 18 insertions(+), 10 deletions(-) > Acked-by: Bruce Richardson <bruce.richardson@intel.com> ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2] dpdk-telemetry-client: fix some pylint warnings 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 ` Stephen Hemminger 2020-11-15 23:06 ` Thomas Monjalon 1 sibling, 1 reply; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 7:00 UTC (permalink / raw) To: kevin.laatz; +Cc: dev, Stephen Hemminger, Bruce Richardson Convert comments to docstrings as appropriate. Remove unnecessary paren in if statement. Remove extra whitespace after print. Remove extra semicolon; this is not C. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> Acked-by: Bruce Richardson <bruce.richardson@intel.com> --- v2 - fix a few more warnings. split this patch from the bundle usertools/dpdk-telemetry-client.py | 34 ++++++++++++++++++------------ 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/usertools/dpdk-telemetry-client.py b/usertools/dpdk-telemetry-client.py index d8e439027cfc..8da3e9caa126 100755 --- a/usertools/dpdk-telemetry-client.py +++ b/usertools/dpdk-telemetry-client.py @@ -16,7 +16,7 @@ DEFAULT_FP = "/var/run/dpdk/default_client" class Socket: - + ''' Opens AF_UNIX sockets to telemetry server ''' def __init__(self): self.send_fd = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET) self.recv_fd = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET) @@ -31,8 +31,9 @@ def __del__(self): print("Error - Sockets could not be closed") class Client: - - def __init__(self): # Creates a client instance + ''' Calls for communication with telemetry server ''' + def __init__(self): + ''' Creates a client instance ''' self.socket = Socket() self.file_path = None self.choice = None @@ -41,20 +42,22 @@ def __init__(self): # Creates a client instance def __del__(self): try: if self.unregistered == 0: - self.unregister(); + self.unregister() except: print("Error - Client could not be destroyed") - def getFilepath(self, file_path): # Gets arguments from Command-Line and assigns to instance of client + def getFilepath(self, file_path): + '''Gets arguments from Command-Line and assigns to instance of client''' self.file_path = file_path - def register(self): # Connects a client to DPDK-instance + def register(self): + '''Connects a client to DPDK-instance''' if os.path.exists(self.file_path): os.unlink(self.file_path) try: self.socket.recv_fd.bind(self.file_path) except socket.error as msg: - print ("Error - Socket binding error: " + str(msg) + "\n") + print("Error - Socket binding error: " + str(msg) + "\n") self.socket.recv_fd.settimeout(2) self.socket.send_fd.connect("/var/run/dpdk/rte/telemetry") JSON = (API_REG + self.file_path + "\"}}") @@ -63,16 +66,19 @@ def register(self): # Connects a client to DPDK-instance self.socket.recv_fd.listen(1) self.socket.client_fd = self.socket.recv_fd.accept()[0] - def unregister(self): # Unregister a given client + def unregister(self): + ''' Unregister a given client ''' self.socket.client_fd.send((API_UNREG + self.file_path + "\"}}").encode()) self.socket.client_fd.close() - def requestMetrics(self): # Requests metrics for given client + def requestMetrics(self): + ''' Requests metrics for given client ''' self.socket.client_fd.send(METRICS_REQ.encode()) data = self.socket.client_fd.recv(BUFFER_SIZE).decode() print("\nResponse: \n", data) - def repeatedlyRequestMetrics(self, sleep_time): # Recursively requests metrics for given client + def repeatedlyRequestMetrics(self, sleep_time): + ''' Recursively requests metrics for given client ''' print("\nPlease enter the number of times you'd like to continuously request Metrics:") n_requests = int(input("\n:")) print("\033[F") #Removes the user input from screen, cleans it up @@ -81,12 +87,14 @@ def repeatedlyRequestMetrics(self, sleep_time): # Recursively requests metrics f self.requestMetrics() time.sleep(sleep_time) - def requestGlobalMetrics(self): #Requests global metrics for given client + def requestGlobalMetrics(self): + ''' Requests global metrics for given client ''' self.socket.client_fd.send(GLOBAL_METRICS_REQ.encode()) data = self.socket.client_fd.recv(BUFFER_SIZE).decode() print("\nResponse: \n", data) - def interactiveMenu(self, sleep_time): # Creates Interactive menu within the script + def interactiveMenu(self, sleep_time): + ''' Creates Interactive menu within the script ''' while self.choice != 4: print("\nOptions Menu") print("[1] Send for Metrics for all ports") @@ -116,7 +124,7 @@ def interactiveMenu(self, sleep_time): # Creates Interactive menu within the scr sleep_time = 1 file_path = "" - if (len(sys.argv) == 2): + if len(sys.argv) == 2: file_path = sys.argv[1] else: print("Warning - No filepath passed, using default (" + DEFAULT_FP + ").") -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [dpdk-dev] [PATCH v2] dpdk-telemetry-client: fix some pylint warnings 2020-11-04 7:00 ` [dpdk-dev] [PATCH v2] " Stephen Hemminger @ 2020-11-15 23:06 ` Thomas Monjalon 0 siblings, 0 replies; 40+ messages in thread From: Thomas Monjalon @ 2020-11-15 23:06 UTC (permalink / raw) To: Stephen Hemminger Cc: kevin.laatz, dev, Bruce Richardson, ciara.power, david.marchand, robin.jarry 04/11/2020 08:00, Stephen Hemminger: > Convert comments to docstrings as appropriate. Why inserting some spaces inside the docstrings? > Remove unnecessary paren in if statement. > Remove extra whitespace after print. > Remove extra semicolon; this is not C. > > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> > Acked-by: Bruce Richardson <bruce.richardson@intel.com> Some issues are remaining: pycodestyle usertools/dpdk-telemetry-client.py usertools/dpdk-telemetry-client.py:12:80: E501 line too long (82 > 79 characters) usertools/dpdk-telemetry-client.py:14:80: E501 line too long (80 > 79 characters) usertools/dpdk-telemetry-client.py:15:80: E501 line too long (86 > 79 characters) usertools/dpdk-telemetry-client.py:18:1: E302 expected 2 blank lines, found 1 usertools/dpdk-telemetry-client.py:30:9: E722 do not use bare 'except' usertools/dpdk-telemetry-client.py:33:1: E302 expected 2 blank lines, found 1 usertools/dpdk-telemetry-client.py:46:9: E722 do not use bare 'except' usertools/dpdk-telemetry-client.py:50:80: E501 line too long (80 > 79 characters) usertools/dpdk-telemetry-client.py:71:80: E501 line too long (82 > 79 characters) usertools/dpdk-telemetry-client.py:82:80: E501 line too long (95 > 79 characters) usertools/dpdk-telemetry-client.py:84:24: E261 at least two spaces before inline comment usertools/dpdk-telemetry-client.py:84:25: E262 inline comment should start with '# ' usertools/dpdk-telemetry-client.py:107:32: E261 at least two spaces before inline comment usertools/dpdk-telemetry-client.py:107:33: E262 inline comment should start with '# ' usertools/dpdk-telemetry-client.py:107:80: E501 line too long (80 > 79 characters) usertools/dpdk-telemetry-client.py:120:13: E722 do not use bare 'except' usertools/dpdk-telemetry-client.py:123:1: E305 expected 2 blank lines after class or function definition, found 1 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH 11/11] dpdk-devbind: use argparse instead of getopt 2020-09-06 1:31 [dpdk-dev] [PATCH 00/11] Python script updates Stephen Hemminger ` (9 preceding siblings ...) 2020-09-06 1:31 ` [dpdk-dev] [PATCH 10/11] dpdk-telemetry-client: fix some pylint warnings Stephen Hemminger @ 2020-09-06 1:31 ` Stephen Hemminger 2020-11-04 7:03 ` [dpdk-dev] [PATCH v2 0/6] dpdk-devbind: python lint cleanups Stephen Hemminger 10 siblings, 1 reply; 40+ messages in thread From: Stephen Hemminger @ 2020-09-06 1:31 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger Using the python standard argument parser instead of C library style getopt gives a number of advantages such as checking for conflicting arguments, restricting choices, and automatically generating help messages. The result is similar to the original the only visible change is that some of the help messages are now less wordy. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-devbind.py | 196 +++++++++++++++++--------------------- 1 file changed, 85 insertions(+), 111 deletions(-) diff --git a/usertools/dpdk-devbind.py b/usertools/dpdk-devbind.py index bcdc5da881d9..33d3ef798f7d 100755 --- a/usertools/dpdk-devbind.py +++ b/usertools/dpdk-devbind.py @@ -5,8 +5,8 @@ import sys import os -import getopt import subprocess +import argparse from os.path import exists, abspath, dirname, basename # The PCI base class for all devices @@ -72,76 +72,6 @@ args = [] -def usage(): - '''Print usage information for the program''' - argv0 = basename(sys.argv[0]) - print(""" -Usage: ------- - - %(argv0)s [options] DEVICE1 DEVICE2 .... - -where DEVICE1, DEVICE2 etc, are specified via PCI "domain:bus:slot.func" syntax -or "bus:slot.func" syntax. For devices bound to Linux kernel drivers, they may -also be referred to by Linux interface name e.g. eth0, eth1, em0, em1, etc. - -Options: - --help, --usage: - Display usage information and quit - - -s, --status: - Print the current status of all known network, crypto, event - and mempool devices. - For each device, it displays the PCI domain, bus, slot and function, - along with a text description of the device. Depending upon whether the - device is being used by a kernel driver, the igb_uio driver, or no - driver, other relevant information will be displayed: - * the Linux interface name e.g. if=eth0 - * the driver being used e.g. drv=igb_uio - * any suitable drivers not currently using that device - e.g. unused=igb_uio - NOTE: if this flag is passed along with a bind/unbind option, the - status display will always occur after the other operations have taken - place. - - --status-dev: - Print the status of given device group. Supported device groups are: - "net", "baseband", "crypto", "event", "mempool" and "compress" - - -b driver, --bind=driver: - Select the driver to use or \"none\" to unbind the device - - -u, --unbind: - Unbind a device (Equivalent to \"-b none\") - - --force: - By default, network devices which are used by Linux - as indicated by - having routes in the routing table - cannot be modified. Using the - --force flag overrides this behavior, allowing active links to be - forcibly unbound. - WARNING: This can lead to loss of network connection and should be used - with caution. - -Examples: ---------- - -To display current device status: - %(argv0)s --status - -To display current network device status: - %(argv0)s --status-dev net - -To bind eth1 from the current driver and move to use igb_uio - %(argv0)s --bind=igb_uio eth1 - -To unbind 0000:01:00.0 from using any driver - %(argv0)s -u 0000:01:00.0 - -To bind 0000:02:00.0 and 0000:02:00.1 to the ixgbe kernel driver - %(argv0)s -b ixgbe 02:00.0 02:00.1 - - """ % locals()) # replace items from local variables - # check if a specific kernel module is loaded def module_is_loaded(module): global loaded_modules @@ -642,38 +572,93 @@ def parse_args(): global status_dev global force_flag global args - if len(sys.argv) <= 1: - usage() - sys.exit(0) - try: - opts, args = getopt.getopt(sys.argv[1:], "b:us", - ["help", "usage", "status", "status-dev=", - "force", "bind=", "unbind", ]) - except getopt.GetoptError as error: - print(str(error)) - print("Run '%s --usage' for further information" % sys.argv[0]) + parser = argparse.ArgumentParser( + description='Utility to bind and unbind devices from Linux kernel', + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +Examples: +--------- + +To display current device status: + %(prog)s --status + +To display current network device status: + %(prog)s --status-dev net + +To bind eth1 from the current driver and move to use vfio-pci + %(prog)s --bind=vfio-pci eth1 + +To unbind 0000:01:00.0 from using any driver + %(prog)s -u 0000:01:00.0 + +To bind 0000:02:00.0 and 0000:02:00.1 to the ixgbe kernel driver + %(prog)s -b ixgbe 02:00.0 02:00.1 +""") + + parser.add_argument( + '-s', + '--status', + action='store_true', + help="Print the current status of all known devices.") + parser.add_argument( + '--status-dev', + help="Print the status of given device group.", + choices=['net', 'baseband', 'crypto', 'event', 'mempool', 'compress']) + bind_group = parser.add_mutually_exclusive_group() + bind_group.add_argument( + '-b', + '--bind', + metavar='DRIVER', + help="Select the driver to use or \"none\" to unbind the device") + bind_group.add_argument( + '-u', + '--unbind', + action='store_true', + help="Unbind a device (equivalent to \"-b none\")") + parser.add_argument( + '--force', + action='store_true', + help=""" +Override restriction on binding devices in use by Linux" +WARNING: This can lead to loss of network connection and should be used with caution. +""") + parser.add_argument( + 'devices', + metavar='DEVICE', + nargs='*', + help=""" +Device specified as PCI "domain:bus:slot.func" syntax or "bus:slot.func" syntax. +For devices bound to Linux kernel drivers, they may be referred to by interface name. +""") + + opt = parser.parse_args() + + if opt.status_dev: + status_flag = True + status_dev = opt.status_dev + if opt.status: + status_flag = True + status_dev = "all" + if opt.force: + force_flag = True + if opt.bind: + b_flag = opt.bind + elif opt.unbind: + b_flag = "none" + args = opt.devices + + if not b_flag and not status_flag: + print("Error: No action specified for devices. " + "Please give a --bind, --ubind or --status option", + file=sys.stderr) + parser.print_usage() sys.exit(1) - for opt, arg in opts: - if opt == "--help" or opt == "--usage": - usage() - sys.exit(0) - if opt == "--status-dev": - status_flag = True - status_dev = arg - if opt == "--status" or opt == "-s": - status_flag = True - status_dev = "all" - if opt == "--force": - force_flag = True - if opt == "-b" or opt == "-u" or opt == "--bind" or opt == "--unbind": - if b_flag is not None: - sys.exit("Error: binding and unbinding are mutually exclusive") - if opt == "-u" or opt == "--unbind": - b_flag = "none" - else: - b_flag = arg + if b_flag and not args: + print("Error: No devices specified.", file=sys.stderr) + parser.print_usage() + sys.exit(1) def do_arg_actions(): @@ -683,17 +668,6 @@ def do_arg_actions(): global force_flag global args - if b_flag is None and not status_flag: - print("Error: No action specified for devices. " - "Please give a -b or -u option", file=sys.stderr) - usage() - sys.exit(1) - - if b_flag is not None and len(args) == 0: - print("Error: No devices specified.", file=sys.stderr) - usage() - sys.exit(1) - if b_flag == "none" or b_flag == "None": unbind_all(args, force_flag) elif b_flag is not None: -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2 0/6] dpdk-devbind: python lint cleanups 2020-09-06 1:31 ` [dpdk-dev] [PATCH 11/11] dpdk-devbind: use argparse instead of getopt Stephen Hemminger @ 2020-11-04 7:03 ` Stephen Hemminger 2020-11-04 7:03 ` [dpdk-dev] [PATCH v2 1/6] dpdk-devbind: use argparse instead of getopt Stephen Hemminger ` (7 more replies) 0 siblings, 8 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 7:03 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger This addresses several warnings from python3 lint. Split out from earlier patchset Stephen Hemminger (6): dpdk-devbind: use argparse instead of getopt dpdk-devbind: fix indentation dpdk-devbind: fix python lint warnings for imports dpdk-devbind: do not use len(x) to test for empty dpdk-devbind: fix unnecessary else after return dpdk-devbind: use in to test for multiple strings usertools/dpdk-devbind.py | 315 +++++++++++++++++--------------------- 1 file changed, 142 insertions(+), 173 deletions(-) -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2 1/6] dpdk-devbind: use argparse instead of getopt 2020-11-04 7:03 ` [dpdk-dev] [PATCH v2 0/6] dpdk-devbind: python lint cleanups Stephen Hemminger @ 2020-11-04 7:03 ` Stephen Hemminger 2020-11-04 7:03 ` [dpdk-dev] [PATCH v2 2/6] dpdk-devbind: fix indentation Stephen Hemminger ` (6 subsequent siblings) 7 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 7:03 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger Using the python standard argument parser instead of C library style getopt gives a number of advantages such as checking for conflicting arguments, restricting choices, and automatically generating help messages. The result is similar to the original the only visible change is that some of the help messages are now less wordy. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-devbind.py | 203 ++++++++++++++++---------------------- 1 file changed, 86 insertions(+), 117 deletions(-) diff --git a/usertools/dpdk-devbind.py b/usertools/dpdk-devbind.py index 99112b7ab794..e0b74c5a3e41 100755 --- a/usertools/dpdk-devbind.py +++ b/usertools/dpdk-devbind.py @@ -5,8 +5,9 @@ import sys import os -import getopt import subprocess +import argparse + from glob import glob from os.path import exists, abspath, dirname, basename from os.path import join as path_join @@ -82,82 +83,6 @@ force_flag = False args = [] - -def usage(): - '''Print usage information for the program''' - argv0 = basename(sys.argv[0]) - print(""" -Usage: ------- - - %(argv0)s [options] DEVICE1 DEVICE2 .... - -where DEVICE1, DEVICE2 etc, are specified via PCI "domain:bus:slot.func" syntax -or "bus:slot.func" syntax. For devices bound to Linux kernel drivers, they may -also be referred to by Linux interface name e.g. eth0, eth1, em0, em1, etc. -If devices are specified using PCI <domain:>bus:device:func format, then -shell wildcards and ranges may be used, e.g. 80:04.*, 80:04.[0-3] - -Options: - --help, --usage: - Display usage information and quit - - -s, --status: - Print the current status of all known network, crypto, event - and mempool devices. - For each device, it displays the PCI domain, bus, slot and function, - along with a text description of the device. Depending upon whether the - device is being used by a kernel driver, the igb_uio driver, or no - driver, other relevant information will be displayed: - * the Linux interface name e.g. if=eth0 - * the driver being used e.g. drv=igb_uio - * any suitable drivers not currently using that device - e.g. unused=igb_uio - NOTE: if this flag is passed along with a bind/unbind option, the - status display will always occur after the other operations have taken - place. - - --status-dev: - Print the status of given device group. Supported device groups are: - "net", "baseband", "crypto", "event", "mempool" and "compress" - - -b driver, --bind=driver: - Select the driver to use or \"none\" to unbind the device - - -u, --unbind: - Unbind a device (Equivalent to \"-b none\") - - --force: - By default, network devices which are used by Linux - as indicated by - having routes in the routing table - cannot be modified. Using the - --force flag overrides this behavior, allowing active links to be - forcibly unbound. - WARNING: This can lead to loss of network connection and should be used - with caution. - -Examples: ---------- - -To display current device status: - %(argv0)s --status - -To display current network device status: - %(argv0)s --status-dev net - -To bind eth1 from the current driver and move to use igb_uio - %(argv0)s --bind=igb_uio eth1 - -To unbind 0000:01:00.0 from using any driver - %(argv0)s -u 0000:01:00.0 - -To bind 0000:02:00.0 and 0000:02:00.1 to the ixgbe kernel driver - %(argv0)s -b ixgbe 02:00.0 02:00.1 - -To bind all functions on device 0000:02:00 to ixgbe kernel driver - %(argv0)s -b ixgbe 02:00.* - - """ % locals()) # replace items from local variables - # check if a specific kernel module is loaded def module_is_loaded(module): global loaded_modules @@ -677,38 +602,93 @@ def parse_args(): global status_dev global force_flag global args - if len(sys.argv) <= 1: - usage() - sys.exit(0) - try: - opts, args = getopt.getopt(sys.argv[1:], "b:us", - ["help", "usage", "status", "status-dev=", - "force", "bind=", "unbind", ]) - except getopt.GetoptError as error: - print(str(error)) - print("Run '%s --usage' for further information" % sys.argv[0]) + parser = argparse.ArgumentParser( + description='Utility to bind and unbind devices from Linux kernel', + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +Examples: +--------- + +To display current device status: + %(prog)s --status + +To display current network device status: + %(prog)s --status-dev net + +To bind eth1 from the current driver and move to use vfio-pci + %(prog)s --bind=vfio-pci eth1 + +To unbind 0000:01:00.0 from using any driver + %(prog)s -u 0000:01:00.0 + +To bind 0000:02:00.0 and 0000:02:00.1 to the ixgbe kernel driver + %(prog)s -b ixgbe 02:00.0 02:00.1 +""") + + parser.add_argument( + '-s', + '--status', + action='store_true', + help="Print the current status of all known devices.") + parser.add_argument( + '--status-dev', + help="Print the status of given device group.", + choices=['net', 'baseband', 'crypto', 'event', 'mempool', 'compress']) + bind_group = parser.add_mutually_exclusive_group() + bind_group.add_argument( + '-b', + '--bind', + metavar='DRIVER', + help="Select the driver to use or \"none\" to unbind the device") + bind_group.add_argument( + '-u', + '--unbind', + action='store_true', + help="Unbind a device (equivalent to \"-b none\")") + parser.add_argument( + '--force', + action='store_true', + help=""" +Override restriction on binding devices in use by Linux" +WARNING: This can lead to loss of network connection and should be used with caution. +""") + parser.add_argument( + 'devices', + metavar='DEVICE', + nargs='*', + help=""" +Device specified as PCI "domain:bus:slot.func" syntax or "bus:slot.func" syntax. +For devices bound to Linux kernel drivers, they may be referred to by interface name. +""") + + opt = parser.parse_args() + + if opt.status_dev: + status_flag = True + status_dev = opt.status_dev + if opt.status: + status_flag = True + status_dev = "all" + if opt.force: + force_flag = True + if opt.bind: + b_flag = opt.bind + elif opt.unbind: + b_flag = "none" + args = opt.devices + + if not b_flag and not status_flag: + print("Error: No action specified for devices. " + "Please give a --bind, --ubind or --status option", + file=sys.stderr) + parser.print_usage() sys.exit(1) - for opt, arg in opts: - if opt == "--help" or opt == "--usage": - usage() - sys.exit(0) - if opt == "--status-dev": - status_flag = True - status_dev = arg - if opt == "--status" or opt == "-s": - status_flag = True - status_dev = "all" - if opt == "--force": - force_flag = True - if opt == "-b" or opt == "-u" or opt == "--bind" or opt == "--unbind": - if b_flag is not None: - sys.exit("Error: binding and unbinding are mutually exclusive") - if opt == "-u" or opt == "--unbind": - b_flag = "none" - else: - b_flag = arg + if b_flag and not args: + print("Error: No devices specified.", file=sys.stderr) + parser.print_usage() + sys.exit(1) # resolve any PCI globs in the args new_args = [] @@ -723,17 +703,6 @@ def do_arg_actions(): global force_flag global args - if b_flag is None and not status_flag: - print("Error: No action specified for devices. " - "Please give a -b or -u option", file=sys.stderr) - usage() - sys.exit(1) - - if b_flag is not None and len(args) == 0: - print("Error: No devices specified.", file=sys.stderr) - usage() - sys.exit(1) - if b_flag == "none" or b_flag == "None": unbind_all(args, force_flag) elif b_flag is not None: -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2 2/6] dpdk-devbind: fix indentation 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 ` Stephen Hemminger 2020-11-04 7:03 ` [dpdk-dev] [PATCH v2 3/6] dpdk-devbind: fix python lint warnings for imports Stephen Hemminger ` (5 subsequent siblings) 7 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 7:03 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger Python lint complains about identation and missing spaces around commas in this script. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-devbind.py | 53 ++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/usertools/dpdk-devbind.py b/usertools/dpdk-devbind.py index e0b74c5a3e41..3a27641d0e08 100755 --- a/usertools/dpdk-devbind.py +++ b/usertools/dpdk-devbind.py @@ -14,15 +14,15 @@ # The PCI base class for all devices network_class = {'Class': '02', 'Vendor': None, 'Device': None, - 'SVendor': None, 'SDevice': None} + 'SVendor': None, 'SDevice': None} acceleration_class = {'Class': '12', 'Vendor': None, 'Device': None, 'SVendor': None, 'SDevice': None} ifpga_class = {'Class': '12', 'Vendor': '8086', 'Device': '0b30', - 'SVendor': None, 'SDevice': None} + 'SVendor': None, 'SDevice': None} encryption_class = {'Class': '10', 'Vendor': None, 'Device': None, - 'SVendor': None, 'SDevice': None} + 'SVendor': None, 'SDevice': None} intel_processor_class = {'Class': '0b', 'Vendor': '8086', 'Device': None, - 'SVendor': None, 'SDevice': None} + 'SVendor': None, 'SDevice': None} cavium_sso = {'Class': '08', 'Vendor': '177d', 'Device': 'a04b,a04d', 'SVendor': None, 'SDevice': None} cavium_fpa = {'Class': '08', 'Vendor': '177d', 'Device': 'a053', @@ -34,29 +34,30 @@ cavium_zip = {'Class': '12', 'Vendor': '177d', 'Device': 'a037', 'SVendor': None, 'SDevice': None} avp_vnic = {'Class': '05', 'Vendor': '1af4', 'Device': '1110', - 'SVendor': None, 'SDevice': None} + 'SVendor': None, 'SDevice': None} octeontx2_sso = {'Class': '08', 'Vendor': '177d', 'Device': 'a0f9,a0fa', - 'SVendor': None, 'SDevice': None} + 'SVendor': None, 'SDevice': None} octeontx2_npa = {'Class': '08', 'Vendor': '177d', 'Device': 'a0fb,a0fc', - 'SVendor': None, 'SDevice': None} + 'SVendor': None, 'SDevice': None} octeontx2_dma = {'Class': '08', 'Vendor': '177d', 'Device': 'a081', - 'SVendor': None, 'SDevice': None} + 'SVendor': None, 'SDevice': None} octeontx2_ree = {'Class': '08', 'Vendor': '177d', 'Device': 'a0f4', - 'SVendor': None, 'SDevice': None} + 'SVendor': None, 'SDevice': None} -intel_ioat_bdw = {'Class': '08', 'Vendor': '8086', 'Device': '6f20,6f21,6f22,6f23,6f24,6f25,6f26,6f27,6f2e,6f2f', - 'SVendor': None, 'SDevice': None} +intel_ioat_bdw = {'Class': '08', 'Vendor': '8086', + 'Device': '6f20,6f21,6f22,6f23,6f24,6f25,6f26,6f27,6f2e,6f2f', + 'SVendor': None, 'SDevice': None} intel_ioat_skx = {'Class': '08', 'Vendor': '8086', 'Device': '2021', - 'SVendor': None, 'SDevice': None} + 'SVendor': None, 'SDevice': None} intel_ioat_icx = {'Class': '08', 'Vendor': '8086', 'Device': '0b00', - 'SVendor': None, 'SDevice': None} + 'SVendor': None, 'SDevice': None} intel_idxd_spr = {'Class': '08', 'Vendor': '8086', 'Device': '0b25', - 'SVendor': None, 'SDevice': None} + 'SVendor': None, 'SDevice': None} intel_ntb_skx = {'Class': '06', 'Vendor': '8086', 'Device': '201c', - 'SVendor': None, 'SDevice': None} + 'SVendor': None, 'SDevice': None} intel_ntb_icx = {'Class': '06', 'Vendor': '8086', 'Device': '347e', - 'SVendor': None, 'SDevice': None} + 'SVendor': None, 'SDevice': None} network_devices = [network_class, cavium_pkx, avp_vnic, ifpga_class] baseband_devices = [acceleration_class] @@ -206,7 +207,7 @@ def get_device_details(devices_type): route = subprocess.check_output(["ip", "-o", "route"]) # filter out all lines for 169.254 routes route = "\n".join(filter(lambda ln: not ln.startswith("169.254"), - route.decode().splitlines())) + route.decode().splitlines())) rt_info = route.split() for i in range(len(rt_info) - 1): if rt_info[i] == "dev": @@ -366,8 +367,8 @@ def bind_one(dev_id, driver, force): return try: # Convert Device and Vendor Id to int to write to new_id - f.write("%04x %04x" % (int(dev["Vendor"],16), - int(dev["Device"], 16))) + f.write("%04x %04x" % (int(dev["Vendor"], 16), + int(dev["Device"], 16))) f.close() except: print("Error: bind failed for %s - Cannot write new PCI ID to " @@ -409,13 +410,13 @@ def bind_one(dev_id, driver, force): f = open(filename, "w") except: sys.exit("Error: unbind failed for %s - Cannot open %s" - % (dev_id, filename)) + % (dev_id, filename)) try: f.write("\00") f.close() except: sys.exit("Error: unbind failed for %s - Cannot open %s" - % (dev_id, filename)) + % (dev_id, filename)) def unbind_all(dev_list, force=False): @@ -456,7 +457,7 @@ def bind_all(dev_list, driver, force=False): pass # check if we're attempting to bind to a driver that isn't loaded - if not module_is_loaded(driver.replace('-','_')): + if not module_is_loaded(driver.replace('-', '_')): sys.exit("Error: Driver '%s' is not loaded." % driver) try: @@ -501,9 +502,9 @@ def display_devices(title, dev_list, extra_params=None): for dev in dev_list: if extra_params is not None: strings.append("%s '%s %s' %s" % (dev["Slot"], - dev["Device_str"], - dev["Device"], - extra_params % dev)) + dev["Device_str"], + dev["Device"], + extra_params % dev)) else: strings.append("%s '%s'" % (dev["Slot"], dev["Device_str"])) # sort before printing, so that the entries appear in PCI order @@ -573,7 +574,7 @@ def show_status(): show_device_status(mempool_devices, "Mempool") if status_dev == "compress" or status_dev == "all": - show_device_status(compress_devices , "Compress") + show_device_status(compress_devices, "Compress") if status_dev == "misc" or status_dev == "all": show_device_status(misc_devices, "Misc (rawdev)") -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2 3/6] dpdk-devbind: fix python lint warnings for imports 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 ` 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 ` (4 subsequent siblings) 7 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 7:03 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger Address python lint complaints about unused imports. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-devbind.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/usertools/dpdk-devbind.py b/usertools/dpdk-devbind.py index 3a27641d0e08..4148b66b6841 100755 --- a/usertools/dpdk-devbind.py +++ b/usertools/dpdk-devbind.py @@ -9,7 +9,7 @@ import argparse from glob import glob -from os.path import exists, abspath, dirname, basename +from os.path import exists, basename from os.path import join as path_join # The PCI base class for all devices @@ -342,7 +342,7 @@ def bind_one(dev_id, driver, force): # of unbinding those devices if driver in dpdk_drivers: filename = "/sys/bus/pci/devices/%s/driver_override" % dev_id - if os.path.exists(filename): + if exists(filename): try: f = open(filename, "w") except: @@ -405,7 +405,7 @@ def bind_one(dev_id, driver, force): # Before unbinding it, overwrite driver_override with empty string so that # the device can be bound to any other driver filename = "/sys/bus/pci/devices/%s/driver_override" % dev_id - if os.path.exists(filename): + if exists(filename): try: f = open(filename, "w") except: @@ -473,7 +473,7 @@ def bind_all(dev_list, driver, force=False): # that are not bound to any other driver could be bound even if no one has # asked them to. hence, we check the list of drivers again, and see if # some of the previously-unbound devices were erroneously bound. - if not os.path.exists("/sys/bus/pci/devices/%s/driver_override" % d): + if not exists("/sys/bus/pci/devices/%s/driver_override" % d): for d in devices.keys(): # skip devices that were already bound or that we know should be bound if "Driver_str" in devices[d] or d in dev_list: -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2 4/6] dpdk-devbind: do not use len(x) to test for empty 2020-11-04 7:03 ` [dpdk-dev] [PATCH v2 0/6] dpdk-devbind: python lint cleanups Stephen Hemminger ` (2 preceding siblings ...) 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 ` Stephen Hemminger 2020-11-04 7:03 ` [dpdk-dev] [PATCH v2 5/6] dpdk-devbind: fix unnecessary else after return Stephen Hemminger ` (3 subsequent siblings) 7 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 7:03 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger Python lint warns about using len(SEQUENCE) to determine if sequence is empty. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-devbind.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/usertools/dpdk-devbind.py b/usertools/dpdk-devbind.py index 4148b66b6841..afe93a217d79 100755 --- a/usertools/dpdk-devbind.py +++ b/usertools/dpdk-devbind.py @@ -143,7 +143,7 @@ def get_pci_device_details(dev_id, probe_lspci): extra_info = subprocess.check_output(["lspci", "-vmmks", dev_id]).splitlines() # parse lspci details for line in extra_info: - if len(line) == 0: + if not line: continue name, value = line.decode("utf8").split("\t", 1) name = name.strip(":") + "_str" @@ -178,7 +178,7 @@ def get_device_details(devices_type): dev = {} dev_lines = subprocess.check_output(["lspci", "-Dvmmnnk"]).splitlines() for dev_line in dev_lines: - if len(dev_line) == 0: + if not dev_line: if device_type_match(dev, devices_type): # Replace "Driver" with "Driver_str" to have consistency of # of dictionary key names @@ -193,7 +193,7 @@ def get_device_details(devices_type): else: name, value = dev_line.decode("utf8").split("\t", 1) value_list = value.rsplit(' ', 1) - if len(value_list) > 1: + if value_list: # String stored in <name>_str dev[name.rstrip(":") + '_str'] = value_list[0] # Numeric IDs @@ -496,7 +496,7 @@ def display_devices(title, dev_list, extra_params=None): strings = [] # this holds the strings to print. We sort before printing print("\n%s" % title) print("="*len(title)) - if len(dev_list) == 0: + if not dev_list: strings.append("<none>") else: for dev in dev_list: @@ -539,17 +539,17 @@ def show_device_status(devices_type, device_name, if_field=False): return # print each category separately, so we can clearly see what's used by DPDK - if len(dpdk_drv) != 0: + if dpdk_drv: display_devices("%s devices using DPDK-compatible driver" % device_name, dpdk_drv, "drv=%(Driver_str)s unused=%(Module_str)s") - if len(kernel_drv) != 0: + if kernel_drv: if_text = "" if if_field: if_text = "if=%(Interface)s " display_devices("%s devices using kernel driver" % device_name, kernel_drv, if_text + "drv=%(Driver_str)s " "unused=%(Module_str)s %(Active)s") - if len(no_drv) != 0: + if no_drv: display_devices("Other %s devices" % device_name, no_drv, "unused=%(Module_str)s") -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2 5/6] dpdk-devbind: fix unnecessary else after return 2020-11-04 7:03 ` [dpdk-dev] [PATCH v2 0/6] dpdk-devbind: python lint cleanups Stephen Hemminger ` (3 preceding siblings ...) 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 ` Stephen Hemminger 2020-11-04 7:03 ` [dpdk-dev] [PATCH v2 6/6] dpdk-devbind: use in to test for multiple strings Stephen Hemminger ` (2 subsequent siblings) 7 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 7:03 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger Python lint complains about Unnecessary "else" after "return" (no-else-return) Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-devbind.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/usertools/dpdk-devbind.py b/usertools/dpdk-devbind.py index afe93a217d79..47373e27bd74 100755 --- a/usertools/dpdk-devbind.py +++ b/usertools/dpdk-devbind.py @@ -274,13 +274,13 @@ def dev_id_from_dev_name(dev_name): if dev_name in devices: return dev_name # check if it's an index just missing the domain part - elif "0000:" + dev_name in devices: + if "0000:" + dev_name in devices: return "0000:" + dev_name - else: - # check if it's an interface name, e.g. eth1 - for d in devices.keys(): - if dev_name in devices[d]["Interface"].split(","): - return devices[d]["Slot"] + + # check if it's an interface name, e.g. eth1 + for d in devices.keys(): + if dev_name in devices[d]["Interface"].split(","): + return devices[d]["Slot"] # if nothing else matches - error raise ValueError("Unknown device: %s. " "Please specify device in \"bus:slot.func\" format" % dev_name) @@ -329,10 +329,9 @@ def bind_one(dev_id, driver, force): print("Notice: %s already bound to driver %s, skipping" % (dev_id, driver), file=sys.stderr) return - else: - saved_driver = dev["Driver_str"] - unbind_one(dev_id, force) - dev["Driver_str"] = "" # clear driver string + saved_driver = dev["Driver_str"] + unbind_one(dev_id, force) + dev["Driver_str"] = "" # clear driver string # For kernels >= 3.15 driver_override can be used to specify the driver # for a device rather than relying on the driver to provide a positive -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* [dpdk-dev] [PATCH v2 6/6] dpdk-devbind: use in to test for multiple strings 2020-11-04 7:03 ` [dpdk-dev] [PATCH v2 0/6] dpdk-devbind: python lint cleanups Stephen Hemminger ` (4 preceding siblings ...) 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 ` Stephen Hemminger 2020-11-04 9:28 ` [dpdk-dev] [PATCH v2 0/6] dpdk-devbind: python lint cleanups Bruce Richardson 2020-11-04 16:57 ` Stephen Hemminger 7 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 7:03 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger Python lint suggests using in instead of multiple comparisons. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- usertools/dpdk-devbind.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/usertools/dpdk-devbind.py b/usertools/dpdk-devbind.py index 47373e27bd74..054ad2e1cfbd 100755 --- a/usertools/dpdk-devbind.py +++ b/usertools/dpdk-devbind.py @@ -557,28 +557,28 @@ def show_status(): Displays to the user what devices are bound to the igb_uio driver, the kernel driver or to no driver''' - if status_dev == "net" or status_dev == "all": + if status_dev in ["net", "all"]: show_device_status(network_devices, "Network", if_field=True) - if status_dev == "baseband" or status_dev == "all": + if status_dev in ["baseband", "all"]: show_device_status(baseband_devices, "Baseband") - if status_dev == "crypto" or status_dev == "all": + if status_dev in ["crypto", "all"]: show_device_status(crypto_devices, "Crypto") - if status_dev == "event" or status_dev == "all": + if status_dev in ["event", "all"]: show_device_status(eventdev_devices, "Eventdev") - if status_dev == "mempool" or status_dev == "all": + if status_dev in ["mempool", "all"]: show_device_status(mempool_devices, "Mempool") - if status_dev == "compress" or status_dev == "all": + if status_dev in ["compress", "all"]: show_device_status(compress_devices, "Compress") - if status_dev == "misc" or status_dev == "all": + if status_dev in ["misc", "all"]: show_device_status(misc_devices, "Misc (rawdev)") - if status_dev == "regex" or status_dev == "all": + if status_dev in ["regex", "all"]: show_device_status(regex_devices, "Regex") @@ -703,7 +703,7 @@ def do_arg_actions(): global force_flag global args - if b_flag == "none" or b_flag == "None": + if b_flag in ["none", "None"]: unbind_all(args, force_flag) elif b_flag is not None: bind_all(args, b_flag, force_flag) -- 2.27.0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [dpdk-dev] [PATCH v2 0/6] dpdk-devbind: python lint cleanups 2020-11-04 7:03 ` [dpdk-dev] [PATCH v2 0/6] dpdk-devbind: python lint cleanups Stephen Hemminger ` (5 preceding siblings ...) 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 ` Bruce Richardson 2020-11-22 21:03 ` Thomas Monjalon 2020-11-04 16:57 ` Stephen Hemminger 7 siblings, 1 reply; 40+ messages in thread From: Bruce Richardson @ 2020-11-04 9:28 UTC (permalink / raw) To: Stephen Hemminger; +Cc: dev On Tue, Nov 03, 2020 at 11:03:44PM -0800, Stephen Hemminger wrote: > This addresses several warnings from python3 lint. > Split out from earlier patchset > > Stephen Hemminger (6): > dpdk-devbind: use argparse instead of getopt > dpdk-devbind: fix indentation > dpdk-devbind: fix python lint warnings for imports > dpdk-devbind: do not use len(x) to test for empty > dpdk-devbind: fix unnecessary else after return > dpdk-devbind: use in to test for multiple strings > > usertools/dpdk-devbind.py | 315 +++++++++++++++++--------------------- > 1 file changed, 142 insertions(+), 173 deletions(-) > Series-acked-by: Bruce Richardson <bruce.richardson@intel.com> ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [dpdk-dev] [PATCH v2 0/6] dpdk-devbind: python lint cleanups 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 0 siblings, 0 replies; 40+ messages in thread From: Thomas Monjalon @ 2020-11-22 21:03 UTC (permalink / raw) To: Stephen Hemminger; +Cc: dev, Bruce Richardson 04/11/2020 10:28, Bruce Richardson: > On Tue, Nov 03, 2020 at 11:03:44PM -0800, Stephen Hemminger wrote: > > This addresses several warnings from python3 lint. > > Split out from earlier patchset > > > > Stephen Hemminger (6): > > dpdk-devbind: use argparse instead of getopt > > dpdk-devbind: fix indentation > > dpdk-devbind: fix python lint warnings for imports > > dpdk-devbind: do not use len(x) to test for empty > > dpdk-devbind: fix unnecessary else after return > > dpdk-devbind: use in to test for multiple strings > > > > usertools/dpdk-devbind.py | 315 +++++++++++++++++--------------------- > > 1 file changed, 142 insertions(+), 173 deletions(-) > > > Series-acked-by: Bruce Richardson <bruce.richardson@intel.com> Applied, thanks ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [dpdk-dev] [PATCH v2 0/6] dpdk-devbind: python lint cleanups 2020-11-04 7:03 ` [dpdk-dev] [PATCH v2 0/6] dpdk-devbind: python lint cleanups Stephen Hemminger ` (6 preceding siblings ...) 2020-11-04 9:28 ` [dpdk-dev] [PATCH v2 0/6] dpdk-devbind: python lint cleanups Bruce Richardson @ 2020-11-04 16:57 ` Stephen Hemminger 7 siblings, 0 replies; 40+ messages in thread From: Stephen Hemminger @ 2020-11-04 16:57 UTC (permalink / raw) To: dev On Tue, 3 Nov 2020 23:03:44 -0800 Stephen Hemminger <stephen@networkplumber.org> wrote: > This addresses several warnings from python3 lint. > Split out from earlier patchset > > Stephen Hemminger (6): > dpdk-devbind: use argparse instead of getopt > dpdk-devbind: fix indentation > dpdk-devbind: fix python lint warnings for imports > dpdk-devbind: do not use len(x) to test for empty > dpdk-devbind: fix unnecessary else after return > dpdk-devbind: use in to test for multiple strings > > usertools/dpdk-devbind.py | 315 +++++++++++++++++--------------------- > 1 file changed, 142 insertions(+), 173 deletions(-) > There are some typos in the commit messages. Can send new version, or you can fix/leave them ^ permalink raw reply [flat|nested] 40+ messages in thread
end of thread, other threads:[~2020-11-24 6:36 UTC | newest] Thread overview: 40+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 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 ` [dpdk-dev] [PATCH v2] " Stephen Hemminger 2020-11-04 9:21 ` 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
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).