doc: add large iavf support to release notes
[dpdk.git] / doc / guides / nics / mlx4.rst
index 7c43177..c408ab7 100644 (file)
@@ -1,37 +1,11 @@
-..  BSD LICENSE
+..  SPDX-License-Identifier: BSD-3-Clause
     Copyright 2012 6WIND S.A.
-    Copyright 2015 Mellanox
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions
-    are met:
-
-    * Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in
-    the documentation and/or other materials provided with the
-    distribution.
-    * Neither the name of 6WIND S.A. nor the names of its
-    contributors may be used to endorse or promote products derived
-    from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+    Copyright 2015 Mellanox Technologies, Ltd
 
 MLX4 poll mode driver library
 =============================
 
-The MLX4 poll mode driver library (**librte_pmd_mlx4**) implements support
+The MLX4 poll mode driver library (**librte_net_mlx4**) implements support
 for **Mellanox ConnectX-3** and **Mellanox ConnectX-3 Pro** 10/40 Gbps adapters
 as well as their virtual functions (VF) in SR-IOV context.
 
@@ -42,24 +16,19 @@ the `Mellanox community <http://community.mellanox.com/welcome>`_.
 There is also a `section dedicated to this poll mode driver
 <http://www.mellanox.com/page/products_dyn?product_family=209&mtag=pmd_for_dpdk>`_.
 
-.. note::
-
-   Due to external dependencies, this driver is disabled by default. It must
-   be enabled manually by setting ``CONFIG_RTE_LIBRTE_MLX4_PMD=y`` and
-   recompiling DPDK.
 
 Implementation details
 ----------------------
 
 Most Mellanox ConnectX-3 devices provide two ports but expose a single PCI
-bus address, thus unlike most drivers, librte_pmd_mlx4 registers itself as a
+bus address, thus unlike most drivers, librte_net_mlx4 registers itself as a
 PCI driver that allocates one Ethernet device per detected port.
 
 For this reason, one cannot white/blacklist a single port without also
 white/blacklisting the others on the same device.
 
 Besides its dependency on libibverbs (that implies libmlx4 and associated
-kernel support), librte_pmd_mlx4 relies heavily on system calls for control
+kernel support), librte_net_mlx4 relies heavily on system calls for control
 operations such as querying/updating the MTU and flow control parameters.
 
 For security reasons and robustness, this driver only deals with virtual
@@ -72,14 +41,9 @@ This capability allows the PMD to coexist with kernel network interfaces
 which remain functional, although they stop receiving unicast packets as
 long as they share the same MAC address.
 
-Compiling librte_pmd_mlx4 causes DPDK to be linked against libibverbs.
+The :ref:`flow_isolated_mode` is supported.
 
-Features
---------
-
-- Multi arch support: x86_64 and POWER8.
-- Link state information is provided.
-- RX interrupts.
+Compiling librte_net_mlx4 causes DPDK to be linked against libibverbs.
 
 Configuration
 -------------
@@ -87,38 +51,33 @@ Configuration
 Compilation options
 ~~~~~~~~~~~~~~~~~~~
 
-These options can be modified in the ``.config`` file.
-
-- ``CONFIG_RTE_LIBRTE_MLX4_PMD`` (default **n**)
+The ibverbs libraries can be linked with this PMD in a number of ways,
+configured by the ``ibverbs_link`` build option:
 
-  Toggle compilation of librte_pmd_mlx4 itself.
+- ``shared`` (default): the PMD depends on some .so files.
 
-- ``CONFIG_RTE_LIBRTE_MLX4_DEBUG`` (default **n**)
+- ``dlopen``: Split the dependencies glue in a separate library
+  loaded when needed by dlopen.
+  It make dependencies on libibverbs and libmlx4 optional,
+  and has no performance impact.
 
-  Toggle debugging code and stricter compilation flags. Enabling this option
-  adds additional run-time checks and debugging messages at the cost of
-  lower performance.
+- ``static``: Embed static flavor of the dependencies libibverbs and libmlx4
+  in the PMD shared library or the executable static binary.
 
-- ``CONFIG_RTE_LIBRTE_MLX4_DEBUG_BROKEN_VERBS`` (default **n**)
 
-  Mellanox OFED versions earlier than 4.2 may return false errors from
-  Verbs object destruction APIs after the device is plugged out.
-  Enabling this option replaces assertion checks that cause the program
-  to abort with harmless debugging messages as a workaround.
-  Relevant only when CONFIG_RTE_LIBRTE_MLX4_DEBUG is enabled.
+Environment variables
+~~~~~~~~~~~~~~~~~~~~~
 
