From patchwork Thu Feb 18 18:19:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lance Richardson X-Patchwork-Id: 87990 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 C6E32A054A; Thu, 18 Feb 2021 19:19:33 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 40CE240040; Thu, 18 Feb 2021 19:19:33 +0100 (CET) Received: from mail-pj1-f48.google.com (mail-pj1-f48.google.com [209.85.216.48]) by mails.dpdk.org (Postfix) with ESMTP id 0346D4003D for ; Thu, 18 Feb 2021 19:19:31 +0100 (CET) Received: by mail-pj1-f48.google.com with SMTP id lw17so3206025pjb.0 for ; Thu, 18 Feb 2021 10:19:31 -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=gKgQCITVkHCosiDHy7a2bwseF+kLwa7Dr0PL2gQSWi0=; b=PzPIfVKnfaqlkntrTgt2SPY2ulBoCXS0FqcuqsJfBEj1Cf7Y9PDKBlYWNXAOayYIUB Z4ESSV1rgGuQ9t42TItTVF2zo1yf5s6i2OFgu/hmxFYDSF2f/+dgsreQ0ysqYFkVXXmn 5yPAALDk+Bzw1BhMKxIotL7PtAnnnZhdOYa4U= 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=gKgQCITVkHCosiDHy7a2bwseF+kLwa7Dr0PL2gQSWi0=; b=eGQgkHYdt7yEwZ8f0W5IW0ml9yPlu2ercdjfNwMUQbZEPxZneahuRv9bcHhTwB5fH1 H3jsi/7vLxA+WCqY8NLnWymn3TXO5UfdPeBOyhidi1K7soilDjs1UA+TYWzUrUxsBNwr 4Tkji9xVBywk3fKDwpYRdAhcdY9XQNHxCSlOAvmMncE6X5Wgm2PCTKRsLi1l5Dv32ACm LAmsAScfukZ3WGnEhlixyxxrvqrcTyMCJt20KqA+kf6pIiB+mi1PPOkO1rL/L+BZlaux htFZDi3TQLdjRXXndNjW1HOYvyZz5YqErlLP+jLj580LffVJZBg3fsxTRT2ELpoCfkkv 7p2A== X-Gm-Message-State: AOAM5329TZ+AJi5soC9H79jh+KhecxTW3xsaGzLyo5fD0C1s5aAJzPFm pAHyPUMaoaCJkXdYM9O6s/bFFA== X-Google-Smtp-Source: ABdhPJwWN8xWaypnEahG910VHQCWHUTSnXrSmrz3pZJvUSwPe6Muj2kSIoWQyj6VFfBk4ADPqSFjUA== X-Received: by 2002:a17:90b:180d:: with SMTP id lw13mr5075695pjb.94.1613672370918; Thu, 18 Feb 2021 10:19:30 -0800 (PST) Received: from localhost.localdomain ([192.19.231.250]) by smtp.gmail.com with ESMTPSA id l21sm5908256pjy.31.2021.02.18.10.19.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Feb 2021 10:19:30 -0800 (PST) From: Lance Richardson To: Ajit Khaparde , Somnath Kotur , Rahul Gupta Cc: dev@dpdk.org, stable@dpdk.org Date: Thu, 18 Feb 2021 13:19:20 -0500 Message-Id: <20210218181920.223463-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] net/bnxt: fix Rx queue count implementation 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" bnxt_rx_queue_count_op() incorrectly returns the number of filled but unprocessed completion queue entries instead of the number of filled but unprocessed received packet completions. Fix by properly accounting for the number of completion ring entries used by the various received packet completion types. Fixes: 34c0ba839bae ("net/bnxt: fix Rx queue count") Signed-off-by: Lance Richardson Reviewed-by: Somnath Kotur Cc: stable@dpdk.org --- drivers/net/bnxt/bnxt_cpr.h | 4 ++++ drivers/net/bnxt/bnxt_ethdev.c | 38 +++++++++++++++++++++++++++++----- drivers/net/bnxt/bnxt_rxr.c | 3 +-- drivers/net/bnxt/bnxt_rxr.h | 4 ++++ 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/drivers/net/bnxt/bnxt_cpr.h b/drivers/net/bnxt/bnxt_cpr.h index d7e0d4621a..28c0a9049c 100644 --- a/drivers/net/bnxt/bnxt_cpr.h +++ b/drivers/net/bnxt/bnxt_cpr.h @@ -26,6 +26,10 @@ struct bnxt_db_info; #define CMP_TYPE(cmp) \ (((struct cmpl_base *)cmp)->type & CMPL_BASE_TYPE_MASK) +/* Get completion length from completion type, in 16-byte units. */ +#define CMP_LEN(cmp_type) (((cmp_type) & 1) + 1) + + #define ADV_RAW_CMP(idx, n) ((idx) + (n)) #define NEXT_RAW_CMP(idx) ADV_RAW_CMP(idx, 1) #define RING_CMP(ring, idx) ((idx) & (ring)->ring_mask) diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 22c880c5c3..9824cdb6d8 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -2942,8 +2942,8 @@ static uint32_t bnxt_rx_queue_count_op(struct rte_eth_dev *dev, uint16_t rx_queue_id) { struct bnxt *bp = (struct bnxt *)dev->data->dev_private; - uint32_t desc = 0, raw_cons = 0, cons; struct bnxt_cp_ring_info *cpr; + uint32_t desc = 0, raw_cons; struct bnxt_rx_queue *rxq; struct rx_pkt_cmpl *rxcmp; int rc; @@ -2957,15 +2957,43 @@ bnxt_rx_queue_count_op(struct rte_eth_dev *dev, uint16_t rx_queue_id) raw_cons = cpr->cp_raw_cons; while (1) { + uint32_t agg_cnt, cons, cmpl_type; + cons = RING_CMP(cpr->cp_ring_struct, raw_cons); - rte_prefetch0(&cpr->cp_desc_ring[cons]); rxcmp = (struct rx_pkt_cmpl *)&cpr->cp_desc_ring[cons]; - if (!CMP_VALID(rxcmp, raw_cons, cpr->cp_ring_struct)) { + if (!CMP_VALID(rxcmp, raw_cons, cpr->cp_ring_struct)) break; - } else { - raw_cons++; + + cmpl_type = CMP_TYPE(rxcmp); + + switch (cmpl_type) { + case CMPL_BASE_TYPE_RX_L2: + case CMPL_BASE_TYPE_RX_L2_V2: + agg_cnt = BNXT_RX_L2_AGG_BUFS(rxcmp); + raw_cons = raw_cons + CMP_LEN(cmpl_type) + agg_cnt; + desc++; + break; + + case CMPL_BASE_TYPE_RX_TPA_END: + if (BNXT_CHIP_P5(rxq->bp)) { + struct rx_tpa_v2_end_cmpl_hi *p5_tpa_end; + + p5_tpa_end = (void *)rxcmp; + agg_cnt = BNXT_TPA_END_AGG_BUFS_TH(p5_tpa_end); + } else { + struct rx_tpa_end_cmpl *tpa_end; + + tpa_end = (void *)rxcmp; + agg_cnt = BNXT_TPA_END_AGG_BUFS(tpa_end); + } + + raw_cons = raw_cons + CMP_LEN(cmpl_type) + agg_cnt; desc++; + break; + + default: + raw_cons += CMP_LEN(cmpl_type); } } diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c index 4674f7cea2..e8f174fc57 100644 --- a/drivers/net/bnxt/bnxt_rxr.c +++ b/drivers/net/bnxt/bnxt_rxr.c @@ -827,8 +827,7 @@ static int bnxt_rx_pkt(struct rte_mbuf **rx_pkt, goto next_rx; } - agg_buf = (rxcmp->agg_bufs_v1 & RX_PKT_CMPL_AGG_BUFS_MASK) - >> RX_PKT_CMPL_AGG_BUFS_SFT; + agg_buf = BNXT_RX_L2_AGG_BUFS(rxcmp); if (agg_buf && !bnxt_agg_bufs_valid(cpr, agg_buf, tmp_raw_cons)) return -EBUSY; diff --git a/drivers/net/bnxt/bnxt_rxr.h b/drivers/net/bnxt/bnxt_rxr.h index 0e31b37cad..06d10848da 100644 --- a/drivers/net/bnxt/bnxt_rxr.h +++ b/drivers/net/bnxt/bnxt_rxr.h @@ -37,6 +37,10 @@ static inline uint16_t bnxt_tpa_start_agg_id(struct bnxt *bp, #define BNXT_TPA_END_AGG_ID_TH(cmp) \ rte_le_to_cpu_16((cmp)->agg_id) +#define BNXT_RX_L2_AGG_BUFS(cmp) \ + (((cmp)->agg_bufs_v1 & RX_PKT_CMPL_AGG_BUFS_MASK) >> \ + RX_PKT_CMPL_AGG_BUFS_SFT) + #define BNXT_RX_POST_THRESH 32 /* Number of descriptors to process per inner loop in vector mode. */