net/mlx5: add parameters to enable/disable vector datapath
authorNelio Laranjeiro <nelio.laranjeiro@6wind.com>
Wed, 2 Aug 2017 15:32:56 +0000 (17:32 +0200)
committerThomas Monjalon <thomas@monjalon.net>
Thu, 3 Aug 2017 21:34:40 +0000 (23:34 +0200)
Vector code is very young and can present some issues for users, to avoid
them to modify the selections function by commenting the code and recompile
the PMD, new devices parameters are added to deactivate the Tx and/or Rx
vector code.
By using such device parameters, the user will be able to fall back to
regular burst functions.

Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
Acked-by: Yongseok Koh <yskoh@mellanox.com>
doc/guides/nics/mlx5.rst
drivers/net/mlx5/mlx5.c
drivers/net/mlx5/mlx5.h
drivers/net/mlx5/mlx5_rxtx_vec_sse.c

index db15118..f4cb18b 100644 (file)
@@ -254,6 +254,20 @@ Run-time configuration
   When hardware TSO is enabled, packets marked with TCP segmentation
   offload will be divided into segments by the hardware. Disabled by default.
 
+- ``tx_vec_en`` parameter [int]
+
+  A nonzero value enables Tx vector on ConnectX-5 only NIC if the number of
+  global Tx queues on the port is lesser than MLX5_VPMD_MIN_TXQS.
+
+  Enabled by default on ConnectX-5.
+
+- ``rx_vec_en`` parameter [int]
+
+  A nonzero value enables Rx vector if the port is not configured in
+  multi-segment otherwise this parameter is ignored.
+
+  Enabled by default.
+
 Prerequisites
 -------------
 
index 757c910..b7e5046 100644 (file)
 /* Device parameter to enable hardware TSO offload. */
 #define MLX5_TSO "tso"
 
+/* Device parameter to enable hardware Tx vector. */
+#define MLX5_TX_VEC_EN "tx_vec_en"
+
+/* Device parameter to enable hardware Rx vector. */
+#define MLX5_RX_VEC_EN "rx_vec_en"
+
 /* Default PMD specific parameter value. */
 #define MLX5_ARG_UNSET (-1)
 
@@ -105,6 +111,8 @@ struct mlx5_args {
        int mpw_hdr_dseg;
        int inline_max_packet_sz;
        int tso;
+       int tx_vec_en;
+       int rx_vec_en;
 };
 /**
  * Retrieve integer value from environment variable.
@@ -324,6 +332,10 @@ mlx5_args_check(const char *key, const char *val, void *opaque)
                args->inline_max_packet_sz = tmp;
        } else if (strcmp(MLX5_TSO, key) == 0) {
                args->tso = !!tmp;
+       } else if (strcmp(MLX5_TX_VEC_EN, key) == 0) {
+               args->tx_vec_en = !!tmp;
+       } else if (strcmp(MLX5_RX_VEC_EN, key) == 0) {
+               args->rx_vec_en = !!tmp;
        } else {
                WARN("%s: unknown parameter", key);
                return -EINVAL;
@@ -353,6 +365,8 @@ mlx5_args(struct mlx5_args *args, struct rte_devargs *devargs)
                MLX5_TXQ_MPW_HDR_DSEG_EN,
                MLX5_TXQ_MAX_INLINE_LEN,
                MLX5_TSO,
+               MLX5_TX_VEC_EN,
+               MLX5_RX_VEC_EN,
                NULL,
        };
        struct rte_kvargs *kvlist;
@@ -408,6 +422,10 @@ mlx5_args_assign(struct priv *priv, struct mlx5_args *args)
                priv->inline_max_packet_sz = args->inline_max_packet_sz;
        if (args->tso != MLX5_ARG_UNSET)
                priv->tso = args->tso;
+       if (args->tx_vec_en != MLX5_ARG_UNSET)
+               priv->tx_vec_en = args->tx_vec_en;
+       if (args->rx_vec_en != MLX5_ARG_UNSET)
+               priv->rx_vec_en = args->rx_vec_en;
 }
 
 /**
@@ -553,6 +571,8 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                        .mpw_hdr_dseg = MLX5_ARG_UNSET,
                        .inline_max_packet_sz = MLX5_ARG_UNSET,
                        .tso = MLX5_ARG_UNSET,
+                       .tx_vec_en = MLX5_ARG_UNSET,
+                       .rx_vec_en = MLX5_ARG_UNSET,
                };
 
                exp_device_attr.comp_mask =
@@ -615,6 +635,9 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                priv->mps = mps; /* Enable MPW by default if supported. */
                priv->cqe_comp = 1; /* Enable compression by default. */
                priv->tunnel_en = tunnel_en;
+               /* Enable vector by default if supported. */
+               priv->tx_vec_en = 1;
+               priv->rx_vec_en = 1;
                err = mlx5_args(&args, pci_dev->device.devargs);
                if (err) {
                        ERROR("failed to process device arguments: %s",
index f16f778..43c5384 100644 (file)
@@ -131,6 +131,8 @@ struct priv {
        unsigned int tso:1; /* Whether TSO is supported. */
        unsigned int tunnel_en:1;
        unsigned int isolated:1; /* Whether isolated mode is enabled. */
+       unsigned int tx_vec_en:1; /* Whether Tx vector is enabled. */
+       unsigned int rx_vec_en:1; /* Whether Rx vector is enabled. */
        /* Whether Tx offloads for tunneled packets are supported. */
        unsigned int max_tso_payload_sz; /* Maximum TCP payload for TSO. */
        unsigned int txq_inline; /* Maximum packet size for inlining. */
index a5e1868..8560f74 100644 (file)
@@ -1323,7 +1323,8 @@ priv_check_raw_vec_tx_support(struct priv *priv)
 int __attribute__((cold))
 priv_check_vec_tx_support(struct priv *priv)
 {
-       if (priv->txqs_n > MLX5_VPMD_MIN_TXQS ||
+       if (!priv->tx_vec_en ||
+           priv->txqs_n > MLX5_VPMD_MIN_TXQS ||
            priv->mps != MLX5_MPW_ENHANCED ||
            priv->tso)
                return -ENOTSUP;
@@ -1342,7 +1343,9 @@ priv_check_vec_tx_support(struct priv *priv)
 int __attribute__((cold))
 rxq_check_vec_support(struct rxq *rxq)
 {
-       if (rxq->sges_n != 0)
+       struct rxq_ctrl *ctrl = container_of(rxq, struct rxq_ctrl, rxq);
+
+       if (!ctrl->priv->rx_vec_en || rxq->sges_n != 0)
                return -ENOTSUP;
        return 1;
 }
@@ -1361,6 +1364,8 @@ priv_check_vec_rx_support(struct priv *priv)
 {
        uint16_t i;
 
+       if (!priv->rx_vec_en)
+               return -ENOTSUP;
        /* All the configured queues should support. */
        for (i = 0; i < priv->rxqs_n; ++i) {
                struct rxq *rxq = (*priv->rxqs)[i];