]> git.droids-corp.org - dpdk.git/commitdiff
net/mlx5: check conditions to enable LRO
authorDekel Peled <dekelp@mellanox.com>
Mon, 22 Jul 2019 14:52:03 +0000 (14:52 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 23 Jul 2019 12:31:36 +0000 (14:31 +0200)
Use DevX API to read device LRO capabilities.
Check if LRO is supported and can be enabled.
Check if MPRQ is supported and can be used.
Enable MPRQ for LRO use if not enabled by user.
Added note for mlx5_mprq_enabled(), to emphasize that LRO
enables MPRQ.
Disable CQE compression and CRC stripping if LRO is enabled.

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
Acked-by: Matan Azrad <matan@mellanox.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
doc/guides/nics/mlx5.rst
drivers/net/mlx5/mlx5.c
drivers/net/mlx5/mlx5_ethdev.c
drivers/net/mlx5/mlx5_rxq.c

index 1ea2c434458b0439aa534d66002270e6dab1714c..ecd25dc41a23d6c2356a20f4c6ca47ecc9eb94db 100644 (file)
@@ -163,6 +163,10 @@ Limitations
 
 - ICMP/ICMP6 code/type matching cannot be supported togeter with IP-in-IP tunnel.
 
+- LRO:
+
+  - ``scatter_fcs`` is disabled when LRO is configured.
+
 Statistics
 ----------
 
index 19e1f419ac8fe584f705860df836457dc7c6d208..fca2dbf3de178adc0dd22b2aebdb3cf25ed9bf07 100644 (file)
@@ -1683,6 +1683,38 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
        } else if (config.cqe_pad) {
                DRV_LOG(INFO, "Rx CQE padding is enabled");
        }
+       if (config.devx) {
+               priv->counter_fallback = 0;
+               err = mlx5_devx_cmd_query_hca_attr(sh->ctx, &config.hca_attr);
+               if (err) {
+                       err = -err;
+                       goto error;
+               }
+               if (!config.hca_attr.flow_counters_dump)
+                       priv->counter_fallback = 1;
+#ifndef HAVE_IBV_DEVX_ASYNC
+               priv->counter_fallback = 1;
+#endif
+               if (priv->counter_fallback)
+                       DRV_LOG(INFO, "Use fall-back DV counter management\n");
+               /* Check for LRO support. */
+               if (config.dest_tir && mprq && config.hca_attr.lro_cap) {
+                       /* TBD check tunnel lro caps. */
+                       config.lro.supported = config.hca_attr.lro_cap;
+                       DRV_LOG(DEBUG, "Device supports LRO");
+                       /*
+                        * If LRO timeout is not configured by application,
+                        * use the minimal supported value.
+                        */
+                       if (!config.lro.timeout)
+                               config.lro.timeout =
+                               config.hca_attr.lro_timer_supported_periods[0];
+                       DRV_LOG(DEBUG, "LRO session timeout set to %d usec",
+                               config.lro.timeout);
+                       config.mprq.enabled = 1;
+                       DRV_LOG(DEBUG, "Enable MPRQ for LRO use");
+               }
+       }
        if (config.mprq.enabled && mprq) {
                if (config.mprq.stride_num_n > mprq_max_stride_num_n ||
                    config.mprq.stride_num_n < mprq_min_stride_num_n) {
@@ -1790,23 +1822,6 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
         * Verbs context returned by ibv_open_device().
         */
        mlx5_link_update(eth_dev, 0);
-#ifdef HAVE_IBV_DEVX_OBJ
-       if (config.devx) {
-               priv->counter_fallback = 0;
-               err = mlx5_devx_cmd_query_hca_attr(sh->ctx, &config.hca_attr);
-               if (err) {
-                       err = -err;
-                       goto error;
-               }
-               if (!config.hca_attr.flow_counters_dump)
-                       priv->counter_fallback = 1;
-#ifndef HAVE_IBV_DEVX_ASYNC
-               priv->counter_fallback = 1;
-#endif
-               if (priv->counter_fallback)
-                       DRV_LOG(INFO, "Use fall-back DV counter management\n");
-       }
-#endif
 #ifdef HAVE_MLX5DV_DR_ESWITCH
        if (!(config.hca_attr.eswitch_manager && config.dv_flow_en &&
              (switch_info->representor || switch_info->master)))
index cf50e6e84a0fd32c647b2228ec895c42db83b756..e627909abeb8266b14d6809c7883aa4ec32dd619 100644 (file)
@@ -389,6 +389,7 @@ mlx5_dev_configure(struct rte_eth_dev *dev)
        const uint8_t use_app_rss_key =
                !!dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key;
        int ret = 0;
+       unsigned int lro_on = mlx5_lro_on(dev);
 
        if (use_app_rss_key &&
            (dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key_len !=
@@ -431,6 +432,12 @@ mlx5_dev_configure(struct rte_eth_dev *dev)
                DRV_LOG(INFO, "port %u Rx queues number update: %u -> %u",
                        dev->data->port_id, priv->rxqs_n, rxqs_n);
                priv->rxqs_n = rxqs_n;
+               /*
+                * WHen using LRO, MPRQ is implicitly enabled.
+                * Adjust threshold value to ensure MPRQ can be enabled.
+                */
+               if (lro_on && priv->config.mprq.min_rxqs_num > priv->rxqs_n)
+                       priv->config.mprq.min_rxqs_num = priv->rxqs_n;
                /*
                 * If the requested number of RX queues is not a power of two,
                 * use the maximum indirection table size for better balancing.
@@ -453,6 +460,11 @@ mlx5_dev_configure(struct rte_eth_dev *dev)
                                j = 0;
                }
        }
+       if (lro_on && priv->config.cqe_comp) {
+               /* CQE compressing is not supported for LRO CQEs. */
+               DRV_LOG(WARNING, "Rx CQE compression isn't supported with LRO");
+               priv->config.cqe_comp = 0;
+       }
        ret = mlx5_proc_priv_init(dev);
        if (ret)
                return ret;
index e68de50156e68af8e0303c4cfd67d095a8d27e4b..8567ee56061327d4bd7c5b53771b3e61f10ce5af 100644 (file)
@@ -93,6 +93,7 @@ mlx5_rxq_mprq_enabled(struct mlx5_rxq_data *rxq)
 
 /**
  * Check whether Multi-Packet RQ is enabled for the device.
+ * MPRQ can be enabled explicitly, or implicitly by enabling LRO.
  *
  * @param dev
  *   Pointer to Ethernet device.
@@ -1431,7 +1432,18 @@ mlx5_rxq_new(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
        tmpl->rxq.crc_present = 0;
        if (offloads & DEV_RX_OFFLOAD_KEEP_CRC) {
                if (config->hw_fcs_strip) {
-                       tmpl->rxq.crc_present = 1;
+                       /*
+                        * RQs used for LRO-enabled TIRs should not be
+                        * configured to scatter the FCS.
+                        */
+                       if (mlx5_lro_on(dev))
+                               DRV_LOG(WARNING,
+                                       "port %u CRC stripping has been "
+                                       "disabled but will still be performed "
+                                       "by hardware, because LRO is enabled",
+                                       dev->data->port_id);
+                       else
+                               tmpl->rxq.crc_present = 1;
                } else {
                        DRV_LOG(WARNING,
                                "port %u CRC stripping has been disabled but will"