1.. SPDX-License-Identifier: BSD-3-Clause 2 Copyright(c) 2010-2014 Intel Corporation. 3 4.. include:: <isonum.txt> 5 6.. _building_from_source: 7 8Compiling the DPDK Target from Source 9===================================== 10 11Prerequisites 12------------- 13 14The following FreeBSD packages are required to build DPDK: 15 16* meson 17* ninja 18* pkgconf 19* py38-pyelftools 20 21.. note: 22 23 The specific package for pyelftools is dependent on the version of python in use, 24 Python 3.8 being the version at type of writing, hence the ``py38`` prefix. 25 26These can be installed using (as root):: 27 28 pkg install meson pkgconf py38-pyelftools 29 30To compile the required kernel modules for memory management and working 31with physical NIC devices, the kernel sources for FreeBSD also 32need to be installed. If not already present on the system, these can be 33installed via commands like the following, for FreeBSD 12.1 on x86_64:: 34 35 fetch http://ftp.freebsd.org/pub/FreeBSD/releases/amd64/12.1-RELEASE/src.txz 36 tar -C / -xJvf src.txz 37 38Individual drivers may have additional requirements. Consult the relevant 39driver guide for any driver-specific requirements of interest. 40 41Building DPDK 42------------- 43 44The following commands can be used to build and install DPDK on a system. 45The final, install, step generally needs to be run as root:: 46 47 meson setup build 48 cd build 49 ninja 50 meson install 51 52This will install the DPDK libraries and drivers to `/usr/local/lib` with a 53pkg-config file `libdpdk.pc` installed to `/usr/local/lib/pkgconfig`. The 54DPDK test applications, such as `dpdk-testpmd` are installed to 55`/usr/local/bin`. To use these applications, it is recommended that the 56`contigmem` and `nic_uio` kernel modules be loaded first, as described in 57the next section. 58 59.. note:: 60 61 It is recommended that pkg-config be used to query information 62 about the compiler and linker flags needed to build applications 63 against DPDK. In some cases, the path `/usr/local/lib/pkgconfig` 64 may not be in the default search paths for `.pc` files, which means 65 that queries for DPDK information may fail. This can be fixed by 66 setting the appropriate path in `PKG_CONFIG_PATH` environment 67 variable. 68 69 70.. _loading_contigmem: 71 72Loading the DPDK contigmem Module 73--------------------------------- 74 75To run a DPDK application, physically contiguous memory is required. 76In the absence of non-transparent superpages, the included sources for the 77contigmem kernel module provides the ability to present contiguous blocks of 78memory for the DPDK to use. The contigmem module must be loaded into the 79running kernel before any DPDK is run. Once DPDK is installed on the 80system, the module can be found in the `/boot/modules` directory. 81 82The amount of physically contiguous memory along with the number of physically 83contiguous blocks to be reserved by the module can be set at runtime prior to 84module loading using:: 85 86 kenv hw.contigmem.num_buffers=n 87 kenv hw.contigmem.buffer_size=m 88 89Where n is the number of blocks and m is the size in bytes of each area of contiguous memory. 90A default of two buffers of size 1073741824 bytes (1 Gigabyte) each 91is set during module load if they are not specified in the environment. 92 93Buffers are excluded from core dump by default. 94Mapped buffers can be included in core dump using the following tunable:: 95 96 hw.contigmem.coredump_enable=1 97 98.. note:: 99 100 Including contigmem buffers in core dump file increases its size, 101 which may fill the storage or overload the transport. 102 Buffers typically hold data processed by the application, 103 like network packets, which may contain sensitive information. 104 105The kernel environment variables can also be specified during boot by placing the 106following in ``/boot/loader.conf``: 107 108.. code-block:: shell 109 110 hw.contigmem.num_buffers=n 111 hw.contigmem.buffer_size=m 112 hw.contigmem.coredump_enable=1 113 114The variables can be inspected using the following command:: 115 116 sysctl -a hw.contigmem 117 118The module can then be loaded using kldload:: 119 120 kldload contigmem 121 122It is advisable to include the loading of the contigmem module during the boot 123process to avoid issues with potential memory fragmentation during later system 124up time. This can be achieved by placing lines similar to the following into 125``/boot/loader.conf``: 126 127.. code-block:: shell 128 129 hw.contigmem.num_buffers=1 130 hw.contigmem.buffer_size=1073741824 131 hw.contigmem.coredump_enable=1 132 contigmem_load="YES" 133 134.. note:: 135 136 The ``contigmem_load`` directive should be placed after any definitions 137 of ``hw.contigmem.*`` if the default values are not to be used. 138 139An error such as:: 140 141 kldload: can't load <build_dir>/kernel/freebsd/contigmem.ko: 142 Exec format error 143 144is generally attributed to not having enough contiguous memory 145available and can be verified via dmesg or ``/var/log/messages``:: 146 147 kernel: contigmalloc failed for buffer <n> 148 149To avoid this error, reduce the number of buffers or the buffer size. 150 151.. _loading_nic_uio: 152 153Loading the DPDK nic_uio Module 154------------------------------- 155 156After loading the contigmem module, the ``nic_uio`` module must also be loaded into the 157running kernel prior to running any DPDK application, e.g. using:: 158 159 kldload nic_uio 160 161.. note:: 162 163 If the ports to be used are currently bound to a existing kernel driver 164 then the ``hw.nic_uio.bdfs sysctl`` value will need to be set before loading the 165 module. Setting this value is described in the next section below. 166 167Currently loaded modules can be seen by using the ``kldstat`` command and a module 168can be removed from the running kernel by using ``kldunload <module_name>``. 169 170To load the module during boot place the following into ``/boot/loader.conf``: 171 172.. code-block:: shell 173 174 nic_uio_load="YES" 175 176.. note:: 177 178 ``nic_uio_load="YES"`` must appear after the contigmem_load directive, if it exists. 179 180By default, the ``nic_uio`` module will take ownership of network ports if they are 181recognized DPDK devices and are not owned by another module. However, since 182the FreeBSD kernel includes support, either built-in, or via a separate driver 183module, for most network card devices, it is likely that the ports to be used are 184already bound to a driver other than ``nic_uio``. The following sub-section describe 185how to query and modify the device ownership of the ports to be used by 186DPDK applications. 187 188.. _binding_network_ports: 189 190Binding Network Ports to the nic_uio Module 191~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 193Device ownership can be viewed using the pciconf -l command. The example below shows 194four Intel\ |reg| 82599 network ports under ``if_ixgbe`` module ownership. 195 196.. code-block:: none 197 198 pciconf -l 199 ix0@pci0:1:0:0: class=0x020000 card=0x00038086 chip=0x10fb8086 rev=0x01 hdr=0x00 200 ix1@pci0:1:0:1: class=0x020000 card=0x00038086 chip=0x10fb8086 rev=0x01 hdr=0x00 201 ix2@pci0:2:0:0: class=0x020000 card=0x00038086 chip=0x10fb8086 rev=0x01 hdr=0x00 202 ix3@pci0:2:0:1: class=0x020000 card=0x00038086 chip=0x10fb8086 rev=0x01 hdr=0x00 203 204The first column constitutes three components: 205 206#. Device name: ``ixN`` 207 208#. Unit name: ``pci0`` 209 210#. Selector (Bus:Device:Function): ``1:0:0`` 211 212Where no driver is associated with a device, the device name will be ``none``. 213 214By default, the FreeBSD kernel will include built-in drivers for the most common 215devices; a kernel rebuild would normally be required to either remove the drivers 216or configure them as loadable modules. 217 218To avoid building a custom kernel, the ``nic_uio`` module can detach a network port 219from its current device driver. This is achieved by setting the ``hw.nic_uio.bdfs`` 220kernel environment variable prior to loading ``nic_uio``, as follows:: 221 222 kenv hw.nic_uio.bdfs="b:d:f,b:d:f,..." 223 224Where a comma separated list of selectors is set, the list must not contain any 225whitespace. 226 227For example to re-bind ``ix2@pci0:2:0:0`` and ``ix3@pci0:2:0:1`` to the ``nic_uio`` module 228upon loading, use the following command:: 229 230 kenv hw.nic_uio.bdfs="2:0:0,2:0:1" 231 232The variable can also be specified during boot by placing the following into 233``/boot/loader.conf``, before the previously-described ``nic_uio_load`` line - as 234shown: 235 236.. code-block:: shell 237 238 hw.nic_uio.bdfs="2:0:0,2:0:1" 239 nic_uio_load="YES" 240 241Binding Network Ports Back to their Original Kernel Driver 242~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 243 244If the original driver for a network port has been compiled into the kernel, 245it is necessary to reboot FreeBSD to restore the original device binding. Before 246doing so, update or remove the ``hw.nic_uio.bdfs`` in ``/boot/loader.conf``. 247 248If rebinding to a driver that is a loadable module, the network port binding can 249be reset without rebooting. To do so, unload both the target kernel module and the 250``nic_uio`` module, modify or clear the ``hw.nic_uio.bdfs`` kernel environment (kenv) 251value, and reload the two drivers - first the original kernel driver, and then 252the ``nic_uio driver``. Note: the latter does not need to be reloaded unless there are 253ports that are still to be bound to it. 254 255Example commands to perform these steps are shown below:: 256 257 kldunload nic_uio 258 kldunload <original_driver> 259 260 # To clear the value completely: 261 kenv -u hw.nic_uio.bdfs 262 263 # To update the list of ports to bind: 264 kenv hw.nic_uio.bdfs="b:d:f,b:d:f,..." 265 266 kldload <original_driver> 267 268 kldload nic_uio # optional 269