[v2] net/mlx5: check Tx queue size overflow

Message ID 20190501010143.611-1-yskoh@mellanox.com (mailing list archive)
State Accepted, archived
Delegated to: Shahaf Shuler
Headers
Series [v2] net/mlx5: check Tx queue size overflow |

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation success Compilation OK
ci/mellanox-Performance-Testing success Performance Testing PASS
ci/intel-Performance-Testing success Performance Testing PASS

Commit Message

Yongseok Koh May 1, 2019, 1:01 a.m. UTC
  If Tx packet inlining is enabled, rdma-core library should allocate large
Tx WQ enough to support it. It is better for PMD to calculate the size of
WQ based on the parameters and return error with appropriate message if it
exceeds the device capability.

Cc:stable@dpdk.org

Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
---
 drivers/net/mlx5/mlx5_txq.c | 35 +++++++++++++++++++++++++++++++----
 1 file changed, 31 insertions(+), 4 deletions(-)
  

Comments

Yongseok Koh May 1, 2019, 1:15 a.m. UTC | #1
> On Apr 30, 2019, at 6:01 PM, Yongseok Koh <yskoh@mellanox.com> wrote:
> 
> If Tx packet inlining is enabled, rdma-core library should allocate large
> Tx WQ enough to support it. It is better for PMD to calculate the size of
> WQ based on the parameters and return error with appropriate message if it
> exceeds the device capability.
> 
> Cc:stable@dpdk.org

Shahaf,
There's a checkpatch warning. Please put a space after ':' if you merge it.

Thanks,
Yongseok

