[dpdk-dev,2/2] net/mlx5: add Rx and Tx tuning parameters

Message ID 20180429180308.85361-2-shahafs@mellanox.com (mailing list archive)
State Superseded, archived
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Shahaf Shuler April 29, 2018, 6:03 p.m. UTC
  A new ethdev API was exposed by
commit 3be82f5cc5e3 ("ethdev: support PMD-tuned Tx/Rx parameters")

Enabling the PMD to provide default parameters in case no strict request
from application in order to improve the out of the box experience.

While the current API lacks the means for the PMD to provide the best
possible value, providing the best default the PMD can guess.
The values are based on Mellanox performance report and depends on the
underlying NIC capabilities.

Cc: erezsc@mellanox.com
Cc: amira@mellanox.com
Cc: olgas@mellanox.com

Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
---
 drivers/net/mlx5/mlx5_ethdev.c | 51 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)
  

Comments

Nélio Laranjeiro April 30, 2018, 7:07 a.m. UTC | #1
On Sun, Apr 29, 2018 at 09:03:08PM +0300, Shahaf Shuler wrote:
> A new ethdev API was exposed by
> commit 3be82f5cc5e3 ("ethdev: support PMD-tuned Tx/Rx parameters")
> 
> Enabling the PMD to provide default parameters in case no strict request
> from application in order to improve the out of the box experience.
> 
> While the current API lacks the means for the PMD to provide the best
> possible value, providing the best default the PMD can guess.
> The values are based on Mellanox performance report and depends on the
> underlying NIC capabilities.
> 
> Cc: erezsc@mellanox.com
> Cc: amira@mellanox.com
> Cc: olgas@mellanox.com
> 
> Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
> ---
>  drivers/net/mlx5/mlx5_ethdev.c | 51 ++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 51 insertions(+)
> 
> diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
> index 588d4ba627..78354922b0 100644
> --- a/drivers/net/mlx5/mlx5_ethdev.c
> +++ b/drivers/net/mlx5/mlx5_ethdev.c
> @@ -417,6 +417,56 @@ mlx5_dev_configure(struct rte_eth_dev *dev)
>  }
>  
>  /**
> + * Sets default tuning parameters.
> + *
> + * @param dev
> + *   Pointer to Ethernet device.
> + * @param[out] info
> + *   Info structure output buffer.
> + */
> +static void
> +mlx5_set_default_params(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
> +{
> +	struct priv *priv = dev->data->dev_private;
> +
> +	if (priv->link_speed_capa & ETH_LINK_SPEED_100G) {
> +		if (dev->data->nb_rx_queues <= 2 &&
> +		    dev->data->nb_tx_queues <= 2) {
> +			/* Minimum CPU utilization. */
> +			info->default_rxportconf.ring_size = 256;
> +			info->default_txportconf.ring_size = 256;
> +			/* Don't care as queue num is set. */
> +			info->default_rxportconf.nb_queues = 0;
> +			info->default_txportconf.nb_queues = 0;
> +		} else {
> +			/* Max Throughput. */
> +			info->default_rxportconf.ring_size = 2048;
> +			info->default_txportconf.ring_size = 2048;
> +			info->default_rxportconf.nb_queues = 16;
> +			info->default_txportconf.nb_queues = 16;
> +		}
> +	} else {
> +		if (dev->data->nb_rx_queues <= 2 &&
> +		    dev->data->nb_tx_queues <= 2) {
> +			/* Minimum CPU utilization. */
> +			info->default_rxportconf.ring_size = 256;
> +			info->default_txportconf.ring_size = 256;
> +			/* Don't care as queue num is set. */
> +			info->default_rxportconf.nb_queues = 0;
> +			info->default_txportconf.nb_queues = 0;
> +		} else {
> +			/* Max Throughput. */
> +			info->default_rxportconf.ring_size = 4096;
> +			info->default_txportconf.ring_size = 4096;
> +			info->default_rxportconf.nb_queues = 8;
> +			info->default_txportconf.nb_queues = 8;
> +		}
> +	}
> +	info->default_rxportconf.burst_size = 64;
> +	info->default_txportconf.burst_size = 64;

This can be fully re-written to simplify and ease the maintenance,
default values i.e. "Minimum CPU utilization" are duplicated, this can
be used as default values and just tweak in case the amount of queues
are different from 2 according to the link speed. 

> +}
> +
> +/**
>   * DPDK callback to get information about the device.
>   *
>   * @param dev
> @@ -458,6 +508,7 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
>  	info->hash_key_size = rss_hash_default_key_len;
>  	info->speed_capa = priv->link_speed_capa;
>  	info->flow_type_rss_offloads = ~MLX5_RSS_HF_MASK;
> +	mlx5_set_default_params(dev, info);
>  }
>  
>  /**
> -- 
> 2.12.0

Thanks,
  

Patch

diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
index 588d4ba627..78354922b0 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -417,6 +417,56 @@  mlx5_dev_configure(struct rte_eth_dev *dev)
 }
 
 /**
+ * Sets default tuning parameters.
+ *
+ * @param dev
+ *   Pointer to Ethernet device.
+ * @param[out] info
+ *   Info structure output buffer.
+ */
+static void
+mlx5_set_default_params(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
+{
+	struct priv *priv = dev->data->dev_private;
+
+	if (priv->link_speed_capa & ETH_LINK_SPEED_100G) {
+		if (dev->data->nb_rx_queues <= 2 &&
+		    dev->data->nb_tx_queues <= 2) {
+			/* Minimum CPU utilization. */
+			info->default_rxportconf.ring_size = 256;
+			info->default_txportconf.ring_size = 256;
+			/* Don't care as queue num is set. */
+			info->default_rxportconf.nb_queues = 0;
+			info->default_txportconf.nb_queues = 0;
+		} else {
+			/* Max Throughput. */
+			info->default_rxportconf.ring_size = 2048;
+			info->default_txportconf.ring_size = 2048;
+			info->default_rxportconf.nb_queues = 16;
+			info->default_txportconf.nb_queues = 16;
+		}
+	} else {
+		if (dev->data->nb_rx_queues <= 2 &&
+		    dev->data->nb_tx_queues <= 2) {
+			/* Minimum CPU utilization. */
+			info->default_rxportconf.ring_size = 256;
+			info->default_txportconf.ring_size = 256;
+			/* Don't care as queue num is set. */
+			info->default_rxportconf.nb_queues = 0;
+			info->default_txportconf.nb_queues = 0;
+		} else {
+			/* Max Throughput. */
+			info->default_rxportconf.ring_size = 4096;
+			info->default_txportconf.ring_size = 4096;
+			info->default_rxportconf.nb_queues = 8;
+			info->default_txportconf.nb_queues = 8;
+		}
+	}
+	info->default_rxportconf.burst_size = 64;
+	info->default_txportconf.burst_size = 64;
+}
+
+/**
  * DPDK callback to get information about the device.
  *
  * @param dev
@@ -458,6 +508,7 @@  mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
 	info->hash_key_size = rss_hash_default_key_len;
 	info->speed_capa = priv->link_speed_capa;
 	info->flow_type_rss_offloads = ~MLX5_RSS_HF_MASK;
+	mlx5_set_default_params(dev, info);
 }
 
 /**