-- ``CONFIG_RTE_LIBRTE_MLX4_TX_MP_CACHE`` (default **8**)
+- ``MLX4_GLUE_PATH``
 
-  Maximum number of cached memory pools (MPs) per TX queue. Each MP from
-  which buffers are to be transmitted must be associated to memory regions
-  (MRs). This is a slow operation that must be cached.
+  A list of directories in which to search for the rdma-core "glue" plug-in,
+  separated by colons or semi-colons.
 
-  This value is always 1 for RX queues since they use a single MP.
 
 Run-time configuration
 ~~~~~~~~~~~~~~~~~~~~~~
 
-- librte_pmd_mlx4 brings kernel network interfaces up during initialization
+- librte_net_mlx4 brings kernel network interfaces up during initialization
   because it is affected by their state. Forcing them down prevents packets
   reception.
 
@@ -130,11 +89,22 @@ Run-time configuration
   times for additional ports. All ports are probed by default if left
   unspecified.
 
+- ``mr_ext_memseg_en`` parameter [int]
+
+  A nonzero value enables extending memseg when registering DMA memory. If
+  enabled, the number of entries in MR (Memory Region) lookup table on datapath
+  is minimized and it benefits performance. On the other hand, it worsens memory
+  utilization because registered memory is pinned by kernel driver. Even if a
+  page in the extended chunk is freed, that doesn't become reusable until the
+  entire memory is freed.
+
+  Enabled by default.
+
 Kernel module parameters
 ~~~~~~~~~~~~~~~~~~~~~~~~
 
 The **mlx4_core** kernel module has several parameters that affect the
-behavior and/or the performance of librte_pmd_mlx4. Some of them are described
+behavior and/or the performance of librte_net_mlx4. Some of them are described
 below.
 
 - **num_vfs** (integer or triplet, optionally prefixed by device address
@@ -153,6 +123,25 @@ below.
     following limitation: VLAN filtering is not supported with this mode.
     This is the recommended mode in case VLAN filter is not needed.
 
+Limitations
+-----------
+
+- For secondary process:
+
+  - Forked secondary process not supported.
+  - External memory unregistered in EAL memseg list cannot be used for DMA
+    unless such memory has been registered by ``mlx4_mr_update_ext_mp()`` in
+    primary process and remapped to the same virtual address in secondary
+    process. If the external memory is registered by primary process but has
+    different virtual address in secondary process, unexpected error may happen.
+
+- CRC stripping is supported by default and always reported as "true".
+  The ability to enable/disable CRC stripping requires OFED version
+  4.3-1.5.0.0 and above  or rdma-core version v18 and above.
+
+- TSO (Transmit Segmentation Offload) is supported in OFED version
+  4.4 and above.
+
 Prerequisites
 -------------
 
@@ -160,9 +149,9 @@ This driver relies on external libraries and kernel drivers for resources
 allocations and initialization. The following dependencies are not part of
 DPDK and must be installed separately:
 
-- **libibverbs**
+- **libibverbs** (provided by rdma-core package)
 
-  User space verbs framework used by librte_pmd_mlx4. This library provides
+  User space verbs framework used by librte_net_mlx4. This library provides
   a generic interface between the kernel and low-level user space drivers
   such as libmlx4.
 
@@ -170,7 +159,7 @@ DPDK and must be installed separately:
   resources allocations) to be managed by the kernel and fast operations to
   never leave user space.
 
-- **libmlx4**
+- **libmlx4** (provided by rdma-core package)
 
   Low-level user space driver library for Mellanox ConnectX-3 devices,
   it is automatically loaded by libibverbs.
@@ -178,7 +167,7 @@ DPDK and must be installed separately:
   This library basically implements send/receive calls to the hardware
   queues.
 
-- **Kernel modules** (mlnx-ofed-kernel)
+- **Kernel modules**
 
   They provide the kernel-side verbs API and low level device drivers that
   manage actual hardware initialization and resources sharing with user
@@ -204,24 +193,33 @@ DPDK and must be installed separately:
    Both libraries are BSD and GPL licensed. Linux kernel modules are GPL
    licensed.
 
-Currently supported by DPDK:
+Depending on system constraints and user preferences either RDMA core library
+with a recent enough Linux kernel release (recommended) or Mellanox OFED,
+which provides compatibility with older releases.
 
