xref: /dpdk/doc/guides/freebsd_gsg/build_dpdk.rst (revision cbe57f351b4e6541eb7b50a5c0d6f7e77b45c9db)
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