net/mlx5: add device parameter for MPRQ stride size
[dpdk.git] / drivers / net / mlx5 / mlx5.c
index 23a50f3..293d316 100644 (file)
@@ -63,6 +63,9 @@
 /* Device parameter to configure log 2 of the number of strides for MPRQ. */
 #define MLX5_RX_MPRQ_LOG_STRIDE_NUM "mprq_log_stride_num"
 
+/* Device parameter to configure log 2 of the stride size for MPRQ. */
+#define MLX5_RX_MPRQ_LOG_STRIDE_SIZE "mprq_log_stride_size"
+
 /* Device parameter to limit the size of memcpy'd packet for MPRQ. */
 #define MLX5_RX_MPRQ_MAX_MEMCPY_LEN "mprq_max_memcpy_len"
 
 /* Configure timeout of LRO session (in microseconds). */
 #define MLX5_LRO_TIMEOUT_USEC "lro_timeout_usec"
 
+/*
+ * Device parameter to configure the total data buffer size for a single
+ * hairpin queue (logarithm value).
+ */
+#define MLX5_HP_BUF_SIZE "hp_buf_log_sz"
+
 #ifndef HAVE_IBV_MLX5_MOD_MPW
 #define MLX5DV_CONTEXT_FLAGS_MPW_ALLOWED (1 << 2)
 #define MLX5DV_CONTEXT_FLAGS_ENHANCED_MPW (1 << 3)
@@ -385,9 +394,11 @@ mlx5_flow_counters_mng_close(struct mlx5_ibv_shared *sh)
                                        claim_zero
                                        (mlx5_glue->destroy_flow_action
                                               (pool->counters_raw[j].action));
-                               if (!batch && pool->counters_raw[j].dcs)
+                               if (!batch && MLX5_GET_POOL_CNT_EXT
+                                   (pool, j)->dcs)
                                        claim_zero(mlx5_devx_cmd_destroy
-                                                 (pool->counters_raw[j].dcs));
+                                                 (MLX5_GET_POOL_CNT_EXT
+                                                 (pool, j)->dcs));
                        }
                        TAILQ_REMOVE(&sh->cmng.ccont[i].pool_list, pool,
                                     next);
@@ -1234,9 +1245,20 @@ mlx5_dev_close(struct rte_eth_dev *dev)
        /* In case mlx5_dev_stop() has not been called. */
        mlx5_dev_interrupt_handler_uninstall(dev);
        mlx5_dev_interrupt_handler_devx_uninstall(dev);
+       /*
+        * If default mreg copy action is removed at the stop stage,
+        * the search will return none and nothing will be done anymore.
+        */
+       mlx5_flow_stop_default(dev);
        mlx5_traffic_disable(dev);
-       mlx5_flow_flush(dev, NULL);
+       /*
+        * If all the flows are already flushed in the device stop stage,
+        * then this will return directly without any action.
+        */
+       mlx5_flow_list_flush(dev, &priv->flows, true);
        mlx5_flow_meter_flush(dev, NULL);
+       /* Free the intermediate buffers for flow creation. */
+       mlx5_flow_free_intermediate(dev);
        /* Prevent crashes when queues are still in use. */
        dev->rx_pkt_burst = removed_rx_burst;
        dev->tx_pkt_burst = removed_tx_burst;
@@ -1514,6 +1536,8 @@ mlx5_args_check(const char *key, const char *val, void *opaque)
                config->mprq.enabled = !!tmp;
        } else if (strcmp(MLX5_RX_MPRQ_LOG_STRIDE_NUM, key) == 0) {
                config->mprq.stride_num_n = tmp;
+       } else if (strcmp(MLX5_RX_MPRQ_LOG_STRIDE_SIZE, key) == 0) {
+               config->mprq.stride_size_n = tmp;
        } else if (strcmp(MLX5_RX_MPRQ_MAX_MEMCPY_LEN, key) == 0) {
                config->mprq.max_memcpy_len = tmp;
        } else if (strcmp(MLX5_RXQS_MIN_MPRQ, key) == 0) {
@@ -1580,6 +1604,8 @@ mlx5_args_check(const char *key, const char *val, void *opaque)
                config->lro.timeout = tmp;
        } else if (strcmp(MLX5_CLASS_ARG_NAME, key) == 0) {
                DRV_LOG(DEBUG, "class argument is %s.", val);
+       } else if (strcmp(MLX5_HP_BUF_SIZE, key) == 0) {
+               config->log_hp_size = tmp;
        } else {
                DRV_LOG(WARNING, "%s: unknown parameter", key);
                rte_errno = EINVAL;
@@ -1608,6 +1634,7 @@ mlx5_args(struct mlx5_dev_config *config, struct rte_devargs *devargs)
                MLX5_RXQ_PKT_PAD_EN,
                MLX5_RX_MPRQ_EN,
                MLX5_RX_MPRQ_LOG_STRIDE_NUM,
+               MLX5_RX_MPRQ_LOG_STRIDE_SIZE,
                MLX5_RX_MPRQ_MAX_MEMCPY_LEN,
                MLX5_RXQS_MIN_MPRQ,
                MLX5_TXQ_INLINE,
@@ -1632,6 +1659,7 @@ mlx5_args(struct mlx5_dev_config *config, struct rte_devargs *devargs)
                MLX5_MAX_DUMP_FILES_NUM,
                MLX5_LRO_TIMEOUT_USEC,
                MLX5_CLASS_ARG_NAME,
+               MLX5_HP_BUF_SIZE,
                NULL,
        };
        struct rte_kvargs *kvlist;
