From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by dpdk.space (Postfix) with ESMTP id B33C9A0096 for ; Wed, 8 May 2019 18:03:20 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A9441DE3; Wed, 8 May 2019 18:03:20 +0200 (CEST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id AFB47DE3 for ; Wed, 8 May 2019 18:03:19 +0200 (CEST) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1C64C821EF; Wed, 8 May 2019 16:03:19 +0000 (UTC) Received: from rh.redhat.com (ovpn-117-210.ams2.redhat.com [10.36.117.210]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0865B60C82; Wed, 8 May 2019 16:03:17 +0000 (UTC) From: Kevin Traynor To: Yongseok Koh Cc: Shahaf Shuler , dpdk stable Date: Wed, 8 May 2019 17:02:25 +0100 Message-Id: <20190508160233.2648-28-ktraynor@redhat.com> In-Reply-To: <20190508160233.2648-1-ktraynor@redhat.com> References: <20190508160233.2648-1-ktraynor@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Wed, 08 May 2019 16:03:19 +0000 (UTC) Subject: [dpdk-stable] patch 'net/mlx5: check Tx queue size overflow' has been queued to LTS release 18.11.2 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" Hi, FYI, your patch has been queued to LTS release 18.11.2 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 05/14/19. So please shout if anyone has objections. Also note that after the patch there's a diff of the upstream commit vs the patch applied to the branch. This will indicate if there was any rebasing needed to apply to the stable branch. If there were code changes for rebasing (ie: not only metadata diffs), please double check that the rebase was correctly done. Queued patches are on a temporary branch at: https://github.com/kevintraynor/dpdk-stable-queue This queued commit can be viewed at: https://github.com/kevintraynor/dpdk-stable-queue/commit/3f0d9b1fd20d59d5e7df9d713c513d4d7ac3b577 Thanks. Kevin Traynor --- >From 3f0d9b1fd20d59d5e7df9d713c513d4d7ac3b577 Mon Sep 17 00:00:00 2001 From: Yongseok Koh Date: Tue, 30 Apr 2019 18:01:43 -0700 Subject: [PATCH] net/mlx5: check Tx queue size overflow [ upstream commit f6d9ab4e769f0f95ecac1b418106e9f8137ca60c ] 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. Signed-off-by: Yongseok Koh Acked-by: Shahaf Shuler --- 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 f69520ba8..c5a3d1b4c 100644 --- a/drivers/net/mlx5/mlx5_txq.c +++ b/drivers/net/mlx5/mlx5_txq.c @@ -636,4 +636,25 @@ 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. @@ -781,8 +802,14 @@ mlx5_txq_new(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, tmpl->idx = idx; txq_set_params(tmpl); - DRV_LOG(DEBUG, "port %u priv->device_attr.max_qp_wr is %d", - dev->data->port_id, priv->device_attr.orig_attr.max_qp_wr); - DRV_LOG(DEBUG, "port %u priv->device_attr.max_sge is %d", - dev->data->port_id, priv->device_attr.orig_attr.max_sge); + if (txq_calc_wqebb_cnt(tmpl) > + priv->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->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); -- 2.20.1 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2019-05-08 16:33:58.896521685 +0100 +++ 0028-net-mlx5-check-Tx-queue-size-overflow.patch 2019-05-08 16:33:57.442577205 +0100 @@ -1 +1 @@ -From f6d9ab4e769f0f95ecac1b418106e9f8137ca60c Mon Sep 17 00:00:00 2001 +From 3f0d9b1fd20d59d5e7df9d713c513d4d7ac3b577 Mon Sep 17 00:00:00 2001 @@ -5,0 +6,2 @@ +[ upstream commit f6d9ab4e769f0f95ecac1b418106e9f8137ca60c ] + @@ -11,2 +12,0 @@ -Cc: stable@dpdk.org - @@ -20 +20 @@ -index 4d55fd413..b281c4502 100644 +index f69520ba8..c5a3d1b4c 100644 @@ -23 +23 @@ -@@ -679,4 +679,25 @@ mlx5_txq_ibv_verify(struct rte_eth_dev *dev) +@@ -636,4 +636,25 @@ mlx5_txq_ibv_verify(struct rte_eth_dev *dev) @@ -49,2 +49,2 @@ -@@ -825,8 +846,14 @@ mlx5_txq_new(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, - tmpl->txq.idx = idx; +@@ -781,8 +802,14 @@ mlx5_txq_new(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, + tmpl->idx = idx; @@ -52,4 +52,4 @@ -- 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); +- DRV_LOG(DEBUG, "port %u priv->device_attr.max_qp_wr is %d", +- dev->data->port_id, priv->device_attr.orig_attr.max_qp_wr); +- DRV_LOG(DEBUG, "port %u priv->device_attr.max_sge is %d", +- dev->data->port_id, priv->device_attr.orig_attr.max_sge); @@ -57 +57 @@ -+ priv->sh->device_attr.orig_attr.max_qp_wr) { ++ priv->device_attr.orig_attr.max_qp_wr) { @@ -62 +62 @@ -+ priv->sh->device_attr.orig_attr.max_qp_wr); ++ priv->device_attr.orig_attr.max_qp_wr);