11ab07743SBernard Iremonger.. BSD LICENSE 21ab07743SBernard Iremonger Copyright(c) 2010-2014 Intel Corporation. All rights reserved. 31ab07743SBernard Iremonger All rights reserved. 41ab07743SBernard Iremonger 51ab07743SBernard Iremonger Redistribution and use in source and binary forms, with or without 61ab07743SBernard Iremonger modification, are permitted provided that the following conditions 71ab07743SBernard Iremonger are met: 81ab07743SBernard Iremonger 91ab07743SBernard Iremonger * Redistributions of source code must retain the above copyright 101ab07743SBernard Iremonger notice, this list of conditions and the following disclaimer. 111ab07743SBernard Iremonger * Redistributions in binary form must reproduce the above copyright 121ab07743SBernard Iremonger notice, this list of conditions and the following disclaimer in 131ab07743SBernard Iremonger the documentation and/or other materials provided with the 141ab07743SBernard Iremonger distribution. 151ab07743SBernard Iremonger * Neither the name of Intel Corporation nor the names of its 161ab07743SBernard Iremonger contributors may be used to endorse or promote products derived 171ab07743SBernard Iremonger from this software without specific prior written permission. 181ab07743SBernard Iremonger 191ab07743SBernard Iremonger THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 201ab07743SBernard Iremonger "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 211ab07743SBernard Iremonger LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 221ab07743SBernard Iremonger A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 231ab07743SBernard Iremonger OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 241ab07743SBernard Iremonger SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 251ab07743SBernard Iremonger LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 261ab07743SBernard Iremonger DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 271ab07743SBernard Iremonger THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 281ab07743SBernard Iremonger (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 291ab07743SBernard Iremonger OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 301ab07743SBernard Iremonger 31*2e486e26SSiobhan ButlerCompiling the DPDK Target from Source 32*2e486e26SSiobhan Butler===================================== 331ab07743SBernard Iremonger 341ab07743SBernard Iremonger.. note:: 351ab07743SBernard Iremonger 361ab07743SBernard Iremonger Parts of this process can also be done using the setup script described in Chapter 6 of this document. 371ab07743SBernard Iremonger 38*2e486e26SSiobhan ButlerInstall the DPDK and Browse Sources 39*2e486e26SSiobhan Butler----------------------------------- 401ab07743SBernard Iremonger 41*2e486e26SSiobhan ButlerFirst, uncompress the archive and move to the uncompressed DPDK source directory: 421ab07743SBernard Iremonger 431ab07743SBernard Iremonger.. code-block:: console 441ab07743SBernard Iremonger 451ab07743SBernard Iremonger user@host:~$ unzip DPDK-<version>.zip 461ab07743SBernard Iremonger user@host:~$ cd DPDK-<version> 471ab07743SBernard Iremonger user@host:~/DPDK-<version>$ ls 481ab07743SBernard Iremonger app/ config/ examples/ lib/ LICENSE.GPL LICENSE.LGPL Makefile mk/ scripts/ tools/ 491ab07743SBernard Iremonger 50*2e486e26SSiobhan ButlerThe DPDK is composed of several directories: 511ab07743SBernard Iremonger 52*2e486e26SSiobhan Butler* lib: Source code of DPDK libraries 531ab07743SBernard Iremonger 54*2e486e26SSiobhan Butler* app: Source code of DPDK applications (automatic tests) 551ab07743SBernard Iremonger 56*2e486e26SSiobhan Butler* examples: Source code of DPDK application examples 571ab07743SBernard Iremonger 581ab07743SBernard Iremonger* config, tools, scripts, mk: Framework-related makefiles, scripts and configuration 591ab07743SBernard Iremonger 60*2e486e26SSiobhan ButlerInstallation of DPDK Target Environments 61*2e486e26SSiobhan Butler---------------------------------------- 621ab07743SBernard Iremonger 63*2e486e26SSiobhan ButlerThe format of a DPDK target is: 641ab07743SBernard Iremonger 651ab07743SBernard Iremonger ARCH-MACHINE-EXECENV-TOOLCHAIN 661ab07743SBernard Iremonger 671ab07743SBernard Iremongerwhere: 681ab07743SBernard Iremonger 691ab07743SBernard Iremonger* ARCH can be: i686, x86_64 701ab07743SBernard Iremonger 711ab07743SBernard Iremonger* MACHINE can be: native, ivshmem 721ab07743SBernard Iremonger 731ab07743SBernard Iremonger* EXECENV can be: linuxapp, bsdapp 741ab07743SBernard Iremonger 751ab07743SBernard Iremonger* TOOLCHAIN can be: gcc, icc 761ab07743SBernard Iremonger 771ab07743SBernard IremongerThe targets to be installed depend on the 32-bit and/or 64-bit packages and compilers installed on the host. 781ab07743SBernard IremongerAvailable targets can be found in the DPDK/config directory. 791ab07743SBernard IremongerThe defconfig\_ prefix should not be used. 801ab07743SBernard Iremonger 811ab07743SBernard Iremonger.. note:: 821ab07743SBernard Iremonger 831ab07743SBernard Iremonger Configuration files are provided with the RTE_MACHINE optimization level set. 841ab07743SBernard Iremonger Within the configuration files, the RTE_MACHINE configuration value is set to native, 851ab07743SBernard Iremonger which means that the compiled software is tuned for the platform on which it is built. 86*2e486e26SSiobhan Butler For more information on this setting, and its possible values, see the *DPDK Programmers Guide*. 871ab07743SBernard Iremonger 881ab07743SBernard IremongerWhen using the Intel® C++ Compiler (icc), one of the following commands should be invoked for 64-bit or 32-bit use respectively. 891ab07743SBernard IremongerNotice that the shell scripts update the $PATH variable and therefore should not be performed in the same session. 901ab07743SBernard IremongerAlso, verify the compiler's installation directory since the path may be different: 911ab07743SBernard Iremonger 921ab07743SBernard Iremonger.. code-block:: console 931ab07743SBernard Iremonger 941ab07743SBernard Iremonger source /opt/intel/bin/iccvars.sh intel64 951ab07743SBernard Iremonger source /opt/intel/bin/iccvars.sh ia32 961ab07743SBernard Iremonger 97*2e486e26SSiobhan ButlerTo install and make targets, use the make install T=<target> command in the top-level DPDK directory. 981ab07743SBernard Iremonger 991ab07743SBernard IremongerFor example, to compile a 64-bit target using icc, run: 1001ab07743SBernard Iremonger 1011ab07743SBernard Iremonger.. code-block:: console 1021ab07743SBernard Iremonger 1031ab07743SBernard Iremonger make install T=x86_64-native-linuxapp-icc 1041ab07743SBernard Iremonger 1051ab07743SBernard IremongerTo compile a 32-bit build using gcc, the make command should be: 1061ab07743SBernard Iremonger 1071ab07743SBernard Iremonger.. code-block:: console 1081ab07743SBernard Iremonger 1091ab07743SBernard Iremonger make install T=i686-native-linuxapp-gcc 1101ab07743SBernard Iremonger 1111ab07743SBernard IremongerTo compile all 64-bit targets using gcc, use: 1121ab07743SBernard Iremonger 1131ab07743SBernard Iremonger.. code-block:: console 1141ab07743SBernard Iremonger 1151ab07743SBernard Iremonger make install T=x86_64*gcc 1161ab07743SBernard Iremonger 1171ab07743SBernard IremongerTo compile all 64-bit targets using both gcc and icc, use: 1181ab07743SBernard Iremonger 1191ab07743SBernard Iremonger.. code-block:: console 1201ab07743SBernard Iremonger 1211ab07743SBernard Iremonger make install T=x86_64-* 1221ab07743SBernard Iremonger 1231ab07743SBernard Iremonger.. note:: 1241ab07743SBernard Iremonger 1251ab07743SBernard Iremonger The wildcard operator (*) can be used to create multiple targets at the same time. 1261ab07743SBernard Iremonger 1271ab07743SBernard IremongerTo prepare a target without building it, for example, if the configuration changes need to be made before compilation, 1281ab07743SBernard Iremongeruse the make config T=<target> command: 1291ab07743SBernard Iremonger 1301ab07743SBernard Iremonger.. code-block:: console 1311ab07743SBernard Iremonger 1321ab07743SBernard Iremonger make config T=x86_64-native-linuxapp-gcc 1331ab07743SBernard Iremonger 1341ab07743SBernard Iremonger.. warning:: 1351ab07743SBernard Iremonger 1361ab07743SBernard Iremonger The igb_uio module must be compiled with the same kernel as the one running on the target. 137*2e486e26SSiobhan Butler If the DPDK is not being built on the target machine, 1381ab07743SBernard Iremonger the RTE_KERNELDIR environment variable should be used to point the compilation at a copy of the kernel version to be used on the target machine. 1391ab07743SBernard Iremonger 1401ab07743SBernard IremongerOnce the target environment is created, the user may move to the target environment directory and continue to make code changes and re-compile. 141*2e486e26SSiobhan ButlerThe user may also make modifications to the compile-time DPDK configuration by editing the .config file in the build directory. 1421ab07743SBernard Iremonger(This is a build-local copy of the defconfig file from the top- level config directory). 1431ab07743SBernard Iremonger 1441ab07743SBernard Iremonger.. code-block:: console 1451ab07743SBernard Iremonger 1461ab07743SBernard Iremonger cd x86_64-native-linuxapp-gcc 1471ab07743SBernard Iremonger vi .config 1481ab07743SBernard Iremonger make 1491ab07743SBernard Iremonger 1501ab07743SBernard IremongerIn addition, the make clean command can be used to remove any existing compiled files for a subsequent full, clean rebuild of the code. 1511ab07743SBernard Iremonger 152*2e486e26SSiobhan ButlerBrowsing the Installed DPDK Environment Target 153*2e486e26SSiobhan Butler---------------------------------------------- 1541ab07743SBernard Iremonger 155*2e486e26SSiobhan ButlerOnce a target is created it contains all libraries and header files for the DPDK environment that are required to build customer applications. 1561ab07743SBernard IremongerIn addition, the test and testpmd applications are built under the build/app directory, which may be used for testing. 1571ab07743SBernard IremongerIn the case of Linux, a kmod directory is also present that contains a module to install: 1581ab07743SBernard Iremonger 1591ab07743SBernard Iremonger.. code-block:: console 1601ab07743SBernard Iremonger 1611ab07743SBernard Iremonger $ ls x86_64-native-linuxapp-gcc 1621ab07743SBernard Iremonger app build hostapp include kmod lib Makefile 1631ab07743SBernard Iremonger 164*2e486e26SSiobhan ButlerLoading the DPDK igb_uio Module 165*2e486e26SSiobhan Butler------------------------------- 1661ab07743SBernard Iremonger 167*2e486e26SSiobhan ButlerTo run any DPDK application, the igb_uio module can be loaded into the running kernel. 168*2e486e26SSiobhan ButlerThe module is found in the kmod sub-directory of the DPDK target directory. 169*2e486e26SSiobhan ButlerThis module should be loaded using the insmod command as shown below (assuming that the current directory is the DPDK target directory). 1701ab07743SBernard IremongerIn many cases, the uio support in the Linux* kernel is compiled as a module rather than as part of the kernel, 1711ab07743SBernard Iremongerso it is often necessary to load the uio module first: 1721ab07743SBernard Iremonger 1731ab07743SBernard Iremonger.. code-block:: console 1741ab07743SBernard Iremonger 1751ab07743SBernard Iremonger sudo modprobe uio 1761ab07743SBernard Iremonger sudo insmod kmod/igb_uio.ko 1771ab07743SBernard Iremonger 178*2e486e26SSiobhan ButlerSince DPDK release 1.7 provides VFIO support, compilation and use of igb_uio module has become optional for platforms that support using VFIO. 1791ab07743SBernard Iremonger 1801ab07743SBernard IremongerLoading VFIO Module 1811ab07743SBernard Iremonger------------------- 1821ab07743SBernard Iremonger 183*2e486e26SSiobhan ButlerTo run an DPDK application and make use of VFIO, the vfio-pci module must be loaded: 1841ab07743SBernard Iremonger 1851ab07743SBernard Iremonger.. code-block:: console 1861ab07743SBernard Iremonger 1871ab07743SBernard Iremonger sudo modprobe vfio-pci 1881ab07743SBernard Iremonger 1891ab07743SBernard IremongerNote that in order to use VFIO, your kernel must support it. 1901ab07743SBernard IremongerVFIO kernel modules have been included in the Linux kernel since version 3.6.0 and are usually present by default, 1911ab07743SBernard Iremongerhowever please consult your distributions documentation to make sure that is the case. 1921ab07743SBernard Iremonger 1931ab07743SBernard IremongerAlso, to use VFIO, both kernel and BIOS must support and be configured to use IO virtualization (such as Intel® VT-d). 1941ab07743SBernard Iremonger 195*2e486e26SSiobhan ButlerFor proper operation of VFIO when running DPDK applications as a non-privileged user, correct permissions should also be set up. 196*2e486e26SSiobhan ButlerThis can be done by using the DPDK setup script (called setup.sh and located in the tools directory). 1971ab07743SBernard Iremonger 1981ab07743SBernard IremongerBinding and Unbinding Network Ports to/from the igb_uioor VFIO Modules 1991ab07743SBernard Iremonger---------------------------------------------------------------------- 2001ab07743SBernard Iremonger 201*2e486e26SSiobhan ButlerAs of release 1.4, DPDK applications no longer automatically unbind all supported network ports from the kernel driver in use. 202*2e486e26SSiobhan ButlerInstead, all ports that are to be used by an DPDK application must be bound to the igb_uio or vfio-pci module before the application is run. 203*2e486e26SSiobhan ButlerAny network ports under Linux* control will be ignored by the DPDK poll-mode drivers and cannot be used by the application. 2041ab07743SBernard Iremonger 2051ab07743SBernard Iremonger.. warning:: 2061ab07743SBernard Iremonger 207*2e486e26SSiobhan Butler The DPDK will, by default, no longer automatically unbind network ports from the kernel driver at startup. 208*2e486e26SSiobhan Butler Any ports to be used by an DPDK application must be unbound from Linux* control and bound to the igb_uio or vfio-pci module before the application is run. 2091ab07743SBernard Iremonger 210*2e486e26SSiobhan ButlerTo bind ports to the igb_uio or vfio-pci module for DPDK use, and then subsequently return ports to Linux* control, 2111ab07743SBernard Iremongera utility script called dpdk_nic _bind.py is provided in the tools subdirectory. 2121ab07743SBernard IremongerThis utility can be used to provide a view of the current state of the network ports on the system, 2131ab07743SBernard Iremongerand to bind and unbind those ports from the different kernel modules, including igb_uio and vfio-pci. 2141ab07743SBernard IremongerThe following are some examples of how the script can be used. 2151ab07743SBernard IremongerA full description of the script and its parameters can be obtained by calling the script with the --help or --usage options. 2161ab07743SBernard Iremonger 2171ab07743SBernard Iremonger.. warning:: 2181ab07743SBernard Iremonger 2191ab07743SBernard Iremonger Due to the way VFIO works, there are certain limitations to which devices can be used with VFIO. 2201ab07743SBernard Iremonger Mainly it comes down to how IOMMU groups work. 2211ab07743SBernard Iremonger Any Virtual Function device can be used with VFIO on its own, but physical devices will require either all ports bound to VFIO, 2221ab07743SBernard Iremonger or some of them bound to VFIO while others not being bound to anything at all. 2231ab07743SBernard Iremonger 2241ab07743SBernard Iremonger If your device is behind a PCI-to-PCI bridge, the bridge will then be part of the IOMMU group in which your device is in. 2251ab07743SBernard Iremonger Therefore, the bridge driver should also be unbound from the bridge PCI device for VFIO to work with devices behind the bridge. 2261ab07743SBernard Iremonger 2271ab07743SBernard Iremonger.. warning:: 2281ab07743SBernard Iremonger 2291ab07743SBernard Iremonger While any user can run the dpdk_nic_bind.py script to view the status of the network ports, 2301ab07743SBernard Iremonger binding or unbinding network ports requires root privileges. 2311ab07743SBernard Iremonger 2321ab07743SBernard IremongerTo see the status of all network ports on the system: 2331ab07743SBernard Iremonger 2341ab07743SBernard Iremonger.. code-block:: console 2351ab07743SBernard Iremonger 2361ab07743SBernard Iremonger root@host:DPDK# ./tools/dpdk_nic_bind.py --status 2371ab07743SBernard Iremonger 2381ab07743SBernard Iremonger Network devices using IGB_UIO driver 2391ab07743SBernard Iremonger ==================================== 2401ab07743SBernard Iremonger 0000:82:00.0 '82599EB 10-Gigabit SFI/SFP+ Network Connection' drv=igb_uio unused=ixgbe 2411ab07743SBernard Iremonger 0000:82:00.1 '82599EB 10-Gigabit SFI/SFP+ Network Connection' drv=igb_uio unused=ixgbe 2421ab07743SBernard Iremonger 2431ab07743SBernard Iremonger Network devices using kernel driver 2441ab07743SBernard Iremonger =================================== 2451ab07743SBernard Iremonger 0000:04:00.0 'I350 Gigabit Network Connection' if=em0 drv=igb unused=igb_uio *Active* 2461ab07743SBernard Iremonger 0000:04:00.1 'I350 Gigabit Network Connection' if=eth1 drv=igb unused=igb_uio 2471ab07743SBernard Iremonger 0000:04:00.2 'I350 Gigabit Network Connection' if=eth2 drv=igb unused=igb_uio 2481ab07743SBernard Iremonger 0000:04:00.3 'I350 Gigabit Network Connection' if=eth3 drv=igb unused=igb_uio 2491ab07743SBernard Iremonger 2501ab07743SBernard Iremonger Other network devices 2511ab07743SBernard Iremonger ===================== 2521ab07743SBernard Iremonger <none> 2531ab07743SBernard Iremonger 2541ab07743SBernard IremongerTo bind device eth1, 04:00.1, to the igb_uio driver: 2551ab07743SBernard Iremonger 2561ab07743SBernard Iremonger.. code-block:: console 2571ab07743SBernard Iremonger 2581ab07743SBernard Iremonger root@host:DPDK# ./tools/dpdk_nic_bind.py --bind=igb_uio 04:00.1 2591ab07743SBernard Iremonger 2601ab07743SBernard Iremongeror, alternatively, 2611ab07743SBernard Iremonger 2621ab07743SBernard Iremonger.. code-block:: console 2631ab07743SBernard Iremonger 2641ab07743SBernard Iremonger root@host:DPDK# ./tools/dpdk_nic_bind.py --bind=igb_uio eth1 2651ab07743SBernard Iremonger 2661ab07743SBernard IremongerTo restore device 82:00.0 to its original kernel binding: 2671ab07743SBernard Iremonger 2681ab07743SBernard Iremonger.. code-block:: console 2691ab07743SBernard Iremonger 2701ab07743SBernard Iremonger root@host:DPDK# ./tools/dpdk_nic_bind.py --bind=ixgbe 82:00.0 271