> 
> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> ---
> drivers/net/mlx5/mlx5_txq.c | 35 +++++++++++++++++++++++++++++++----
> 1 file changed, 31 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/mlx5/mlx5_txq.c b/drivers/net/mlx5/mlx5_txq.c
> index 4d55fd413c..b281c45027 100644
> --- a/drivers/net/mlx5/mlx5_txq.c
> +++ b/drivers/net/mlx5/mlx5_txq.c
> @@ -679,6 +679,27 @@ mlx5_txq_ibv_verify(struct rte_eth_dev *dev)
> }
> 
> /**
> + * Calcuate the total number of WQEBB for Tx queue.
> + *
> + * Simplified version of calc_sq_size() in rdma-core.
> + *
> + * @param txq_ctrl
> + *   Pointer to Tx queue control structure.
> + *
> + * @return
> + *   The number of WQEBB.
> + */
> +static int
> +txq_calc_wqebb_cnt(struct mlx5_txq_ctrl *txq_ctrl)
> +{
> +	unsigned int wqe_size;
> +	const unsigned int desc = 1 << txq_ctrl->txq.elts_n;
> +
> +	wqe_size = MLX5_WQE_SIZE + txq_ctrl->max_inline_data;
> +	return rte_align32pow2(wqe_size * desc) / MLX5_WQE_SIZE;
> +}
> +
> +/**
>  * Set Tx queue parameters from device configuration.
>  *
>  * @param txq_ctrl
> @@ -824,10 +845,16 @@ mlx5_txq_new(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
> 	tmpl->txq.port_id = dev->data->port_id;
> 	tmpl->txq.idx = idx;
> 	txq_set_params(tmpl);
> -	DRV_LOG(DEBUG, "port %u device_attr.max_qp_wr is %d",
> -		dev->data->port_id, priv->sh->device_attr.orig_attr.max_qp_wr);
> -	DRV_LOG(DEBUG, "port %u device_attr.max_sge is %d",
> -		dev->data->port_id, priv->sh->device_attr.orig_attr.max_sge);
> +	if (txq_calc_wqebb_cnt(tmpl) >
> +	    priv->sh->device_attr.orig_attr.max_qp_wr) {
> +		DRV_LOG(ERR,
> +			"port %u Tx WQEBB count (%d) exceeds the limit (%d),"
> +			" try smaller queue size",
> +			dev->data->port_id, txq_calc_wqebb_cnt(tmpl),
> +			priv->sh->device_attr.orig_attr.max_qp_wr);
> +		rte_errno = ENOMEM;
> +		goto error;
> +	}
> 	tmpl->txq.elts =
> 		(struct rte_mbuf *(*)[1 << tmpl->txq.elts_n])(tmpl + 1);
> 	rte_atomic32_inc(&tmpl->refcnt);
> -- 
> 2.11.0
>
  
Shahaf Shuler May 1, 2019, 6:10 a.m. UTC | #2
Wednesday, May 1, 2019 4:16 AM, Yongseok Koh:
> Subject: Re: [PATCH v2] net/mlx5: check Tx queue size overflow
> 
> 
> > On Apr 30, 2019, at 6:01 PM, Yongseok Koh <yskoh@mellanox.com> wrote:
> >
> > If Tx packet inlining is enabled, rdma-core library should allocate
> > large Tx WQ enough to support it. It is better for PMD to calculate
> > the size of WQ based on the parameters and return error with
> > appropriate message if it exceeds the device capability.
> >
> > Cc:stable@dpdk.org
> 
> Shahaf,
> There's a checkpatch warning. Please put a space after ':' if you merge it.

Changed and applied to next-net-mlx, thanks.
  

Patch

diff --git a/drivers/net/mlx5/mlx5_txq.c b/drivers/net/mlx5/mlx5_txq.c
index 4d55fd413c..b281c45027 100644
--- a/drivers/net/mlx5/mlx5_txq.c
+++ b/drivers/net/mlx5/mlx5_txq.c
@@ -679,6 +679,27 @@  mlx5_txq_ibv_verify(struct rte_eth_dev *dev)
 }
 
 /**
+ * Calcuate the total number of WQEBB for Tx queue.
+ *
+ * Simplified version of calc_sq_size() in rdma-core.
+ *
+ * @param txq_ctrl
+ *   Pointer to Tx queue control structure.
+ *
+ * @return
+ *   The number of WQEBB.
+ */
+static int
+txq_calc_wqebb_cnt(struct mlx5_txq_ctrl *txq_ctrl)
+{
+	unsigned int wqe_size;
+	const unsigned int desc = 1 << txq_ctrl->txq.elts_n;
+
+	wqe_size = MLX5_WQE_SIZE + txq_ctrl->max_inline_data;
+	return rte_align32pow2(wqe_size * desc) / MLX5_WQE_SIZE;
+}
+
+/**
  * Set Tx queue parameters from device configuration.
  *
  * @param txq_ctrl
@@ -824,10 +845,16 @@  mlx5_txq_new(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
 	tmpl->txq.port_id = dev->data->port_id;
 	tmpl->txq.idx = idx;
 	txq_set_params(tmpl);
-	DRV_LOG(DEBUG, "port %u device_attr.max_qp_wr is %d",
-		dev->data->port_id, priv->sh->device_attr.orig_attr.max_qp_wr);
-	DRV_LOG(DEBUG, "port %u device_attr.max_sge is %d",
-		dev->data->port_id, priv->sh->device_attr.orig_attr.max_sge);
+	if (txq_calc_wqebb_cnt(tmpl) >
+	    priv->sh->device_attr.orig_attr.max_qp_wr) {
+		DRV_LOG(ERR,
+			"port %u Tx WQEBB count (%d) exceeds the limit (%d),"
+			" try smaller queue size",
+			dev->data->port_id, txq_calc_wqebb_cnt(tmpl),
+			priv->sh->device_attr.orig_attr.max_qp_wr);
+		rte_errno = ENOMEM;
+		goto error;
+	}
 	tmpl->txq.elts =
 		(struct rte_mbuf *(*)[1 << tmpl->txq.elts_n])(tmpl + 1);
 	rte_atomic32_inc(&tmpl->refcnt);