X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=usertools%2Fdpdk-devbind.py;h=094c2ffc8b9808b6cafbee0759008364f04dc6ef;hb=47df46afb34e45ec2daa6377e737684d2f1fa244;hp=40b4beea472b3319f46bcd933063050251922603;hpb=299e282f62f7f922dfa7724aaacd52bf1bd386b0;p=dpdk.git diff --git a/usertools/dpdk-devbind.py b/usertools/dpdk-devbind.py index 40b4beea47..094c2ffc8b 100755 --- a/usertools/dpdk-devbind.py +++ b/usertools/dpdk-devbind.py @@ -8,7 +8,13 @@ import sys import os import getopt import subprocess +from glob import glob from os.path import exists, abspath, dirname, basename +from os.path import join as path_join + +if sys.version_info.major < 3: + print("WARNING: Python 2 is deprecated for use in DPDK, and will not work in future releases.", file=sys.stderr) + print("Please use Python 3 instead", file=sys.stderr) # The PCI base class for all devices network_class = {'Class': '02', 'Vendor': None, 'Device': None, @@ -85,6 +91,8 @@ Usage: 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 bus:device:func format, then +shell wildcards and ranges may be used, e.g. 80:04.*, 80:04.[0-3] Options: --help, --usage: @@ -141,6 +149,9 @@ To unbind 0000:01:00.0 from using any driver 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 @@ -213,7 +224,7 @@ def get_pci_device_details(dev_id, probe_lspci): for line in extra_info: if len(line) == 0: continue - name, value = line.decode().split("\t", 1) + name, value = line.decode("utf8").split("\t", 1) name = name.strip(":") + "_str" device[name] = value # check for a unix interface name @@ -259,7 +270,7 @@ def get_device_details(devices_type): # Clear previous device's data dev = {} else: - name, value = dev_line.decode().split("\t", 1) + name, value = dev_line.decode("utf8").split("\t", 1) value_list = value.rsplit(' ', 1) if len(value_list) > 1: # String stored in _str @@ -579,7 +590,7 @@ def display_devices(title, dev_list, extra_params=None): strings.sort() print("\n".join(strings)) # print one per line -def show_device_status(devices_type, device_name): +def show_device_status(devices_type, device_name, if_field=False): global dpdk_drivers kernel_drv = [] dpdk_drv = [] @@ -611,8 +622,11 @@ def show_device_status(devices_type, device_name): 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_text = "" + if if_field: + if_text = "if=%(Interface)s " display_devices("%s devices using kernel driver" % device_name, kernel_drv, - "if=%(Interface)s drv=%(Driver_str)s " + if_text + "drv=%(Driver_str)s " "unused=%(Module_str)s %(Active)s") if len(no_drv) != 0: display_devices("Other %s devices" % device_name, no_drv, @@ -624,7 +638,7 @@ def show_status(): kernel driver or to no driver''' if status_dev == "net" or status_dev == "all": - show_device_status(network_devices, "Network") + show_device_status(network_devices, "Network", if_field=True) if status_dev == "baseband" or status_dev == "all": show_device_status(baseband_devices, "Baseband") @@ -644,6 +658,19 @@ def show_status(): if status_dev == "misc" or status_dev == "all": show_device_status(misc_devices, "Misc (rawdev)") + +def pci_glob(arg): + '''Returns a list containing either: + * List of PCI B:D:F matching arg, using shell wildcards e.g. 80:04.* + * Only the passed arg if matching list is empty''' + sysfs_path = "/sys/bus/pci/devices" + for _glob in [arg, '0000:' + arg]: + paths = [basename(path) for path in glob(path_join(sysfs_path, _glob))] + if paths: + return paths + return [arg] + + def parse_args(): '''Parses the command-line arguments given by the user and takes the appropriate action for each''' @@ -685,6 +712,11 @@ def parse_args(): else: b_flag = arg + # resolve any PCI globs in the args + new_args = [] + for arg in args: + new_args.extend(pci_glob(arg)) + args = new_args def do_arg_actions(): '''do the actual action requested by the user'''