From patchwork Fri Jan 29 18:07:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lance Richardson X-Patchwork-Id: 87566 X-Patchwork-Delegate: ajit.khaparde@broadcom.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id CDB7EA09E4; Fri, 29 Jan 2021 19:07:18 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1066424013F; Fri, 29 Jan 2021 19:07:18 +0100 (CET) Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) by mails.dpdk.org (Postfix) with ESMTP id BD9B540683 for ; Fri, 29 Jan 2021 19:07:16 +0100 (CET) Received: by mail-pl1-f179.google.com with SMTP id y10so1411279plk.7 for ; Fri, 29 Jan 2021 10:07:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:mime-version; bh=xgpwbIhWxOUHBXF2/mm89oIKaJw9vlFNgmdC4tDzCHU=; b=GlPGydu/9/tI+kbOmyQRLF6JIAz4dWypvzFm2gdaRl4tn1Ot8BaKGnEGbEo3MO17zW ZZhcQeEN33YXfeeL5vNWXqcP6zy3IP+BeOuKAYpek7jlDLcNxmrn39HqNyUYU/kb6Cjo 2VzB2Au/fptL+6DUEJxFvQKDd3FZfsITP8yUI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version; bh=xgpwbIhWxOUHBXF2/mm89oIKaJw9vlFNgmdC4tDzCHU=; b=pBQb49Yvh8GKI/W48qD45MzUCKfrkPk/14uPzl6aDwBp/SICqaQ1STQcY2DG1BMd4C Zi5/JX5KNK32UylQABk9tnIDP/13MN3ndvJAZhu4LerPxnxEN+RcyE6hSLRA7EllevEz qVHz34diD53s94vNiw3qC5bZ/AqZEy5I/91aUUrIkgp9H01bZEuGZUjOgpEpH2JEctx4 44BQXsYzeCtv35vj04xLkPxpZiCLaJpbXohOEwFZ54pq9T6CFP0OrwyipuccpyWwjNkA vlquIDqo+epOOjh6Ls8I2hgVIZtF8320pO9WqPtBndElBT3DpP/IxzgBK1VYpWYbG6HW QR/w== X-Gm-Message-State: AOAM531K8MX7p4yOcWpb0uci9lbmVoenDVC+MeCr3do4tHUEnI2mui0o Yqs02F1hrjXs6k17vY5RzMOg6Q== X-Google-Smtp-Source: ABdhPJzaHkL+OrrddrB3SMDuR5ZUI605S4Werh2/Rywert5IRWmfNBNKYdrDT2iATS9RaOHAYkP1kw== X-Received: by 2002:a17:902:6ac2:b029:de:3560:391e with SMTP id i2-20020a1709026ac2b02900de3560391emr5275744plt.60.1611943635746; Fri, 29 Jan 2021 10:07:15 -0800 (PST) Received: from localhost.localdomain ([192.19.231.250]) by smtp.gmail.com with ESMTPSA id h23sm9695107pgh.64.2021.01.29.10.07.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 29 Jan 2021 10:07:14 -0800 (PST) From: Lance Richardson To: Ajit Khaparde , Somnath Kotur Cc: dev@dpdk.org, stable@dpdk.org Date: Fri, 29 Jan 2021 13:07:09 -0500 Message-Id: <20210129180709.101772-1-lance.richardson@broadcom.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: [dpdk-dev] [PATCH v2] net/bnxt: fix cp ring size calculation X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" The size of the receive completion ring should be recalculated when MTU is increased to a size that requires scattered receive or when LRO is enabled. Move logic for this calculation from the ring configuration path to the device start path. - Made size calculation dependent only on scattered_rx status. - Moved calculation of scattered_rx up in the initialization sequence. - Made LRO offload status part of scattered_rx calculation. When the completion ring size is too small, completion overflows can occur causing the ring to be disabled in hardware. Fixes: 04067844a3e9 ("net/bnxt: reduce CQ queue size without aggregation ring") Cc: stable@dpdk.org Signed-off-by: Lance Richardson Reviewed-by: Ajit Kumar Khaparde --- v2: Fixed conflict resolution mistake (two missing hunks). drivers/net/bnxt/bnxt_ethdev.c | 6 +++++- drivers/net/bnxt/bnxt_ring.c | 22 ++++++++++++++++++++++ drivers/net/bnxt/bnxt_rxr.c | 15 +-------------- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index ec88cb0046..ca779726ec 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -1143,6 +1143,9 @@ static int bnxt_scattered_rx(struct rte_eth_dev *eth_dev) if (eth_dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_SCATTER) return 1; + if (eth_dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO) + return 1; + for (i = 0; i < eth_dev->data->nb_rx_queues; i++) { struct bnxt_rx_queue *rxq = eth_dev->data->rx_queues[i]; @@ -1418,11 +1421,12 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev) bnxt_enable_int(bp); + eth_dev->data->scattered_rx = bnxt_scattered_rx(eth_dev); + rc = bnxt_start_nic(bp); if (rc) goto error; - eth_dev->data->scattered_rx = bnxt_scattered_rx(eth_dev); eth_dev->data->dev_started = 1; bnxt_link_update_op(eth_dev, 1); diff --git a/drivers/net/bnxt/bnxt_ring.c b/drivers/net/bnxt/bnxt_ring.c index 4e513244a6..ba23c1fa03 100644 --- a/drivers/net/bnxt/bnxt_ring.c +++ b/drivers/net/bnxt/bnxt_ring.c @@ -583,6 +583,17 @@ int bnxt_alloc_hwrm_rx_ring(struct bnxt *bp, int queue_index) struct bnxt_rx_ring_info *rxr = rxq->rx_ring; int rc; + /* + * Storage for the cp ring is allocated based on worst-case + * usage, the actual size to be used by hw is computed here. + */ + cp_ring->ring_size = rxr->rx_ring_struct->ring_size * 2; + + if (bp->eth_dev->data->scattered_rx) + cp_ring->ring_size *= AGG_RING_SIZE_FACTOR; + + cp_ring->ring_mask = cp_ring->ring_size - 1; + rc = bnxt_alloc_cmpl_ring(bp, queue_index, cpr); if (rc) goto err_out; @@ -693,6 +704,17 @@ int bnxt_alloc_hwrm_rings(struct bnxt *bp) struct bnxt_ring *cp_ring = cpr->cp_ring_struct; struct bnxt_rx_ring_info *rxr = rxq->rx_ring; + /* + * Storage for the cp ring is allocated based on worst-case + * usage, the actual size to be used by hw is computed here. + */ + cp_ring->ring_size = rxr->rx_ring_struct->ring_size * 2; + + if (bp->eth_dev->data->scattered_rx) + cp_ring->ring_size *= AGG_RING_SIZE_FACTOR; + + cp_ring->ring_mask = cp_ring->ring_size - 1; + if (bnxt_alloc_cmpl_ring(bp, i, cpr)) goto err_out; diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c index 8c2781c968..4674f7cea2 100644 --- a/drivers/net/bnxt/bnxt_rxr.c +++ b/drivers/net/bnxt/bnxt_rxr.c @@ -1116,12 +1116,9 @@ void bnxt_free_rx_rings(struct bnxt *bp) int bnxt_init_rx_ring_struct(struct bnxt_rx_queue *rxq, unsigned int socket_id) { - struct rte_eth_dev *eth_dev = rxq->bp->eth_dev; - struct rte_eth_rxmode *rxmode; struct bnxt_cp_ring_info *cpr; struct bnxt_rx_ring_info *rxr; struct bnxt_ring *ring; - bool use_agg_ring; rxq->rx_buf_size = BNXT_MAX_PKT_LEN + sizeof(struct rte_mbuf); @@ -1164,19 +1161,9 @@ int bnxt_init_rx_ring_struct(struct bnxt_rx_queue *rxq, unsigned int socket_id) return -ENOMEM; cpr->cp_ring_struct = ring; - rxmode = ð_dev->data->dev_conf.rxmode; - use_agg_ring = (rxmode->offloads & DEV_RX_OFFLOAD_SCATTER) || - (rxmode->offloads & DEV_RX_OFFLOAD_TCP_LRO) || - (rxmode->max_rx_pkt_len > - (uint32_t)(rte_pktmbuf_data_room_size(rxq->mb_pool) - - RTE_PKTMBUF_HEADROOM)); - /* Allocate two completion slots per entry in desc ring. */ ring->ring_size = rxr->rx_ring_struct->ring_size * 2; - - /* Allocate additional slots if aggregation ring is in use. */ - if (use_agg_ring) - ring->ring_size *= AGG_RING_SIZE_FACTOR; + ring->ring_size *= AGG_RING_SIZE_FACTOR; ring->ring_size = rte_align32pow2(ring->ring_size); ring->ring_mask = ring->ring_size - 1;