-- Mellanox OFED **4.1**.
-- Firmware version **2.36.5000** and above.
+Current RDMA core package and Linux kernel (recommended)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-Getting Mellanox OFED
-~~~~~~~~~~~~~~~~~~~~~
+- Minimal Linux kernel version: 4.14.
+- Minimal RDMA core version: v15 (see `RDMA core installation documentation`_).
 
-While these libraries and kernel modules are available on OpenFabrics
-Alliance's `website <https://www.openfabrics.org/>`_ and provided by package
-managers on most distributions, this PMD requires Ethernet extensions that
-may not be supported at the moment (this is a work in progress).
+- Starting with rdma-core v21, static libraries can be built::
 
-`Mellanox OFED
-<http://www.mellanox.com/page/products_dyn?product_family=26&mtag=linux_sw_drivers>`_
-includes the necessary support and should be used in the meantime. For DPDK,
-only libibverbs, libmlx4, mlnx-ofed-kernel packages and firmware updates are
-required from that distribution.
+    cd build
+    CFLAGS=-fPIC cmake -DIN_PLACE=1 -DENABLE_STATIC=1 -GNinja ..
+    ninja
+
+.. _`RDMA core installation documentation`: https://raw.githubusercontent.com/linux-rdma/rdma-core/master/README.md
+
+.. _Mellanox_OFED_as_a_fallback:
+
+Mellanox OFED as a fallback
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- `Mellanox OFED`_ version: **4.4, 4.5, 4.6**.
+- firmware version: **2.42.5000** and above.
+
+.. _`Mellanox OFED`: http://www.mellanox.com/page/products_dyn?product_family=26&mtag=linux_sw_drivers
 
 .. note::
 
@@ -229,61 +227,57 @@ required from that distribution.
    this DPDK release was developed and tested against is strongly
    recommended. Please check the `prerequisites`_.
 
-Supported NICs
---------------
+Installing Mellanox OFED
+^^^^^^^^^^^^^^^^^^^^^^^^
 
-* Mellanox(R) ConnectX(R)-3 Pro 40G MCX354A-FCC_Ax (2*40G)
-
-Quick Start Guide
------------------
-
-1. Download latest Mellanox OFED. For more info check the  `prerequisites`_.
+1. Download latest Mellanox OFED.
 
 2. Install the required libraries and kernel modules either by installing
    only the required set, or by installing the entire Mellanox OFED:
 
-   For bare metal use:
-
-   .. code-block:: console
-
-        ./mlnxofedinstall
-
-   For SR-IOV hypervisors use:
-
-   .. code-block:: console
+   For bare metal use::
 
-        ./mlnxofedinstall --enable-sriov -hypervisor
+        ./mlnxofedinstall --dpdk --upstream-libs
 
-   For SR-IOV virtual machine use:
+   For SR-IOV hypervisors use::
 
-   .. code-block:: console
+        ./mlnxofedinstall --dpdk --upstream-libs --enable-sriov --hypervisor
 
-        ./mlnxofedinstall --guest
+   For SR-IOV virtual machine use::
 
-3. Verify the firmware is the correct one:
+        ./mlnxofedinstall --dpdk --upstream-libs --guest
 
-   .. code-block:: console
+3. Verify the firmware is the correct one::
 
         ibv_devinfo
 
-4. Set all ports links to Ethernet, follow instructions on the screen:
-
-   .. code-block:: console
+4. Set all ports links to Ethernet, follow instructions on the screen::
 
         connectx_port_config
 
-   Or in the manual way:
+5. Continue with :ref:`section 2 of the Quick Start Guide <QSG_2>`.
+
+.. _qsg:
 
-   .. code-block:: console
+Quick Start Guide
+-----------------
+
+1. Set all ports links to Ethernet::
 
         PCI=<NIC PCI address>
         echo eth > "/sys/bus/pci/devices/$PCI/mlx4_port0"
         echo eth > "/sys/bus/pci/devices/$PCI/mlx4_port1"
 
-5. In case of bare metal or hypervisor, configure optimized steering mode
-   by adding the following line to ``/etc/modprobe.d/mlx4_core.conf``:
+   .. note::
+
+        If using Mellanox OFED one can permanently set the port link
+        to Ethernet using connectx_port_config tool provided by it.
+        :ref:`Mellanox_OFED_as_a_fallback`:
 
-   .. code-block:: console
+.. _QSG_2:
+
+2. In case of bare metal or hypervisor, configure optimized steering mode
+   by adding the following line to ``/etc/modprobe.d/mlx4_core.conf``::
 
         options mlx4_core log_num_mgm_entry_size=-7
 
