Renaming the igb_uio_bind script to dpdk_nic_bind to have a generic name since we're now supporting two drivers.
Signed-off-by: Anatoly Burakov <anatoly.burakov at intel.com> --- tools/{igb_uio_bind.py => dpdk_nic_bind.py} | 47 ++++++++++++++++++++--------- tools/setup.sh | 16 +++++----- 2 files changed, 40 insertions(+), 23 deletions(-) rename tools/{igb_uio_bind.py => dpdk_nic_bind.py} (92%) diff --git a/tools/igb_uio_bind.py b/tools/dpdk_nic_bind.py similarity index 92% rename from tools/igb_uio_bind.py rename to tools/dpdk_nic_bind.py index 33adcf4..1e517e7 100755 --- a/tools/igb_uio_bind.py +++ b/tools/dpdk_nic_bind.py @@ -42,6 +42,8 @@ ETHERNET_CLASS = "0200" # global dict ethernet devices present. Dictionary indexed by PCI address. # Each device within this is itself a dictionary of device properties devices = {} +# list of supported DPDK drivers +dpdk_drivers = [ "igb_uio", "vfio-pci" ] def usage(): '''Print usage information for the program''' @@ -146,22 +148,33 @@ def find_module(mod): def check_modules(): '''Checks that igb_uio is loaded''' + global dpdk_drivers fd = file("/proc/modules") loaded_mods = fd.readlines() fd.close() - mod = "igb_uio" + + # list of supported modules + mods = [{"Name" : driver, "Found" : False} for driver in dpdk_drivers] # first check if module is loaded - found = False for line in loaded_mods: - if line.startswith(mod): - found = True - break - if not found: - print "Error - module %s not loaded" %mod + for mod in mods: + if line.startswith(mod["Name"]): + mod["Found"] = True + # special case for vfio_pci (module is named vfio-pci, + # but its .ko is named vfio_pci) + elif line.replace("_", "-").startswith(mod["Name"]): + mod["Found"] = True + + # check if we have at least one loaded module + if True not in [mod["Found"] for mod in mods]: + print "Error - no supported modules are loaded" sys.exit(1) + # change DPDK driver list to only contain drivers that are loaded + dpdk_drivers = [mod["Name"] for mod in mods if mod["Found"]] + def has_driver(dev_id): '''return true if a device is assigned to a driver. False otherwise''' return "Driver_str" in devices[dev_id] @@ -196,6 +209,7 @@ def get_nic_details(): the pci addresses (domain:bus:slot.func). The values are themselves dictionaries - one for each NIC.''' global devices + global dpdk_drivers # clear any old data devices = {} @@ -240,10 +254,11 @@ def get_nic_details(): # add igb_uio to list of supporting modules if needed if "Module_str" in devices[d]: - if "igb_uio" not in devices[d]["Module_str"]: - devices[d]["Module_str"] = devices[d]["Module_str"] + ",igb_uio" + for driver in dpdk_drivers: + if driver not in devices[d]["Module_str"]: + devices[d]["Module_str"] = devices[d]["Module_str"] + ",%s" % driver else: - devices[d]["Module_str"] = "igb_uio" + devices[d]["Module_str"] = ",".join(dpdk_drivers) # make sure the driver and module strings do not have any duplicates if has_driver(d): @@ -320,7 +335,7 @@ def bind_one(dev_id, driver, force): dev["Driver_str"] = "" # clear driver string # if we are binding to one of DPDK drivers, add PCI id's to that driver - if driver == "igb_uio": + if driver in dpdk_drivers: filename = "/sys/bus/pci/drivers/%s/new_id" % driver try: f = open(filename, "w") @@ -397,21 +412,23 @@ def show_status(): '''Function called when the script is passed the "--status" option. Displays to the user what devices are bound to the igb_uio driver, the kernel driver or to no driver''' + global dpdk_drivers kernel_drv = [] - uio_drv = [] + dpdk_drv = [] no_drv = [] + # split our list of devices into the three categories above for d in devices.keys(): if not has_driver(d): no_drv.append(devices[d]) continue - if devices[d]["Driver_str"] == "igb_uio": - uio_drv.append(devices[d]) + if devices[d]["Driver_str"] in dpdk_drivers: + dpdk_drv.append(devices[d]) else: kernel_drv.append(devices[d]) # print each category separately, so we can clearly see what's used by DPDK - display_devices("Network devices using IGB_UIO driver", uio_drv, \ + display_devices("Network devices using DPDK-compatible driver", dpdk_drv, \ "drv=%(Driver_str)s unused=%(Module_str)s") display_devices("Network devices using kernel driver", kernel_drv, "if=%(Interface)s drv=%(Driver_str)s unused=%(Module_str)s %(Active)s") diff --git a/tools/setup.sh b/tools/setup.sh index 39be8fc..e0671b8 100755 --- a/tools/setup.sh +++ b/tools/setup.sh @@ -324,13 +324,13 @@ grep_meminfo() } # -# Calls igb_uio_bind.py --status to show the NIC and what they +# Calls dpdk_nic_bind.py --status to show the NIC and what they # are all bound to, in terms of drivers. # show_nics() { if /sbin/lsmod | grep -q igb_uio ; then - ${RTE_SDK}/tools/igb_uio_bind.py --status + ${RTE_SDK}/tools/dpdk_nic_bind.py --status else echo "# Please load the 'igb_uio' kernel module before querying or " echo "# adjusting NIC device bindings" @@ -338,16 +338,16 @@ show_nics() } # -# Uses igb_uio_bind.py to move devices to work with igb_uio +# Uses dpdk_nic_bind.py to move devices to work with igb_uio # bind_nics() { if /sbin/lsmod | grep -q igb_uio ; then - ${RTE_SDK}/tools/igb_uio_bind.py --status + ${RTE_SDK}/tools/dpdk_nic_bind.py --status echo "" echo -n "Enter PCI address of device to bind to IGB UIO driver: " read PCI_PATH - sudo ${RTE_SDK}/tools/igb_uio_bind.py -b igb_uio $PCI_PATH && echo "OK" + sudo ${RTE_SDK}/tools/dpdk_nic_bind.py -b igb_uio $PCI_PATH && echo "OK" else echo "# Please load the 'igb_uio' kernel module before querying or " echo "# adjusting NIC device bindings" @@ -355,18 +355,18 @@ bind_nics() } # -# Uses igb_uio_bind.py to move devices to work with kernel drivers again +# Uses dpdk_nic_bind.py to move devices to work with kernel drivers again # unbind_nics() { - ${RTE_SDK}/tools/igb_uio_bind.py --status + ${RTE_SDK}/tools/dpdk_nic_bind.py --status echo "" echo -n "Enter PCI address of device to bind to IGB UIO driver: " read PCI_PATH echo "" echo -n "Enter name of kernel driver to bind the device to: " read DRV - sudo ${RTE_SDK}/tools/igb_uio_bind.py -b $DRV $PCI_PATH && echo "OK" + sudo ${RTE_SDK}/tools/dpdk_nic_bind.py -b $DRV $PCI_PATH && echo "OK" } # -- 1.8.1.4