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