From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 2622EA09E4 for ; 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 D98E74067D; Fri, 29 Jan 2021 19:07:17 +0100 (CET) Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) by mails.dpdk.org (Postfix) with ESMTP id BB1AB4067D for ; Fri, 29 Jan 2021 19:07:16 +0100 (CET) Received: by mail-pl1-f180.google.com with SMTP id 8so329968plc.10 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=XNJjFaTevWxnZrNmeYGD+ebb4JFD/nSbpK+d0WYWZRs=; b=EKv4GJRdR1OG6AW8XNu4El29p35Ijv/yg+ddZrbVm0l+YkoKET1B35VA8U0iJJdiYe mTSiry8jp76nZrbGaV/kRgCOOLl2MfP6aNb3k6f/ao1pQnqPYzpWBpPLYfZlQhpfat2X BxpGk+EQUkHnmgkw9TfeJfBCvYxTr61/6Bpxg= 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=XNJjFaTevWxnZrNmeYGD+ebb4JFD/nSbpK+d0WYWZRs=; b=YLkkljvJS0/aMElk1mEXxMCVMjwpMsk/i0L3RhN0h35iBXWitneKAGulhTb4bTrxjl WrQSCzQPRP9pSghhAGcnIuN90Diy/3XTDaVoXrRYkC8p/lUr9Vc/DG2lEIXesuysfwiI dEVWs5sD60XGeaD/saLHx1rY5jDzrzmXwd9cp0C0QXrzn/pSy8tZoKxU8Ue6F/7LESu5 dpLw3nTEtGipsEZg/ccxa8h1A3wzUGhdwIWortg1ouZYCTgfPtfx1TyG8c8TjKz846gl CkXTLtv1stdM31ErJ7XvQNbsdBlFsMhbV7UunMuONeA4E35arm/PwkpQ2qO3hL4baMRK BiEw== X-Gm-Message-State: AOAM5339TFvdwXtZLX3M3+X9ZTYoPnOQKEEIHgbG+QEL8TDyEm+1Vjwp Qy5qgXHEvY89Q0cz8Kbs2L60YA== 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 Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="000000000000d5aa6905ba0ddfec" X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: [dpdk-stable] [PATCH v2] net/bnxt: fix cp ring size calculation X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 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" --000000000000d5aa6905ba0ddfec Content-Transfer-Encoding: 8bit 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; -- 2.25.1 --000000000000d5aa6905ba0ddfec--