doc: add references to flow isolated mode in NICs guide
[dpdk.git] / doc / guides / nics / mlx4.rst
1 ..  SPDX-License-Identifier: BSD-3-Clause
2     Copyright 2012 6WIND S.A.
3     Copyright 2015 Mellanox Technologies, Ltd
4
5 MLX4 poll mode driver library
6 =============================
7
8 The MLX4 poll mode driver library (**librte_pmd_mlx4**) implements support
9 for **Mellanox ConnectX-3** and **Mellanox ConnectX-3 Pro** 10/40 Gbps adapters
10 as well as their virtual functions (VF) in SR-IOV context.
11
12 Information and documentation about this family of adapters can be found on
13 the `Mellanox website <http://www.mellanox.com>`_. Help is also provided by
14 the `Mellanox community <http://community.mellanox.com/welcome>`_.
15
16 There is also a `section dedicated to this poll mode driver
17 <http://www.mellanox.com/page/products_dyn?product_family=209&mtag=pmd_for_dpdk>`_.
18
19 .. note::
20
21    Due to external dependencies, this driver is disabled by default. It must
22    be enabled manually by setting ``CONFIG_RTE_LIBRTE_MLX4_PMD=y`` and
23    recompiling DPDK.
24
25 Implementation details
26 ----------------------
27
28 Most Mellanox ConnectX-3 devices provide two ports but expose a single PCI
29 bus address, thus unlike most drivers, librte_pmd_mlx4 registers itself as a
30 PCI driver that allocates one Ethernet device per detected port.
31
32 For this reason, one cannot white/blacklist a single port without also
33 white/blacklisting the others on the same device.
34
35 Besides its dependency on libibverbs (that implies libmlx4 and associated
36 kernel support), librte_pmd_mlx4 relies heavily on system calls for control
37 operations such as querying/updating the MTU and flow control parameters.
38
39 For security reasons and robustness, this driver only deals with virtual
40 memory addresses. The way resources allocations are handled by the kernel
41 combined with hardware specifications that allow it to handle virtual memory
42 addresses directly ensure that DPDK applications cannot access random
43 physical memory (or memory that does not belong to the current process).
44
45 This capability allows the PMD to coexist with kernel network interfaces
46 which remain functional, although they stop receiving unicast packets as
47 long as they share the same MAC address.
48
49 The :ref:`flow_isolated_mode` is supported.
50
51 Compiling librte_pmd_mlx4 causes DPDK to be linked against libibverbs.
52
53 Configuration
54 -------------
55
56 Compilation options
57 ~~~~~~~~~~~~~~~~~~~
58
59 These options can be modified in the ``.config`` file.
60
61 - ``CONFIG_RTE_LIBRTE_MLX4_PMD`` (default **n**)
62
63   Toggle compilation of librte_pmd_mlx4 itself.
64
65 - ``CONFIG_RTE_IBVERBS_LINK_DLOPEN`` (default **n**)
66
67   Build PMD with additional code to make it loadable without hard
68   dependencies on **libibverbs** nor **libmlx4**, which may not be installed
69   on the target system.
70
71   In this mode, their presence is still required for it to run properly,
72   however their absence won't prevent a DPDK application from starting (with
73   ``CONFIG_RTE_BUILD_SHARED_LIB`` disabled) and they won't show up as
74   missing with ``ldd(1)``.
75
76   It works by moving these dependencies to a purpose-built rdma-core "glue"
77   plug-in which must either be installed in a directory whose name is based
78   on ``CONFIG_RTE_EAL_PMD_PATH`` suffixed with ``-glue`` if set, or in a
79   standard location for the dynamic linker (e.g. ``/lib``) if left to the
80   default empty string (``""``).
81
82   This option has no performance impact.
83
84 - ``CONFIG_RTE_IBVERBS_LINK_STATIC`` (default **n**)
85
86   Embed static flavour of the dependencies **libibverbs** and **libmlx4**
87   in the PMD shared library or the executable static binary.
88
89 - ``CONFIG_RTE_LIBRTE_MLX4_DEBUG`` (default **n**)
90
91   Toggle debugging code and stricter compilation flags. Enabling this option
92   adds additional run-time checks and debugging messages at the cost of
93   lower performance.
94
95 Environment variables
96 ~~~~~~~~~~~~~~~~~~~~~
97
98 - ``MLX4_GLUE_PATH``
99
100   A list of directories in which to search for the rdma-core "glue" plug-in,
101   separated by colons or semi-colons.
102
103   Only matters when compiled with ``CONFIG_RTE_IBVERBS_LINK_DLOPEN``
104   enabled and most useful when ``CONFIG_RTE_EAL_PMD_PATH`` is also set,
105   since ``LD_LIBRARY_PATH`` has no effect in this case.
106
107 Run-time configuration
108 ~~~~~~~~~~~~~~~~~~~~~~
109
110 - librte_pmd_mlx4 brings kernel network interfaces up during initialization
111   because it is affected by their state. Forcing them down prevents packets
112   reception.
113
114 - **ethtool** operations on related kernel interfaces also affect the PMD.
115
116 - ``port`` parameter [int]
117
118   This parameter provides a physical port to probe and can be specified multiple
119   times for additional ports. All ports are probed by default if left
120   unspecified.
121
122 Kernel module parameters
123 ~~~~~~~~~~~~~~~~~~~~~~~~
124
125 The **mlx4_core** kernel module has several parameters that affect the
126 behavior and/or the performance of librte_pmd_mlx4. Some of them are described
127 below.
128
129 - **num_vfs** (integer or triplet, optionally prefixed by device address
130   strings)
131
132   Create the given number of VFs on the specified devices.
133
134 - **log_num_mgm_entry_size** (integer)
135
136   Device-managed flow steering (DMFS) is required by DPDK applications. It is
137   enabled by using a negative value, the last four bits of which have a
138   special meaning.
139
140   - **-1**: force device-managed flow steering (DMFS).
141   - **-7**: configure optimized steering mode to improve performance with the
142     following limitation: VLAN filtering is not supported with this mode.
143     This is the recommended mode in case VLAN filter is not needed.
144
145 Limitations
146 -----------
147
148 - CRC stripping is supported by default and always reported as "true".
149   The ability to enable/disable CRC stripping requires OFED version
150   4.3-1.5.0.0 and above  or rdma-core version v18 and above.
151
152 - TSO (Transmit Segmentation Offload) is supported in OFED version
153   4.4 and above.
154
155 Prerequisites
156 -------------
157
158 This driver relies on external libraries and kernel drivers for resources
159 allocations and initialization. The following dependencies are not part of
160 DPDK and must be installed separately:
161
162 - **libibverbs** (provided by rdma-core package)
163
164   User space verbs framework used by librte_pmd_mlx4. This library provides
165   a generic interface between the kernel and low-level user space drivers
166   such as libmlx4.
167
168   It allows slow and privileged operations (context initialization, hardware
169   resources allocations) to be managed by the kernel and fast operations to
170   never leave user space.
171
172 - **libmlx4** (provided by rdma-core package)
173
174   Low-level user space driver library for Mellanox ConnectX-3 devices,
175   it is automatically loaded by libibverbs.
176
177   This library basically implements send/receive calls to the hardware
178   queues.
179
180 - **Kernel modules**
181
182   They provide the kernel-side verbs API and low level device drivers that
183   manage actual hardware initialization and resources sharing with user
184   space processes.
185
186   Unlike most other PMDs, these modules must remain loaded and bound to
187   their devices:
188
189   - mlx4_core: hardware driver managing Mellanox ConnectX-3 devices.
190   - mlx4_en: Ethernet device driver that provides kernel network interfaces.
191   - mlx4_ib: InifiniBand device driver.
192   - ib_uverbs: user space driver for verbs (entry point for libibverbs).
193
194 - **Firmware update**
195
196   Mellanox OFED releases include firmware updates for ConnectX-3 adapters.
197
198   Because each release provides new features, these updates must be applied to
199   match the kernel modules and libraries they come with.
200
201 .. note::
202
203    Both libraries are BSD and GPL licensed. Linux kernel modules are GPL
204    licensed.
205
206 Depending on system constraints and user preferences either RDMA core library
207 with a recent enough Linux kernel release (recommended) or Mellanox OFED,
208 which provides compatibility with older releases.
209
210 Current RDMA core package and Linux kernel (recommended)
211 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
212
213 - Minimal Linux kernel version: 4.14.
214 - Minimal RDMA core version: v15 (see `RDMA core installation documentation`_).
215
216 - Starting with rdma-core v21, static libraries can be built::
217
218     cd build
219     CFLAGS=-fPIC cmake -DIN_PLACE=1 -DENABLE_STATIC=1 -GNinja ..
220     ninja
221
222 .. _`RDMA core installation documentation`: https://raw.githubusercontent.com/linux-rdma/rdma-core/master/README.md
223
224 If rdma-core libraries are built but not installed, DPDK makefile can link them,
225 thanks to these environment variables:
226
227    - ``EXTRA_CFLAGS=-I/path/to/rdma-core/build/include``
228    - ``EXTRA_LDFLAGS=-L/path/to/rdma-core/build/lib``
229    - ``PKG_CONFIG_PATH=/path/to/rdma-core/build/lib/pkgconfig``
230
231 .. _Mellanox_OFED_as_a_fallback:
232
233 Mellanox OFED as a fallback
234 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
235
236 - `Mellanox OFED`_ version: **4.4, 4.5**.
237 - firmware version: **2.42.5000** and above.
238
239 .. _`Mellanox OFED`: http://www.mellanox.com/page/products_dyn?product_family=26&mtag=linux_sw_drivers
240
241 .. note::
242
243    Several versions of Mellanox OFED are available. Installing the version
244    this DPDK release was developed and tested against is strongly
245    recommended. Please check the `prerequisites`_.
246
247 Installing Mellanox OFED
248 ^^^^^^^^^^^^^^^^^^^^^^^^
249
250 1. Download latest Mellanox OFED.
251
252 2. Install the required libraries and kernel modules either by installing
253    only the required set, or by installing the entire Mellanox OFED:
254
255    For bare metal use:
256
257    .. code-block:: console
258
259         ./mlnxofedinstall --dpdk --upstream-libs
260
261    For SR-IOV hypervisors use:
262
263    .. code-block:: console
264
265         ./mlnxofedinstall --dpdk --upstream-libs --enable-sriov --hypervisor
266
267    For SR-IOV virtual machine use:
268
269    .. code-block:: console
270
271         ./mlnxofedinstall --dpdk --upstream-libs --guest
272
273 3. Verify the firmware is the correct one:
274
275    .. code-block:: console
276
277         ibv_devinfo
278
279 4. Set all ports links to Ethernet, follow instructions on the screen:
280
281    .. code-block:: console
282
283         connectx_port_config
284
285 5. Continue with :ref:`section 2 of the Quick Start Guide <QSG_2>`.
286
287 Supported NICs
288 --------------
289
290 * Mellanox(R) ConnectX(R)-3 Pro 40G MCX354A-FCC_Ax (2*40G)
291
292 .. _qsg:
293
294 Quick Start Guide
295 -----------------
296
297 1. Set all ports links to Ethernet
298
299    .. code-block:: console
300
301         PCI=<NIC PCI address>
302         echo eth > "/sys/bus/pci/devices/$PCI/mlx4_port0"
303         echo eth > "/sys/bus/pci/devices/$PCI/mlx4_port1"
304
305    .. note::
306
307         If using Mellanox OFED one can permanently set the port link
308         to Ethernet using connectx_port_config tool provided by it.
309         :ref:`Mellanox_OFED_as_a_fallback`:
310
311 .. _QSG_2:
312
313 2. In case of bare metal or hypervisor, configure optimized steering mode
314    by adding the following line to ``/etc/modprobe.d/mlx4_core.conf``:
315
316    .. code-block:: console
317
318         options mlx4_core log_num_mgm_entry_size=-7
319
320    .. note::
321
322         If VLAN filtering is used, set log_num_mgm_entry_size=-1.
323         Performance degradation can occur on this case.
324
325 3. Restart the driver:
326
327    .. code-block:: console
328
329         /etc/init.d/openibd restart
330
331    or:
332
333    .. code-block:: console
334
335         service openibd restart
336
337 4. Compile DPDK and you are ready to go. See instructions on
338    :ref:`Development Kit Build System <Development_Kit_Build_System>`
339
340 Performance tuning
341 ------------------
342
343 1. Verify the optimized steering mode is configured:
344
345   .. code-block:: console
346
347         cat /sys/module/mlx4_core/parameters/log_num_mgm_entry_size
348
349 2. Use the CPU near local NUMA node to which the PCIe adapter is connected,
350    for better performance. For VMs, verify that the right CPU
351    and NUMA node are pinned according to the above. Run:
352
353    .. code-block:: console
354
355         lstopo-no-graphics
356
357    to identify the NUMA node to which the PCIe adapter is connected.
358
359 3. If more than one adapter is used, and root complex capabilities allow
360    to put both adapters on the same NUMA node without PCI bandwidth degradation,
361    it is recommended to locate both adapters on the same NUMA node.
362    This in order to forward packets from one to the other without
363    NUMA performance penalty.
364
365 4. Disable pause frames:
366
367    .. code-block:: console
368
369         ethtool -A <netdev> rx off tx off
370
371 5. Verify IO non-posted prefetch is disabled by default. This can be checked
372    via the BIOS configuration. Please contact you server provider for more
373    information about the settings.
374
375 .. note::
376
377         On some machines, depends on the machine integrator, it is beneficial
378         to set the PCI max read request parameter to 1K. This can be
379         done in the following way:
380
381         To query the read request size use:
382
383         .. code-block:: console
384
385                 setpci -s <NIC PCI address> 68.w
386
387         If the output is different than 3XXX, set it by:
388
389         .. code-block:: console
390
391                 setpci -s <NIC PCI address> 68.w=3XXX
392
393         The XXX can be different on different systems. Make sure to configure
394         according to the setpci output.
395
396 6. To minimize overhead of searching Memory Regions:
397
398    - '--socket-mem' is recommended to pin memory by predictable amount.
399    - Configure per-lcore cache when creating Mempools for packet buffer.
400    - Refrain from dynamically allocating/freeing memory in run-time.
401
402 Usage example
403 -------------
404
405 This section demonstrates how to launch **testpmd** with Mellanox ConnectX-3
406 devices managed by librte_pmd_mlx4.
407
408 #. Load the kernel modules:
409
410    .. code-block:: console
411
412       modprobe -a ib_uverbs mlx4_en mlx4_core mlx4_ib
413
414    Alternatively if MLNX_OFED is fully installed, the following script can
415    be run:
416
417    .. code-block:: console
418
419       /etc/init.d/openibd restart
420
421    .. note::
422
423       User space I/O kernel modules (uio and igb_uio) are not used and do
424       not have to be loaded.
425
426 #. Make sure Ethernet interfaces are in working order and linked to kernel
427    verbs. Related sysfs entries should be present:
428
429    .. code-block:: console
430
431       ls -d /sys/class/net/*/device/infiniband_verbs/uverbs* | cut -d / -f 5
432
433    Example output:
434
435    .. code-block:: console
436
437       eth2
438       eth3
439       eth4
440       eth5
441
442 #. Optionally, retrieve their PCI bus addresses for whitelisting:
443
444    .. code-block:: console
445
446       {
447           for intf in eth2 eth3 eth4 eth5;
448           do
449               (cd "/sys/class/net/${intf}/device/" && pwd -P);
450           done;
451       } |
452       sed -n 's,.*/\(.*\),-w \1,p'
453
454    Example output:
455
456    .. code-block:: console
457
458       -w 0000:83:00.0
459       -w 0000:83:00.0
460       -w 0000:84:00.0
461       -w 0000:84:00.0
462
463    .. note::
464
465       There are only two distinct PCI bus addresses because the Mellanox
466       ConnectX-3 adapters installed on this system are dual port.
467
468 #. Request huge pages:
469
470    .. code-block:: console
471
472       echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages/nr_hugepages
473
474 #. Start testpmd with basic parameters:
475
476    .. code-block:: console
477
478       testpmd -l 8-15 -n 4 -w 0000:83:00.0 -w 0000:84:00.0 -- --rxq=2 --txq=2 -i
479
480    Example output:
481
482    .. code-block:: console
483
484       [...]
485       EAL: PCI device 0000:83:00.0 on NUMA socket 1
486       EAL:   probe driver: 15b3:1007 librte_pmd_mlx4
487       PMD: librte_pmd_mlx4: PCI information matches, using device "mlx4_0" (VF: false)
488       PMD: librte_pmd_mlx4: 2 port(s) detected
489       PMD: librte_pmd_mlx4: port 1 MAC address is 00:02:c9:b5:b7:50
490       PMD: librte_pmd_mlx4: port 2 MAC address is 00:02:c9:b5:b7:51
491       EAL: PCI device 0000:84:00.0 on NUMA socket 1
492       EAL:   probe driver: 15b3:1007 librte_pmd_mlx4
493       PMD: librte_pmd_mlx4: PCI information matches, using device "mlx4_1" (VF: false)
494       PMD: librte_pmd_mlx4: 2 port(s) detected
495       PMD: librte_pmd_mlx4: port 1 MAC address is 00:02:c9:b5:ba:b0
496       PMD: librte_pmd_mlx4: port 2 MAC address is 00:02:c9:b5:ba:b1
497       Interactive-mode selected
498       Configuring Port 0 (socket 0)
499       PMD: librte_pmd_mlx4: 0x867d60: TX queues number update: 0 -> 2
500       PMD: librte_pmd_mlx4: 0x867d60: RX queues number update: 0 -> 2
501       Port 0: 00:02:C9:B5:B7:50
502       Configuring Port 1 (socket 0)
503       PMD: librte_pmd_mlx4: 0x867da0: TX queues number update: 0 -> 2
504       PMD: librte_pmd_mlx4: 0x867da0: RX queues number update: 0 -> 2
505       Port 1: 00:02:C9:B5:B7:51
506       Configuring Port 2 (socket 0)
507       PMD: librte_pmd_mlx4: 0x867de0: TX queues number update: 0 -> 2
508       PMD: librte_pmd_mlx4: 0x867de0: RX queues number update: 0 -> 2
509       Port 2: 00:02:C9:B5:BA:B0
510       Configuring Port 3 (socket 0)
511       PMD: librte_pmd_mlx4: 0x867e20: TX queues number update: 0 -> 2
512       PMD: librte_pmd_mlx4: 0x867e20: RX queues number update: 0 -> 2
513       Port 3: 00:02:C9:B5:BA:B1
514       Checking link statuses...
515       Port 0 Link Up - speed 10000 Mbps - full-duplex
516       Port 1 Link Up - speed 40000 Mbps - full-duplex
517       Port 2 Link Up - speed 10000 Mbps - full-duplex
518       Port 3 Link Up - speed 40000 Mbps - full-duplex
519       Done
520       testpmd>