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 56F9345BCB; Fri, 25 Oct 2024 19:58:25 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6682440693; Fri, 25 Oct 2024 19:58:00 +0200 (CEST) Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) by mails.dpdk.org (Postfix) with ESMTP id DA30240662 for ; Fri, 25 Oct 2024 19:57:52 +0200 (CEST) Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-20c7edf2872so25180185ad.1 for ; Fri, 25 Oct 2024 10:57:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1729879071; x=1730483871; 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=ac2rchraFOIB0emNN9Ypdx72WblUggRVmof7jxKcQFA=; b=glgS1ebQ2CWMCwN6nJod7MPqVJg630GjQMIJnXwlPKkq/5w5J83p0pkrHOOeRURcTz OgBz6ibJXT4Wo3DHpKOC94vrAwVp5R2xVn2KWt5O5xoUKBW/5wK6pZutswx9cm6CgDsz i1X4T9z+MC7mFi4yyaaoj3wr/MeFuDLXDY7tk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729879071; x=1730483871; 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=ac2rchraFOIB0emNN9Ypdx72WblUggRVmof7jxKcQFA=; b=jLXYOY9oNwpYSR6DD6OWmMbDd15ASR9P5SKQ/xY9n73Fj+oYRKIY6fHLYPmcfh/IpT cJhkUa48IpUk+XMUzAJ3q5ULq7F+C1ZJuoVnPIxX7r0Nwv6VPUaj9HUwQ7tbRvVJHvJJ 08uRbXv9nz10lpQJIDvJ5kcy1DTCCjh6azgiLSyRBxQS9o+Sg2Gxtb1WRIUlMXgt4xr3 FKmBkvSlhV6APiGCiqVDwrDcesEGWPhvXbi94LzMnlhZL4OrQphTuUw3hq/iT8G0QtmD RQWDM+ORjHLqvfbL4OimPfUSXtOnHz7iJjBAp0h3N3h2QyaMQQ9Zvwl1QtdxxLavNgRr K7nw== X-Gm-Message-State: AOJu0YxyeZrgNphu9mxIZJvJ0TKMrG22gjALFq91tT4pGDl21KFh26yg O5xoe08M8GZj4vA7Fe9kCWuJv2GArYDaYWE8DpBv1momz5VaSLnwXdRn+DS8jgvo7yYWFl1IpGM w5sojYmxtKKMPKgBjCVgl5kjEZ2Bo/cTE9sYpYPwDFSzxlXl8NMxT2X6wqSBjjQUQUps8SHXNug nykJifwmRQ5Dvxdffs+DMBUL2of/9UwjY= X-Google-Smtp-Source: AGHT+IE/RfzOayVANjN7DE+IdSZ/XBPKRnH0rskHVELuvfoU0P8CuZfxnnCfDuGXn8zBfQiZ4g7z6A== X-Received: by 2002:a17:903:32ce:b0:20b:c043:3873 with SMTP id d9443c01a7336-210c5a46ed5mr5667335ad.21.1729879071206; Fri, 25 Oct 2024 10:57:51 -0700 (PDT) Received: from C02GC2QQMD6T.wifi.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-210bc02ebd8sm11924335ad.210.2024.10.25.10.57.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Oct 2024 10:57:50 -0700 (PDT) From: Ajit Khaparde To: dev@dpdk.org Cc: Kalesh AP Subject: [PATCH 06/13] net/bnxt: free and account a bad Tx mbuf Date: Fri, 25 Oct 2024 10:57:31 -0700 Message-Id: <20241025175738.99564-7-ajit.khaparde@broadcom.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20241025175738.99564-1-ajit.khaparde@broadcom.com> References: <20241025175738.99564-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 | 7 ++++ drivers/net/bnxt/bnxt_txq.h | 1 + drivers/net/bnxt/bnxt_txr.c | 64 +++++++++++++++++++++++++---------- 3 files changed, 54 insertions(+), 18 deletions(-) diff --git a/drivers/net/bnxt/bnxt_stats.c b/drivers/net/bnxt/bnxt_stats.c index 5e59afe79f..ccd28f19b3 100644 --- a/drivers/net/bnxt/bnxt_stats.c +++ b/drivers/net/bnxt/bnxt_stats.c @@ -746,6 +746,7 @@ 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_atomic64_read(&txq->tx_mbuf_drop); } return rc; @@ -792,6 +793,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]; + + rte_atomic64_clear(&txq->tx_mbuf_drop); + } + 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..44a672a401 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_atomic64_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..e961fed9b5 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,13 @@ 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_atomic64_inc(&txq->tx_mbuf_drop); + dropped++; + } break; + } } if (likely(nb_tx_pkts)) { @@ -670,6 +697,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)