@@ -1724,7 +1752,7 @@ out:
  *   key is specified in devargs
  * - if DevX is enabled the inline mode is queried from the
  *   device (HCA attributes and NIC vport context if needed).
- * - otherwise L2 mode (18 bytes) is assumed for ConnectX-4/4LX
+ * - otherwise L2 mode (18 bytes) is assumed for ConnectX-4/4 Lx
  *   and none (0 bytes) for other NICs
  *
  * @param spawn
@@ -2282,8 +2310,6 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
                        mprq_caps.min_single_wqe_log_num_of_strides;
                mprq_max_stride_num_n =
                        mprq_caps.max_single_wqe_log_num_of_strides;
-               config.mprq.stride_num_n = RTE_MAX(MLX5_MPRQ_STRIDE_NUM_N,
-                                                  mprq_min_stride_num_n);
        }
 #endif
        if (RTE_CACHE_LINE_SIZE == 128 &&
@@ -2597,17 +2623,32 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
 #endif
        }
        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) {
+               if (config.mprq.stride_num_n &&
+                   (config.mprq.stride_num_n > mprq_max_stride_num_n ||
+                    config.mprq.stride_num_n < mprq_min_stride_num_n)) {
                        config.mprq.stride_num_n =
-                               RTE_MAX(MLX5_MPRQ_STRIDE_NUM_N,
-                                       mprq_min_stride_num_n);
+                               RTE_MIN(RTE_MAX(MLX5_MPRQ_STRIDE_NUM_N,
+                                               mprq_min_stride_num_n),
+                                       mprq_max_stride_num_n);
                        DRV_LOG(WARNING,
                                "the number of strides"
                                " for Multi-Packet RQ is out of range,"
                                " setting default value (%u)",
                                1 << config.mprq.stride_num_n);
                }
+               if (config.mprq.stride_size_n &&
+                   (config.mprq.stride_size_n > mprq_max_stride_size_n ||
+                    config.mprq.stride_size_n < mprq_min_stride_size_n)) {
+                       config.mprq.stride_size_n =
+                               RTE_MIN(RTE_MAX(MLX5_MPRQ_STRIDE_SIZE_N,
+                                               mprq_min_stride_size_n),
+                                       mprq_max_stride_size_n);
+                       DRV_LOG(WARNING,
+                               "the size of a stride"
+                               " for Multi-Packet RQ is out of range,"
+                               " setting default value (%u)",
+                               1 << config.mprq.stride_size_n);
+               }
                config.mprq.min_stride_size_n = mprq_min_stride_size_n;
                config.mprq.max_stride_size_n = mprq_max_stride_size_n;
        } else if (config.mprq.enabled && !mprq) {
@@ -2759,6 +2800,11 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
                        err = ENOTSUP;
                        goto error;
        }
+       /*
+        * Allocate the buffer for flow creating, just once.
+        * The allocation must be done before any flow creating.
+        */
+       mlx5_flow_alloc_intermediate(eth_dev);
        /* Query availibility of metadata reg_c's. */
        err = mlx5_flow_discover_mreg_c(eth_dev);
        if (err < 0) {
@@ -3336,12 +3382,14 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
                .mr_ext_memseg_en = 1,
                .mprq = {
                        .enabled = 0, /* Disabled by default. */
-                       .stride_num_n = MLX5_MPRQ_STRIDE_NUM_N,
+                       .stride_num_n = 0,
+                       .stride_size_n = 0,
                        .max_memcpy_len = MLX5_MPRQ_MEMCPY_DEFAULT_LEN,
                        .min_rxqs_num = MLX5_MPRQ_MIN_RXQS,
                },
                .dv_esw_en = 1,
                .dv_flow_en = 1,
+               .log_hp_size = MLX5_ARG_UNSET,
        };
        /* Device specific configuration. */
        switch (pci_dev->id.device_id) {
@@ -3529,6 +3577,10 @@ static const struct rte_pci_id mlx5_pci_id_map[] = {
                RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
                                PCI_DEVICE_ID_MELLANOX_CONNECTX6DXVF)
        },
+       {
+               RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
+                               PCI_DEVICE_ID_MELLANOX_CONNECTX6DXBF)
+       },
        {
                .vendor_id = 0
        }