From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by dpdk.org (Postfix) with ESMTP id 2895837B2 for ; Tue, 20 Sep 2016 02:04:25 +0200 (CEST) Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga104.fm.intel.com with ESMTP; 19 Sep 2016 17:04:24 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.30,364,1470726000"; d="scan'208";a="881683473" Received: from sie-lab-214-036.ir.intel.com (HELO silpixa00394365.ir.intel.com) ([10.237.214.36]) by orsmga003.jf.intel.com with ESMTP; 19 Sep 2016 17:04:22 -0700 From: Pablo de Lara To: dev@dpdk.org Cc: deepak.k.jain@intel.com, Eoin Breen , Pablo de Lara Date: Tue, 20 Sep 2016 01:05:01 +0100 Message-Id: <1474329901-73453-1-git-send-email-pablo.de.lara.guarch@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1473983826-28291-1-git-send-email-pablo.de.lara.guarch@intel.com> References: <1473983826-28291-1-git-send-email-pablo.de.lara.guarch@intel.com> Subject: [dpdk-dev] [PATCH v4] tools: add crypto device details X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 20 Sep 2016 00:04:26 -0000 From: Eoin Breen Adding the support to bind/unbind crypto devices with dpdk-devbind.py script, as now it is not restricted to network devices anymore. Signed-off-by: Eoin Breen Signed-off-by: Pablo de Lara --- Changes since v3: * Modified setup.sh script to show crypto details * Added script usage in qat.rst doc * Modified help script, to include crypto references Changes since v2: * Removed network specific parameters from crypto parameters Changes since v1: * Resolved coding issues doc/guides/cryptodevs/qat.rst | 5 +++ tools/dpdk-devbind.py | 94 ++++++++++++++++++++++++++++++++++++++----- tools/dpdk-setup.sh | 32 +++++++-------- 3 files changed, 105 insertions(+), 26 deletions(-) diff --git a/doc/guides/cryptodevs/qat.rst b/doc/guides/cryptodevs/qat.rst index 326b228..e212b29 100644 --- a/doc/guides/cryptodevs/qat.rst +++ b/doc/guides/cryptodevs/qat.rst @@ -257,3 +257,8 @@ The unbind command below assumes ``bdfs`` of ``03:01.00-03:04.07``, if yours are echo "8086 0443" > /sys/bus/pci/drivers/igb_uio/new_id You can use ``lspci -vvd:443`` to confirm that all devices are now in use by igb_uio kernel driver. + +The other way to bind the VFs to the DPDK UIO driver is by using the ``dpdk-devbind.py`` script:: + + cd $RTE_SDK + ./tools/dpdk-devbind.py -b igb_uio 0000:03:01.1 diff --git a/tools/dpdk-devbind.py b/tools/dpdk-devbind.py index b69ca2a..a36535e 100755 --- a/tools/dpdk-devbind.py +++ b/tools/dpdk-devbind.py @@ -40,6 +40,7 @@ from os.path import exists, abspath, dirname, basename # The PCI base class for NETWORK devices NETWORK_BASE_CLASS = "02" +CRYPTO_BASE_CLASS = "0b" # global dict ethernet devices present. Dictionary indexed by PCI address. # Each device within this is itself a dictionary of device properties @@ -72,7 +73,7 @@ Options: Display usage information and quit -s, --status: - Print the current status of all known network interfaces. + Print the current status of all known network and crypto 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 @@ -92,7 +93,7 @@ Options: Unbind a device (Equivalent to \"-b none\") --force: - By default, devices which are used by Linux - as indicated by having + 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. @@ -299,6 +300,54 @@ def get_nic_details(): devices[d]["Module_str"] = ",".join(modules) +def get_crypto_details(): + '''This function populates the "devices" dictionary. The keys used are + 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 = {} + # first loop through and read details for all devices + # request machine readable format, with numeric IDs + dev = {} + dev_lines = check_output(["lspci", "-Dvmmn"]).splitlines() + for dev_line in dev_lines: + if (len(dev_line) == 0): + if (dev["Class"][0:2] == CRYPTO_BASE_CLASS): + # convert device and vendor ids to numbers, then add to global + dev["Vendor"] = int(dev["Vendor"], 16) + dev["Device"] = int(dev["Device"], 16) + # use dict to make copy of dev + devices[dev["Slot"]] = dict(dev) + else: + name, value = dev_line.decode().split("\t", 1) + dev[name.rstrip(":")] = value + + # based on the basic info, get extended text details + for d in devices.keys(): + # get additional info and add it to existing data + devices[d] = devices[d].copy() + devices[d].update(get_pci_device_details(d).items()) + + # add igb_uio to list of supporting modules if needed + if "Module_str" in devices[d]: + 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"] = ",".join(dpdk_drivers) + + # make sure the driver and module strings do not have any duplicates + if has_driver(d): + modules = devices[d]["Module_str"].split(",") + if devices[d]["Driver_str"] in modules: + modules.remove(devices[d]["Driver_str"]) + devices[d]["Module_str"] = ",".join(modules) + + def dev_id_from_dev_name(dev_name): '''Take a device "name" - a string passed in by user to identify a NIC device, and determine the device id - i.e. the domain:bus:slot.func - for @@ -480,15 +529,16 @@ def show_status(): dpdk_drv = [] no_drv = [] - # split our list of devices into the three categories above + # split our list of network 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"] in dpdk_drivers: - dpdk_drv.append(devices[d]) - else: - kernel_drv.append(devices[d]) + if (NETWORK_BASE_CLASS in devices[d]["Class"]): + if not has_driver(d): + no_drv.append(devices[d]) + continue + 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 DPDK-compatible driver", dpdk_drv, @@ -498,6 +548,28 @@ def show_status(): "unused=%(Module_str)s %(Active)s") display_devices("Other network devices", no_drv, "unused=%(Module_str)s") + # split our list of crypto devices into the three categories above + kernel_drv = [] + dpdk_drv = [] + no_drv = [] + + for d in devices.keys(): + if (CRYPTO_BASE_CLASS in devices[d]["Class"]): + if not has_driver(d): + no_drv.append(devices[d]) + continue + if devices[d]["Driver_str"] in dpdk_drivers: + dpdk_drv.append(devices[d]) + else: + kernel_drv.append(devices[d]) + + display_devices("Crypto devices using DPDK-compatible driver", dpdk_drv, + "drv=%(Driver_str)s unused=%(Module_str)s") + display_devices("Crypto devices using kernel driver", kernel_drv, + "drv=%(Driver_str)s " + "unused=%(Module_str)s") + display_devices("Other crypto devices", no_drv, "unused=%(Module_str)s") + def parse_args(): '''Parses the command-line arguments given by the user and takes the @@ -562,6 +634,7 @@ def do_arg_actions(): if status_flag: if b_flag is not None: get_nic_details() # refresh if we have changed anything + get_crypto_details() # refresh if we have changed anything show_status() @@ -570,6 +643,7 @@ def main(): parse_args() check_modules() get_nic_details() + get_crypto_details() do_arg_actions() if __name__ == "__main__": diff --git a/tools/dpdk-setup.sh b/tools/dpdk-setup.sh index ac81b2e..14ed590 100755 --- a/tools/dpdk-setup.sh +++ b/tools/dpdk-setup.sh @@ -422,23 +422,23 @@ grep_meminfo() } # -# Calls dpdk-devbind.py --status to show the NIC and what they +# Calls dpdk-devbind.py --status to show the devices and what they # are all bound to, in terms of drivers. # -show_nics() +show_devices() { if [ -d /sys/module/vfio_pci -o -d /sys/module/igb_uio ]; then ${RTE_SDK}/tools/dpdk-devbind.py --status else echo "# Please load the 'igb_uio' or 'vfio-pci' kernel module before " - echo "# querying or adjusting NIC device bindings" + echo "# querying or adjusting device bindings" fi } # # Uses dpdk-devbind.py to move devices to work with vfio-pci # -bind_nics_to_vfio() +bind_devices_to_vfio() { if [ -d /sys/module/vfio_pci ]; then ${RTE_SDK}/tools/dpdk-devbind.py --status @@ -449,14 +449,14 @@ bind_nics_to_vfio() echo "OK" else echo "# Please load the 'vfio-pci' kernel module before querying or " - echo "# adjusting NIC device bindings" + echo "# adjusting device bindings" fi } # # Uses dpdk-devbind.py to move devices to work with igb_uio # -bind_nics_to_igb_uio() +bind_devices_to_igb_uio() { if [ -d /sys/module/igb_uio ]; then ${RTE_SDK}/tools/dpdk-devbind.py --status @@ -466,14 +466,14 @@ bind_nics_to_igb_uio() sudo ${RTE_SDK}/tools/dpdk-devbind.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" + echo "# adjusting device bindings" fi } # # Uses dpdk-devbind.py to move devices to work with kernel drivers again # -unbind_nics() +unbind_devices() { ${RTE_SDK}/tools/dpdk-devbind.py --status echo "" @@ -525,14 +525,14 @@ step2_func() TEXT[5]="Setup hugepage mappings for NUMA systems" FUNC[5]="set_numa_pages" - TEXT[6]="Display current Ethernet device settings" - FUNC[6]="show_nics" + TEXT[6]="Display current Ethernet/Crypto device settings" + FUNC[6]="show_devices" - TEXT[7]="Bind Ethernet device to IGB UIO module" - FUNC[7]="bind_nics_to_igb_uio" + TEXT[7]="Bind Ethernet/Crypto device to IGB UIO module" + FUNC[7]="bind_devices_to_igb_uio" - TEXT[8]="Bind Ethernet device to VFIO module" - FUNC[8]="bind_nics_to_vfio" + TEXT[8]="Bind Ethernet/Crypto device to VFIO module" + FUNC[8]="bind_devices_to_vfio" TEXT[9]="Setup VFIO permissions" FUNC[9]="set_vfio_permissions" @@ -571,8 +571,8 @@ step5_func() { TITLE="Uninstall and system cleanup" - TEXT[1]="Unbind NICs from IGB UIO or VFIO driver" - FUNC[1]="unbind_nics" + TEXT[1]="Unbind devices from IGB UIO or VFIO driver" + FUNC[1]="unbind_devices" TEXT[2]="Remove IGB UIO module" FUNC[2]="remove_igb_uio_module" -- 2.7.4