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 5004A45BF5; Sun, 27 Oct 2024 18:12:17 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9FDA840666; Sun, 27 Oct 2024 18:11:59 +0100 (CET) Received: from mail-pg1-f178.google.com (mail-pg1-f178.google.com [209.85.215.178]) by mails.dpdk.org (Postfix) with ESMTP id F12554065C for ; Sun, 27 Oct 2024 18:11:51 +0100 (CET) Received: by mail-pg1-f178.google.com with SMTP id 41be03b00d2f7-7ea8c4ce232so2879031a12.0 for ; Sun, 27 Oct 2024 10:11:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1730049110; x=1730653910; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=YWkpGCzFZjkf3rOa48vjKlXV7Jb8QNFJsuVbkQ/iBgI=; b=HOhLGEzlO1wJI7knKtNv2E6hyiHcCXEO9I9jAsMx6DLp6ub3iLUeKF1r880LiGqcja oIK/fZzQ2CXD+uJORxBQickSZ+IddkGlaIqH939eT7+WCCXfdDTVQ83ZIoAr1VT2+Ptf Qc3R53oeoH5kcSTTE8beOpFypUD28P3sizmvA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1730049110; x=1730653910; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YWkpGCzFZjkf3rOa48vjKlXV7Jb8QNFJsuVbkQ/iBgI=; b=uZUMiXkEKf9q0+mR4tlmZ3nVrOPjjV++H1qWC9FV8DoNvfh0Ixv9Nfi/MOLz0ebspH Pzcy5c3hDF1Q38ziZN8SkRwNzOH/QsHmur51KM0PP63YVLeNwssr11GDSx8nkJNZiA0d 1OnciF6rVObb/I/lfUlWisinXsGJ+i5HGARamYmMdpNOlX6iUYta8DZiBtC771BrLQTL OhHmHhjMaJ6tAR1pL105tveDTMem7gYhJ5d38geyZqLhviI4Ps7FOZzK3lkXFGbXR8UF Iwzb747jC3nBgu+bZj1KVszb5BQJ20CejpFQDB5+vK4Az47xNxduxM4ATOEKAmEt3u95 L7Gw== X-Gm-Message-State: AOJu0YzExAMHAIo5T1eq2zZ9skE+o9+g3aq2ftOIT0d18tPnsxUefYTf 5tpVm09QQlVVXJ+Gt6HDgJCmpr8rhr+i5Blfvy677P/Kg4KIjVN7wJKdGkEHpl+qrBQghfAtTx7 nh+bAkcF7Po9GxApeKzbmnT92DpQuAw78KQZYs84J3gvVBb90T10v1r0i7uJE5pnjI76tZ4yWZz E+Mfyc4lF2gk6mdFiH2Erzj8yoXMwXKfE= X-Google-Smtp-Source: AGHT+IEMs1R9p3whgT9lnCH7zh5Mh7v2Z7uPCgc3AsbHij8Y3SDcr2I5+Q5DJK+kTmfLiWbWsvNGDQ== X-Received: by 2002:a05:6a20:e347:b0:1d9:1377:c1a3 with SMTP id adf61e73a8af0-1d9a84d71dfmr7899361637.40.1730049110201; Sun, 27 Oct 2024 10:11:50 -0700 (PDT) Received: from localhost.localdomain ([136.52.21.78]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-72057a21ccesm4269158b3a.167.2024.10.27.10.11.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 27 Oct 2024 10:11:48 -0700 (PDT) From: Ajit Khaparde To: dev@dpdk.org Cc: Kalesh AP Subject: [PATCH v2 06/13] net/bnxt: free and account a bad Tx mbuf Date: Sun, 27 Oct 2024 10:11:21 -0700 Message-Id: <20241027171128.50221-7-ajit.khaparde@broadcom.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20241027171128.50221-1-ajit.khaparde@broadcom.com> References: <20241027171128.50221-1-ajit.khaparde@broadcom.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 When the PMD gets a bad Tx mbuf from the application, it is not freeing it currently. The PMD is depending on the application to do it. but in most cases, the application may not know this. Instead the Tx burst function now frees the mbuf and updates the oerrors counter to indicate that the PMD encounteres a bad mbuf during transmit. Signed-off-by: Ajit Khaparde Reviewed-by: Kalesh AP --- drivers/net/bnxt/bnxt_stats.c | 9 +++++ drivers/net/bnxt/bnxt_txq.h | 1 + drivers/net/bnxt/bnxt_txr.c | 65 +++++++++++++++++++++++++---------- 3 files changed, 57 insertions(+), 18 deletions(-) diff --git a/drivers/net/bnxt/bnxt_stats.c b/drivers/net/bnxt/bnxt_stats.c index 5e59afe79f..9d7cdf925d 100644 --- a/drivers/net/bnxt/bnxt_stats.c +++ b/drivers/net/bnxt/bnxt_stats.c @@ -746,6 +746,9 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev, return rc; bnxt_fill_rte_eth_stats(bnxt_stats, &ring_stats, i, false); + bnxt_stats->oerrors += + rte_atomic_load_explicit(&txq->tx_mbuf_drop, + rte_memory_order_relaxed); } return rc; @@ -792,6 +795,12 @@ int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev) rxq->rx_mbuf_alloc_fail = 0; } + for (i = 0; i < bp->tx_cp_nr_rings; i++) { + struct bnxt_tx_queue *txq = bp->tx_queues[i]; + + txq->tx_mbuf_drop = 0; + } + bnxt_clear_prev_stat(bp); return ret; diff --git a/drivers/net/bnxt/bnxt_txq.h b/drivers/net/bnxt/bnxt_txq.h index 9e54985c4c..69652bbaaa 100644 --- a/drivers/net/bnxt/bnxt_txq.h +++ b/drivers/net/bnxt/bnxt_txq.h @@ -34,6 +34,7 @@ struct bnxt_tx_queue { const struct rte_memzone *mz; struct rte_mbuf **free; uint64_t offloads; + RTE_ATOMIC(uint64_t) tx_mbuf_drop; }; void bnxt_free_txq_stats(struct bnxt_tx_queue *txq); diff --git a/drivers/net/bnxt/bnxt_txr.c b/drivers/net/bnxt/bnxt_txr.c index 4e9e377d5b..f88e214790 100644 --- a/drivers/net/bnxt/bnxt_txr.c +++ b/drivers/net/bnxt/bnxt_txr.c @@ -228,7 +228,7 @@ static int bnxt_invalid_mbuf(struct rte_mbuf *mbuf) return 0; } -static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt, +static int bnxt_start_xmit(struct rte_mbuf *tx_pkt, struct bnxt_tx_queue *txq, uint16_t *coal_pkts, struct tx_bd_long **last_txbd) @@ -251,27 +251,37 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt, TX_BD_LONG_FLAGS_LHINT_LT2K, TX_BD_LONG_FLAGS_LHINT_LT2K }; + int rc = 0; - if (unlikely(is_bnxt_in_error(txq->bp))) - return -EIO; + if (unlikely(is_bnxt_in_error(txq->bp))) { + rc = -EIO; + goto ret; + } - if (unlikely(bnxt_invalid_mbuf(tx_pkt))) - return -EINVAL; + if (unlikely(bnxt_invalid_mbuf(tx_pkt))) { + rc = -EINVAL; + goto drop; + } - if (unlikely(bnxt_invalid_nb_segs(tx_pkt))) - return -EINVAL; + if (unlikely(bnxt_invalid_nb_segs(tx_pkt))) { + rc = -EINVAL; + goto drop; + } long_bd = bnxt_xmit_need_long_bd(tx_pkt, txq); nr_bds = long_bd + tx_pkt->nb_segs; - if (unlikely(bnxt_tx_avail(txq) < nr_bds)) - return -ENOMEM; + if (unlikely(bnxt_tx_avail(txq) < nr_bds)) { + rc = -ENOMEM; + goto ret; + } /* Check if number of Tx descriptors is above HW limit */ if (unlikely(nr_bds > BNXT_MAX_TSO_SEGS)) { PMD_DRV_LOG_LINE(ERR, "Num descriptors %d exceeds HW limit", nr_bds); - return -ENOSPC; + rc = -EINVAL; + goto drop; } /* If packet length is less than minimum packet size, pad it */ @@ -283,7 +293,8 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt, PMD_DRV_LOG_LINE(ERR, "Failed to pad mbuf by %d bytes", pad); - return -ENOMEM; + rc = -ENOMEM; + goto ret; } /* Note: data_len, pkt len are updated in rte_pktmbuf_append */ @@ -291,8 +302,10 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt, } /* Check non zero data_len */ - if (unlikely(bnxt_zero_data_len_tso_segsz(tx_pkt, true, false))) - return -EIO; + if (unlikely(bnxt_zero_data_len_tso_segsz(tx_pkt, true, false))) { + rc = -EINVAL; + goto drop; + } if (unlikely(txq->bp->ptp_cfg != NULL && txq->bp->ptp_all_rx_tstamp == 1)) pkt_needs_ts = bnxt_check_pkt_needs_ts(tx_pkt); @@ -381,8 +394,10 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt, */ txbd1->kid_or_ts_low_hdr_size = hdr_size >> 1; txbd1->kid_or_ts_high_mss = tx_pkt->tso_segsz; - if (unlikely(bnxt_zero_data_len_tso_segsz(tx_pkt, false, true))) - return -EIO; + if (unlikely(bnxt_zero_data_len_tso_segsz(tx_pkt, false, true))) { + rc = -EINVAL; + goto drop; + } } else if ((tx_pkt->ol_flags & PKT_TX_OIP_IIP_TCP_UDP_CKSUM) == PKT_TX_OIP_IIP_TCP_UDP_CKSUM) { @@ -456,8 +471,10 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt, m_seg = tx_pkt->next; while (m_seg) { /* Check non zero data_len */ - if (unlikely(bnxt_zero_data_len_tso_segsz(m_seg, true, false))) - return -EIO; + if (unlikely(bnxt_zero_data_len_tso_segsz(m_seg, true, false))) { + rc = -EINVAL; + goto drop; + } txr->tx_raw_prod = RING_NEXT(txr->tx_raw_prod); prod = RING_IDX(ring, txr->tx_raw_prod); @@ -477,6 +494,10 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt, txr->tx_raw_prod = RING_NEXT(txr->tx_raw_prod); return 0; +drop: + rte_pktmbuf_free(tx_pkt); +ret: + return rc; } /* @@ -644,6 +665,7 @@ uint16_t _bnxt_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t coal_pkts = 0; struct bnxt_tx_queue *txq = tx_queue; struct tx_bd_long *last_txbd = NULL; + uint8_t dropped = 0; /* Handle TX completions */ bnxt_handle_tx_cp(txq); @@ -660,8 +682,14 @@ uint16_t _bnxt_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, rc = bnxt_start_xmit(tx_pkts[nb_tx_pkts], txq, &coal_pkts, &last_txbd); - if (unlikely(rc)) + if (unlikely(rc)) { + if (rc == -EINVAL) { + rte_atomic_fetch_add_explicit(&txq->tx_mbuf_drop, 1, + rte_memory_order_relaxed); + dropped++; + } break; + } } if (likely(nb_tx_pkts)) { @@ -670,6 +698,7 @@ uint16_t _bnxt_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, bnxt_db_write(&txq->tx_ring->tx_db, txq->tx_ring->tx_raw_prod); } + nb_tx_pkts += dropped; return nb_tx_pkts; } -- 2.39.5 (Apple Git-154)