xref: /dpdk/doc/guides/linux_gsg/build_dpdk.rst (revision c6dab2a873f65c5a4ea9735aa24d9539426adba4)
11ab07743SBernard Iremonger..  BSD LICENSE
2b932ebcbSQian Xu    Copyright(c) 2010-2015 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
313b60ce8cSJohn McNamara.. _linux_gsg_compiling_dpdk:
323b60ce8cSJohn McNamara
332e486e26SSiobhan ButlerCompiling the DPDK Target from Source
342e486e26SSiobhan Butler=====================================
351ab07743SBernard Iremonger
361ab07743SBernard Iremonger.. note::
371ab07743SBernard Iremonger
3829c67340SJohn McNamara    Parts of this process can also be done using the setup script described in
3929c67340SJohn McNamara    the :ref:`linux_setup_script` section of this document.
401ab07743SBernard Iremonger
412e486e26SSiobhan ButlerInstall the DPDK and Browse Sources
422e486e26SSiobhan Butler-----------------------------------
431ab07743SBernard Iremonger
442e486e26SSiobhan ButlerFirst, uncompress the archive and move to the uncompressed DPDK source directory:
451ab07743SBernard Iremonger
461ab07743SBernard Iremonger.. code-block:: console
471ab07743SBernard Iremonger
48d1c34b5bSBaruch Siach    tar xJf dpdk-<version>.tar.xz
49d1c34b5bSBaruch Siach    cd dpdk-<version>
5029c67340SJohn McNamara
512e486e26SSiobhan ButlerThe DPDK is composed of several directories:
521ab07743SBernard Iremonger
532e486e26SSiobhan Butler*   lib: Source code of DPDK libraries
541ab07743SBernard Iremonger
55980ed498SBruce Richardson*   drivers: Source code of DPDK poll-mode drivers
56980ed498SBruce Richardson
572e486e26SSiobhan Butler*   app: Source code of DPDK applications (automatic tests)
581ab07743SBernard Iremonger
592e486e26SSiobhan Butler*   examples: Source code of DPDK application examples
601ab07743SBernard Iremonger
61*c6dab2a8SThomas Monjalon*   config, buildtools, mk: Framework-related makefiles, scripts and configuration
621ab07743SBernard Iremonger
632e486e26SSiobhan ButlerInstallation of DPDK Target Environments
642e486e26SSiobhan Butler----------------------------------------
651ab07743SBernard Iremonger
6629c67340SJohn McNamaraThe format of a DPDK target is::
671ab07743SBernard Iremonger
681ab07743SBernard Iremonger    ARCH-MACHINE-EXECENV-TOOLCHAIN
691ab07743SBernard Iremonger
701ab07743SBernard Iremongerwhere:
711ab07743SBernard Iremonger
7229c67340SJohn McNamara* ``ARCH`` can be:  ``i686``, ``x86_64``, ``ppc_64``
731ab07743SBernard Iremonger
74c711ccb3SDavid Marchand* ``MACHINE`` can be:  ``native``, ``power8``
751ab07743SBernard Iremonger
7629c67340SJohn McNamara* ``EXECENV`` can be:  ``linuxapp``,  ``bsdapp``
771ab07743SBernard Iremonger
7829c67340SJohn McNamara* ``TOOLCHAIN`` can be:  ``gcc``,  ``icc``
791ab07743SBernard Iremonger
801ab07743SBernard IremongerThe targets to be installed depend on the 32-bit and/or 64-bit packages and compilers installed on the host.
811ab07743SBernard IremongerAvailable targets can be found in the DPDK/config directory.
821ab07743SBernard IremongerThe defconfig\_ prefix should not be used.
831ab07743SBernard Iremonger
841ab07743SBernard Iremonger.. note::
851ab07743SBernard Iremonger
8629c67340SJohn McNamara    Configuration files are provided with the ``RTE_MACHINE`` optimization level set.
8729c67340SJohn McNamara    Within the configuration files, the ``RTE_MACHINE`` configuration value is set to native,
881ab07743SBernard Iremonger    which means that the compiled software is tuned for the platform on which it is built.
892e486e26SSiobhan Butler    For more information on this setting, and its possible values, see the *DPDK Programmers Guide*.
901ab07743SBernard Iremonger
911ab07743SBernard IremongerWhen using the Intel® C++ Compiler (icc), one of the following commands should be invoked for 64-bit or 32-bit use respectively.
9229c67340SJohn McNamaraNotice that the shell scripts update the ``$PATH`` variable and therefore should not be performed in the same session.
931ab07743SBernard IremongerAlso, verify the compiler's installation directory since the path may be different:
941ab07743SBernard Iremonger
951ab07743SBernard Iremonger.. code-block:: console
961ab07743SBernard Iremonger
971ab07743SBernard Iremonger    source /opt/intel/bin/iccvars.sh intel64
981ab07743SBernard Iremonger    source /opt/intel/bin/iccvars.sh ia32
991ab07743SBernard Iremonger
10029c67340SJohn McNamaraTo install and make targets, use the ``make install T=<target>`` command in the top-level DPDK directory.
1011ab07743SBernard Iremonger
1021ab07743SBernard IremongerFor example, to compile a 64-bit target using icc, run:
1031ab07743SBernard Iremonger
1041ab07743SBernard Iremonger.. code-block:: console
1051ab07743SBernard Iremonger
1061ab07743SBernard Iremonger    make install T=x86_64-native-linuxapp-icc
1071ab07743SBernard Iremonger
1081ab07743SBernard IremongerTo compile a 32-bit build using gcc, the make command should be:
1091ab07743SBernard Iremonger
1101ab07743SBernard Iremonger.. code-block:: console
1111ab07743SBernard Iremonger
1121ab07743SBernard Iremonger    make install T=i686-native-linuxapp-gcc
1131ab07743SBernard Iremonger
1141ab07743SBernard IremongerTo prepare a target without building it, for example, if the configuration changes need to be made before compilation,
11529c67340SJohn McNamarause the ``make config T=<target>`` command:
1161ab07743SBernard Iremonger
1171ab07743SBernard Iremonger.. code-block:: console
1181ab07743SBernard Iremonger
1191ab07743SBernard Iremonger    make config T=x86_64-native-linuxapp-gcc
1201ab07743SBernard Iremonger
1211ab07743SBernard Iremonger.. warning::
1221ab07743SBernard Iremonger
12329c67340SJohn McNamara    Any kernel modules to be used, e.g. ``igb_uio``, ``kni``, must be compiled with the
124974438fbSBruce Richardson    same kernel as the one running on the target.
1252e486e26SSiobhan Butler    If the DPDK is not being built on the target machine,
12629c67340SJohn McNamara    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.
1271ab07743SBernard Iremonger
1281ab07743SBernard IremongerOnce the target environment is created, the user may move to the target environment directory and continue to make code changes and re-compile.
1292e486e26SSiobhan ButlerThe user may also make modifications to the compile-time DPDK configuration by editing the .config file in the build directory.
1301ab07743SBernard Iremonger(This is a build-local copy of the defconfig file from the top- level config directory).
1311ab07743SBernard Iremonger
1321ab07743SBernard Iremonger.. code-block:: console
1331ab07743SBernard Iremonger
1341ab07743SBernard Iremonger    cd x86_64-native-linuxapp-gcc
1351ab07743SBernard Iremonger    vi .config
1361ab07743SBernard Iremonger    make
1371ab07743SBernard Iremonger
1381ab07743SBernard IremongerIn addition, the make clean command can be used to remove any existing compiled files for a subsequent full, clean rebuild of the code.
1391ab07743SBernard Iremonger
1402e486e26SSiobhan ButlerBrowsing the Installed DPDK Environment Target
1412e486e26SSiobhan Butler----------------------------------------------
1421ab07743SBernard Iremonger
143980ed498SBruce RichardsonOnce a target is created it contains all libraries, including poll-mode drivers, and header files for the DPDK environment that are required to build customer applications.
1441ab07743SBernard IremongerIn addition, the test and testpmd applications are built under the build/app directory, which may be used for testing.
145980ed498SBruce RichardsonA kmod  directory is also present that contains kernel modules which may be loaded if needed.
1461ab07743SBernard Iremonger
147974438fbSBruce RichardsonLoading Modules to Enable Userspace IO for DPDK
148974438fbSBruce Richardson-----------------------------------------------
1491ab07743SBernard Iremonger
150974438fbSBruce RichardsonTo run any DPDK application, a suitable uio module can be loaded into the running kernel.
15129c67340SJohn McNamaraIn many cases, the standard ``uio_pci_generic`` module included in the Linux kernel
152974438fbSBruce Richardsoncan provide the uio capability. This module can be loaded using the command
1531ab07743SBernard Iremonger
1541ab07743SBernard Iremonger.. code-block:: console
1551ab07743SBernard Iremonger
156974438fbSBruce Richardson    sudo modprobe uio_pci_generic
1571ab07743SBernard Iremonger
15829c67340SJohn McNamaraAs an alternative to the ``uio_pci_generic``, the DPDK also includes the igb_uio
1595af3be00SBruce Richardsonmodule which can be found in the kmod subdirectory referred to above. It can
1605af3be00SBruce Richardsonbe loaded as shown below:
1615af3be00SBruce Richardson
1625af3be00SBruce Richardson.. code-block:: console
1635af3be00SBruce Richardson
1645af3be00SBruce Richardson    sudo modprobe uio
1655af3be00SBruce Richardson    sudo insmod kmod/igb_uio.ko
1665af3be00SBruce Richardson
1675af3be00SBruce Richardson.. note::
1685af3be00SBruce Richardson
1695af3be00SBruce Richardson    For some devices which lack support for legacy interrupts, e.g. virtual function
17029c67340SJohn McNamara    (VF) devices, the ``igb_uio`` module may be needed in place of ``uio_pci_generic``.
171974438fbSBruce Richardson
172974438fbSBruce RichardsonSince DPDK release 1.7 onward provides VFIO support, use of UIO is optional
173974438fbSBruce Richardsonfor platforms that support using VFIO.
1741ab07743SBernard Iremonger
1751ab07743SBernard IremongerLoading VFIO Module
1761ab07743SBernard Iremonger-------------------
1771ab07743SBernard Iremonger
17829c67340SJohn McNamaraTo run an DPDK application and make use of VFIO, the ``vfio-pci`` module must be loaded:
1791ab07743SBernard Iremonger
1801ab07743SBernard Iremonger.. code-block:: console
1811ab07743SBernard Iremonger
1821ab07743SBernard Iremonger    sudo modprobe vfio-pci
1831ab07743SBernard Iremonger
1841ab07743SBernard IremongerNote that in order to use VFIO, your kernel must support it.
1851ab07743SBernard IremongerVFIO kernel modules have been included in the Linux kernel since version 3.6.0 and are usually present by default,
1861ab07743SBernard Iremongerhowever please consult your distributions documentation to make sure that is the case.
1871ab07743SBernard Iremonger
1881ab07743SBernard IremongerAlso, to use VFIO, both kernel and BIOS must support and be configured to use IO virtualization (such as Intel® VT-d).
1891ab07743SBernard Iremonger
1902e486e26SSiobhan ButlerFor proper operation of VFIO when running DPDK applications as a non-privileged user, correct permissions should also be set up.
191*c6dab2a8SThomas MonjalonThis can be done by using the DPDK setup script (called dpdk-setup.sh and located in the usertools directory).
1921ab07743SBernard Iremonger
19329c67340SJohn McNamara.. _linux_gsg_binding_kernel:
19429c67340SJohn McNamara
195974438fbSBruce RichardsonBinding and Unbinding Network Ports to/from the Kernel Modules
19629c67340SJohn McNamara--------------------------------------------------------------
1971ab07743SBernard Iremonger
1982e486e26SSiobhan ButlerAs of release 1.4, DPDK applications no longer automatically unbind all supported network ports from the kernel driver in use.
199974438fbSBruce RichardsonInstead, all ports that are to be used by an DPDK application must be bound to the
20029c67340SJohn McNamara``uio_pci_generic``, ``igb_uio`` or ``vfio-pci`` module before the application is run.
2012e486e26SSiobhan ButlerAny network ports under Linux* control will be ignored by the DPDK poll-mode drivers and cannot be used by the application.
2021ab07743SBernard Iremonger
2031ab07743SBernard Iremonger.. warning::
2041ab07743SBernard Iremonger
2052e486e26SSiobhan Butler    The DPDK will, by default, no longer automatically unbind network ports from the kernel driver at startup.
206974438fbSBruce Richardson    Any ports to be used by an DPDK application must be unbound from Linux* control and
20729c67340SJohn McNamara    bound to the ``uio_pci_generic``, ``igb_uio`` or ``vfio-pci`` module before the application is run.
2081ab07743SBernard Iremonger
20929c67340SJohn McNamaraTo bind ports to the ``uio_pci_generic``, ``igb_uio`` or ``vfio-pci`` module for DPDK use,
210974438fbSBruce Richardsonand then subsequently return ports to Linux* control,
211*c6dab2a8SThomas Monjalona utility script called dpdk_nic _bind.py is provided in the usertools subdirectory.
2121ab07743SBernard IremongerThis utility can be used to provide a view of the current state of the network ports on the system,
213974438fbSBruce Richardsonand to bind and unbind those ports from the different kernel modules, including the uio and vfio modules.
2141ab07743SBernard IremongerThe following are some examples of how the script can be used.
21529c67340SJohn McNamaraA full description of the script and its parameters can be obtained by calling the script with the ``--help`` or ``--usage`` options.
216974438fbSBruce RichardsonNote that the uio or vfio kernel modules to be used, should be loaded into the kernel before
217a5d7a3f7SThomas Monjalonrunning the ``dpdk-devbind.py`` script.
2181ab07743SBernard Iremonger
2191ab07743SBernard Iremonger.. warning::
2201ab07743SBernard Iremonger
2211ab07743SBernard Iremonger    Due to the way VFIO works, there are certain limitations to which devices can be used with VFIO.
2221ab07743SBernard Iremonger    Mainly it comes down to how IOMMU groups work.
2231ab07743SBernard Iremonger    Any Virtual Function device can be used with VFIO on its own, but physical devices will require either all ports bound to VFIO,
2241ab07743SBernard Iremonger    or some of them bound to VFIO while others not being bound to anything at all.
2251ab07743SBernard Iremonger
2261ab07743SBernard 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.
2271ab07743SBernard Iremonger    Therefore, the bridge driver should also be unbound from the bridge PCI device for VFIO to work with devices behind the bridge.
2281ab07743SBernard Iremonger
2291ab07743SBernard Iremonger.. warning::
2301ab07743SBernard Iremonger
231a5d7a3f7SThomas Monjalon    While any user can run the dpdk-devbind.py script to view the status of the network ports,
2321ab07743SBernard Iremonger    binding or unbinding network ports requires root privileges.
2331ab07743SBernard Iremonger
2341ab07743SBernard IremongerTo see the status of all network ports on the system:
2351ab07743SBernard Iremonger
2361ab07743SBernard Iremonger.. code-block:: console
2371ab07743SBernard Iremonger
238*c6dab2a8SThomas Monjalon    ./usertools/dpdk-devbind.py --status
2391ab07743SBernard Iremonger
240974438fbSBruce Richardson    Network devices using DPDK-compatible driver
241974438fbSBruce Richardson    ============================================
24229c67340SJohn McNamara    0000:82:00.0 '82599EB 10-GbE NIC' drv=uio_pci_generic unused=ixgbe
24329c67340SJohn McNamara    0000:82:00.1 '82599EB 10-GbE NIC' drv=uio_pci_generic unused=ixgbe
2441ab07743SBernard Iremonger
2451ab07743SBernard Iremonger    Network devices using kernel driver
2461ab07743SBernard Iremonger    ===================================
24729c67340SJohn McNamara    0000:04:00.0 'I350 1-GbE NIC' if=em0  drv=igb unused=uio_pci_generic *Active*
24829c67340SJohn McNamara    0000:04:00.1 'I350 1-GbE NIC' if=eth1 drv=igb unused=uio_pci_generic
24929c67340SJohn McNamara    0000:04:00.2 'I350 1-GbE NIC' if=eth2 drv=igb unused=uio_pci_generic
25029c67340SJohn McNamara    0000:04:00.3 'I350 1-GbE NIC' if=eth3 drv=igb unused=uio_pci_generic
2511ab07743SBernard Iremonger
2521ab07743SBernard Iremonger    Other network devices
2531ab07743SBernard Iremonger    =====================
2541ab07743SBernard Iremonger    <none>
2551ab07743SBernard Iremonger
25629c67340SJohn McNamaraTo bind device ``eth1``,``04:00.1``, to the ``uio_pci_generic`` driver:
2571ab07743SBernard Iremonger
2581ab07743SBernard Iremonger.. code-block:: console
2591ab07743SBernard Iremonger
260*c6dab2a8SThomas Monjalon    ./usertools/dpdk-devbind.py --bind=uio_pci_generic 04:00.1
2611ab07743SBernard Iremonger
2621ab07743SBernard Iremongeror, alternatively,
2631ab07743SBernard Iremonger
2641ab07743SBernard Iremonger.. code-block:: console
2651ab07743SBernard Iremonger
266*c6dab2a8SThomas Monjalon    ./usertools/dpdk-devbind.py --bind=uio_pci_generic eth1
2671ab07743SBernard Iremonger
26829c67340SJohn McNamaraTo restore device ``82:00.0`` to its original kernel binding:
2691ab07743SBernard Iremonger
2701ab07743SBernard Iremonger.. code-block:: console
2711ab07743SBernard Iremonger
272*c6dab2a8SThomas Monjalon    ./usertools/dpdk-devbind.py --bind=ixgbe 82:00.0
273