@@ -292,35 +286,27 @@ Quick Start Guide
         If VLAN filtering is used, set log_num_mgm_entry_size=-1.
         Performance degradation can occur on this case.
 
-6. Restart the driver:
-
-   .. code-block:: console
+3. Restart the driver::
 
         /etc/init.d/openibd restart
 
-   or:
-
-   .. code-block:: console
+   or::
 
         service openibd restart
 
-7. Compile DPDK and you are ready to go. See instructions on
-   :ref:`Development Kit Build System <Development_Kit_Build_System>`
+4. Install DPDK and you are ready to go.
+   See :doc:`compilation instructions <../linux_gsg/build_dpdk>`.
 
 Performance tuning
 ------------------
 
-1. Verify the optimized steering mode is configured:
-
-  .. code-block:: console
+1. Verify the optimized steering mode is configured::
 
         cat /sys/module/mlx4_core/parameters/log_num_mgm_entry_size
 
 2. Use the CPU near local NUMA node to which the PCIe adapter is connected,
    for better performance. For VMs, verify that the right CPU
-   and NUMA node are pinned according to the above. Run:
-
-   .. code-block:: console
+   and NUMA node are pinned according to the above. Run::
 
         lstopo-no-graphics
 
@@ -332,9 +318,7 @@ Performance tuning
    This in order to forward packets from one to the other without
    NUMA performance penalty.
 
-4. Disable pause frames:
-
-   .. code-block:: console
+4. Disable pause frames::
 
         ethtool -A <netdev> rx off tx off
 
@@ -348,37 +332,35 @@ Performance tuning
         to set the PCI max read request parameter to 1K. This can be
         done in the following way:
 
-        To query the read request size use:
-
-        .. code-block:: console
+        To query the read request size use::
 
                 setpci -s <NIC PCI address> 68.w
 
-        If the output is different than 3XXX, set it by:
-
-        .. code-block:: console
+        If the output is different than 3XXX, set it by::
 
                 setpci -s <NIC PCI address> 68.w=3XXX
 
         The XXX can be different on different systems. Make sure to configure
         according to the setpci output.
 
+6. To minimize overhead of searching Memory Regions:
+
+   - '--socket-mem' is recommended to pin memory by predictable amount.
+   - Configure per-lcore cache when creating Mempools for packet buffer.
+   - Refrain from dynamically allocating/freeing memory in run-time.
+
 Usage example
 -------------
 
 This section demonstrates how to launch **testpmd** with Mellanox ConnectX-3
-devices managed by librte_pmd_mlx4.
+devices managed by librte_net_mlx4.
 
-#. Load the kernel modules:
-
-   .. code-block:: console
+#. Load the kernel modules::
 
       modprobe -a ib_uverbs mlx4_en mlx4_core mlx4_ib
 
    Alternatively if MLNX_OFED is fully installed, the following script can
-   be run:
-
-   .. code-block:: console
+   be run::
 
       /etc/init.d/openibd restart
 
@@ -388,24 +370,18 @@ devices managed by librte_pmd_mlx4.
       not have to be loaded.
 
 #. Make sure Ethernet interfaces are in working order and linked to kernel
-   verbs. Related sysfs entries should be present:
-
-   .. code-block:: console
+   verbs. Related sysfs entries should be present::
 
       ls -d /sys/class/net/*/device/infiniband_verbs/uverbs* | cut -d / -f 5
 
-   Example output:
-
-   .. code-block:: console
+   Example output::
 
       eth2
       eth3
       eth4
       eth5
 
-#. Optionally, retrieve their PCI bus addresses for whitelisting:
-
-   .. code-block:: console
+#. Optionally, retrieve their PCI bus addresses for whitelisting::
 
       {
           for intf in eth2 eth3 eth4 eth5;
@@ -415,9 +391,7 @@ devices managed by librte_pmd_mlx4.
       } |
       sed -n 's,.*/\(.*\),-w \1,p'
 
-   Example output:
-
-   .. code-block:: console
+   Example output::
 
       -w 0000:83:00.0
       -w 0000:83:00.0
@@ -429,51 +403,45 @@ devices managed by librte_pmd_mlx4.
       There are only two distinct PCI bus addresses because the Mellanox
       ConnectX-3 adapters installed on this system are dual port.
 
-#. Request huge pages:
-
-   .. code-block:: console
+#. Request huge pages::
 
       echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages/nr_hugepages
 
