From patchwork Mon Jul 22 14:52:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matan Azrad X-Patchwork-Id: 56914 X-Patchwork-Delegate: rasland@nvidia.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6B3AB1BF26; Mon, 22 Jul 2019 16:53:54 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 65FF91BE53 for ; Mon, 22 Jul 2019 16:52:35 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE2 (envelope-from matan@mellanox.com) with ESMTPS (AES256-SHA encrypted); 22 Jul 2019 17:52:30 +0300 Received: from pegasus07.mtr.labs.mlnx (pegasus07.mtr.labs.mlnx [10.210.16.112]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id x6MEqRVu012492; Mon, 22 Jul 2019 17:52:29 +0300 From: Matan Azrad To: Ferruh Yigit , Shahaf Shuler , Yongseok Koh , Viacheslav Ovsiienko Cc: dev@dpdk.org, Dekel Peled Date: Mon, 22 Jul 2019 14:52:24 +0000 Message-Id: <1563807145-16577-28-git-send-email-matan@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1563807145-16577-1-git-send-email-matan@mellanox.com> References: <1563786795-14027-1-git-send-email-matan@mellanox.com> <1563807145-16577-1-git-send-email-matan@mellanox.com> Subject: [dpdk-dev] [PATCH v2 27/28] net/mlx5: adjust the maximum LRO message size X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" LRO message is contained in the MPRQ strides. While the LRO message size cannot be bigger than 65280 according to the PRM, the strides which contain it may be bigger than the maximum buffer size allowed in dpdk mbuf - 0xFFFF. Adjust the maximum LRO message size to avoid buffer length overflow. Signed-off-by: Matan Azrad Acked-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5.h | 1 + drivers/net/mlx5/mlx5_rxq.c | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index b98c406..6cb8858 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -625,6 +625,7 @@ struct mlx5_priv { struct ibv_flow_action *verbs_action; /**< Verbs modify header action object. */ uint8_t ft_type; /**< Flow table type, Rx or Tx. */ + uint8_t max_lro_msg_size; /* Tags resources cache. */ uint32_t link_speed_capa; /* Link speed capabilities. */ struct mlx5_xstats_ctrl xstats_ctrl; /* Extended stats control. */ diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c index edfcdd1..b225055 100644 --- a/drivers/net/mlx5/mlx5_rxq.c +++ b/drivers/net/mlx5/mlx5_rxq.c @@ -1541,6 +1541,39 @@ struct mlx5_rxq_obj * } /** + * Adjust the maximum LRO massage size. + * LRO massage is contained in the MPRQ strides. + * While the LRO massage size cannot be bigger than 65280 according to the + * PRM, the strides which contain it may be bigger. + * Adjust the maximum LRO massage size to avoid the above option. + * + * @param dev + * Pointer to Ethernet device. + * @param strd_n + * Number of strides per WQE.. + * @param strd_sz + * The stride size. + */ +static void +mlx5_max_lro_msg_size_adjust(struct rte_eth_dev *dev, uint32_t strd_n, + uint32_t strd_sz) +{ + struct mlx5_priv *priv = dev->data->dev_private; + uint32_t max_buf_len = strd_sz * strd_n; + + if (max_buf_len > (uint64_t)UINT16_MAX) + max_buf_len = RTE_ALIGN_FLOOR((uint32_t)UINT16_MAX, strd_sz); + max_buf_len /= 256; + max_buf_len = RTE_MIN(max_buf_len, (uint32_t)UINT8_MAX); + assert(max_buf_len); + if (priv->max_lro_msg_size) + priv->max_lro_msg_size = + RTE_MIN((uint32_t)priv->max_lro_msg_size, max_buf_len); + else + priv->max_lro_msg_size = max_buf_len; +} + +/** * Create a DPDK Rx queue. * * @param dev @@ -1623,6 +1656,8 @@ struct mlx5_rxq_ctrl * tmpl->rxq.strd_headroom_en = strd_headroom_en; tmpl->rxq.mprq_max_memcpy_len = RTE_MIN(mb_len - RTE_PKTMBUF_HEADROOM, config->mprq.max_memcpy_len); + mlx5_max_lro_msg_size_adjust(dev, (1 << tmpl->rxq.strd_num_n), + (1 << tmpl->rxq.strd_sz_n)); DRV_LOG(DEBUG, "port %u Rx queue %u: Multi-Packet RQ is enabled" " strd_num_n = %u, strd_sz_n = %u", @@ -2165,7 +2200,7 @@ struct mlx5_hrxq * if (lro) { tir_attr.lro_timeout_period_usecs = priv->config.lro.timeout; - tir_attr.lro_max_msg_sz = 0xff; + tir_attr.lro_max_msg_sz = priv->max_lro_msg_size; tir_attr.lro_enable_mask = lro; } tir = mlx5_devx_cmd_create_tir(priv->sh->ctx, &tir_attr);