-#. Start testpmd with basic parameters:
-
-   .. code-block:: console
+#. Start testpmd with basic parameters::
 
       testpmd -l 8-15 -n 4 -w 0000:83:00.0 -w 0000:84:00.0 -- --rxq=2 --txq=2 -i
 
-   Example output:
-
-   .. code-block:: console
+   Example output::
 
       [...]
       EAL: PCI device 0000:83:00.0 on NUMA socket 1
-      EAL:   probe driver: 15b3:1007 librte_pmd_mlx4
-      PMD: librte_pmd_mlx4: PCI information matches, using device "mlx4_0" (VF: false)
-      PMD: librte_pmd_mlx4: 2 port(s) detected
-      PMD: librte_pmd_mlx4: port 1 MAC address is 00:02:c9:b5:b7:50
-      PMD: librte_pmd_mlx4: port 2 MAC address is 00:02:c9:b5:b7:51
+      EAL:   probe driver: 15b3:1007 librte_net_mlx4
+      PMD: librte_net_mlx4: PCI information matches, using device "mlx4_0" (VF: false)
+      PMD: librte_net_mlx4: 2 port(s) detected
+      PMD: librte_net_mlx4: port 1 MAC address is 00:02:c9:b5:b7:50
+      PMD: librte_net_mlx4: port 2 MAC address is 00:02:c9:b5:b7:51
       EAL: PCI device 0000:84:00.0 on NUMA socket 1
-      EAL:   probe driver: 15b3:1007 librte_pmd_mlx4
-      PMD: librte_pmd_mlx4: PCI information matches, using device "mlx4_1" (VF: false)
-      PMD: librte_pmd_mlx4: 2 port(s) detected
-      PMD: librte_pmd_mlx4: port 1 MAC address is 00:02:c9:b5:ba:b0
-      PMD: librte_pmd_mlx4: port 2 MAC address is 00:02:c9:b5:ba:b1
+      EAL:   probe driver: 15b3:1007 librte_net_mlx4
+      PMD: librte_net_mlx4: PCI information matches, using device "mlx4_1" (VF: false)
+      PMD: librte_net_mlx4: 2 port(s) detected
+      PMD: librte_net_mlx4: port 1 MAC address is 00:02:c9:b5:ba:b0
+      PMD: librte_net_mlx4: port 2 MAC address is 00:02:c9:b5:ba:b1
       Interactive-mode selected
       Configuring Port 0 (socket 0)
-      PMD: librte_pmd_mlx4: 0x867d60: TX queues number update: 0 -> 2
-      PMD: librte_pmd_mlx4: 0x867d60: RX queues number update: 0 -> 2
+      PMD: librte_net_mlx4: 0x867d60: TX queues number update: 0 -> 2
+      PMD: librte_net_mlx4: 0x867d60: RX queues number update: 0 -> 2
       Port 0: 00:02:C9:B5:B7:50
       Configuring Port 1 (socket 0)
-      PMD: librte_pmd_mlx4: 0x867da0: TX queues number update: 0 -> 2
-      PMD: librte_pmd_mlx4: 0x867da0: RX queues number update: 0 -> 2
+      PMD: librte_net_mlx4: 0x867da0: TX queues number update: 0 -> 2
+      PMD: librte_net_mlx4: 0x867da0: RX queues number update: 0 -> 2
       Port 1: 00:02:C9:B5:B7:51
       Configuring Port 2 (socket 0)
-      PMD: librte_pmd_mlx4: 0x867de0: TX queues number update: 0 -> 2
-      PMD: librte_pmd_mlx4: 0x867de0: RX queues number update: 0 -> 2
+      PMD: librte_net_mlx4: 0x867de0: TX queues number update: 0 -> 2
+      PMD: librte_net_mlx4: 0x867de0: RX queues number update: 0 -> 2
       Port 2: 00:02:C9:B5:BA:B0
       Configuring Port 3 (socket 0)
-      PMD: librte_pmd_mlx4: 0x867e20: TX queues number update: 0 -> 2
-      PMD: librte_pmd_mlx4: 0x867e20: RX queues number update: 0 -> 2
+      PMD: librte_net_mlx4: 0x867e20: TX queues number update: 0 -> 2
+      PMD: librte_net_mlx4: 0x867e20: RX queues number update: 0 -> 2
       Port 3: 00:02:C9:B5:BA:B1
       Checking link statuses...
       Port 0 Link Up - speed 10000 Mbps - full-duplex