patch 'net/txgbe: fix checksum error counter' has been queued to stable release 24.11.4

Kevin Traynor ktraynor at redhat.com
Fri Nov 21 12:20:06 CET 2025


Hi,

FYI, your patch has been queued to stable release 24.11.4

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 11/26/25. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/kevintraynor/dpdk-stable

This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable/commit/a11c55a94f641b8eb25c92e57ba69079ef11b56e

Thanks.

Kevin

---
>From a11c55a94f641b8eb25c92e57ba69079ef11b56e Mon Sep 17 00:00:00 2001
From: Jiawen Wu <jiawenwu at trustnetic.com>
Date: Mon, 27 Oct 2025 11:15:24 +0800
Subject: [PATCH] net/txgbe: fix checksum error counter

[ upstream commit b9ad8a6e728aff2c6628f07d41d54f6ca89b936b ]

Count the rx_l3_l4_xsum_error statistic in Rx path. Since this hardware
register counter is missing, resulted in the count always showing as 0
in error.

Fixes: 91fe49c87d76 ("net/txgbe: support device xstats")

Signed-off-by: Jiawen Wu <jiawenwu at trustnetic.com>
---
 drivers/net/txgbe/txgbe_ethdev.c        | 17 +++++++++++++++++
 drivers/net/txgbe/txgbe_rxtx.c          | 12 ++++++++----
 drivers/net/txgbe/txgbe_rxtx.h          |  1 +
 drivers/net/txgbe/txgbe_rxtx_vec_neon.c |  9 ++++++++-
 drivers/net/txgbe/txgbe_rxtx_vec_sse.c  |  9 ++++++++-
 5 files changed, 42 insertions(+), 6 deletions(-)

diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c
index ed4f1c1360..554d41aeee 100644
--- a/drivers/net/txgbe/txgbe_ethdev.c
+++ b/drivers/net/txgbe/txgbe_ethdev.c
@@ -2603,4 +2603,6 @@ txgbe_dev_xstats_get_(struct rte_eth_dev *dev, uint64_t *values,
 	struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
 	struct txgbe_hw_stats *hw_stats = TXGBE_DEV_STATS(dev);
+	struct txgbe_rx_queue *rxq;
+	uint64_t rx_csum_err = 0;
 	unsigned int i, count;
 
@@ -2616,4 +2618,11 @@ txgbe_dev_xstats_get_(struct rte_eth_dev *dev, uint64_t *values,
 	limit = min(limit, txgbe_xstats_calc_num(dev));
 
+	/* Rx Checksum Errors */
+	for (i = 0; i < dev->data->nb_rx_queues; i++) {
+		rxq = dev->data->rx_queues[i];
+		rx_csum_err += rxq->csum_err;
+	}
+	hw_stats->rx_l3_l4_xsum_error = rx_csum_err;
+
 	/* Extended stats from txgbe_hw_stats */
 	for (i = 0; i < limit; i++) {
@@ -2658,4 +2667,6 @@ txgbe_dev_xstats_reset(struct rte_eth_dev *dev)
 	struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
 	struct txgbe_hw_stats *hw_stats = TXGBE_DEV_STATS(dev);
+	struct txgbe_rx_queue *rxq;
+	int i = 0;
 
 	/* HW registers are cleared on read */
@@ -2667,4 +2678,10 @@ txgbe_dev_xstats_reset(struct rte_eth_dev *dev)
 	memset(hw_stats, 0, sizeof(*hw_stats));
 
+	/* Reset rxq checksum errors */
+	for (i = 0; i < dev->data->nb_rx_queues; i++) {
+		rxq = dev->data->rx_queues[i];
+		rxq->csum_err = 0;
+	}
+
 	return 0;
 }
diff --git a/drivers/net/txgbe/txgbe_rxtx.c b/drivers/net/txgbe/txgbe_rxtx.c
index 46e73a89cb..2f4690ec61 100644
--- a/drivers/net/txgbe/txgbe_rxtx.c
+++ b/drivers/net/txgbe/txgbe_rxtx.c
@@ -1278,5 +1278,5 @@ rx_desc_status_to_pkt_flags(uint32_t rx_status, uint64_t vlan_flags)
 
 static inline uint64_t
-rx_desc_error_to_pkt_flags(uint32_t rx_status)
+rx_desc_error_to_pkt_flags(uint32_t rx_status, struct txgbe_rx_queue *rxq)
 {
 	uint64_t pkt_flags = 0;
@@ -1286,4 +1286,5 @@ rx_desc_error_to_pkt_flags(uint32_t rx_status)
 		pkt_flags |= (rx_status & TXGBE_RXD_ERR_IPCS
 				? RTE_MBUF_F_RX_IP_CKSUM_BAD : RTE_MBUF_F_RX_IP_CKSUM_GOOD);
+		rxq->csum_err += !!(rx_status & TXGBE_RXD_ERR_IPCS);
 	}
 
@@ -1291,4 +1292,5 @@ rx_desc_error_to_pkt_flags(uint32_t rx_status)
 		pkt_flags |= (rx_status & TXGBE_RXD_ERR_L4CS
 				? RTE_MBUF_F_RX_L4_CKSUM_BAD : RTE_MBUF_F_RX_L4_CKSUM_GOOD);
+		rxq->csum_err += !!(rx_status & TXGBE_RXD_ERR_L4CS);
 	}
 
@@ -1296,4 +1298,5 @@ rx_desc_error_to_pkt_flags(uint32_t rx_status)
 	    rx_status & TXGBE_RXD_ERR_EIPCS) {
 		pkt_flags |= RTE_MBUF_F_RX_OUTER_IP_CKSUM_BAD;
+		rxq->csum_err += !!(rx_status & TXGBE_RXD_ERR_EIPCS);
 	}
 
@@ -1377,5 +1380,5 @@ txgbe_rx_scan_hw_ring(struct txgbe_rx_queue *rxq)
 			pkt_flags = rx_desc_status_to_pkt_flags(s[j],
 					rxq->vlan_flags);
-			pkt_flags |= rx_desc_error_to_pkt_flags(s[j]);
+			pkt_flags |= rx_desc_error_to_pkt_flags(s[j], rxq);
 			pkt_flags |=
 				txgbe_rxd_pkt_info_to_pkt_flags(pkt_info[j]);
@@ -1716,5 +1719,5 @@ txgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		pkt_flags = rx_desc_status_to_pkt_flags(staterr,
 					rxq->vlan_flags);
-		pkt_flags |= rx_desc_error_to_pkt_flags(staterr);
+		pkt_flags |= rx_desc_error_to_pkt_flags(staterr, rxq);
 		pkt_flags |= txgbe_rxd_pkt_info_to_pkt_flags(pkt_info);
 		rxm->ol_flags = pkt_flags;
@@ -1792,5 +1795,5 @@ txgbe_fill_cluster_head_buf(struct rte_mbuf *head, struct txgbe_rx_desc *desc,
 	pkt_info = rte_le_to_cpu_32(desc->qw0.dw0);
 	pkt_flags = rx_desc_status_to_pkt_flags(staterr, rxq->vlan_flags);
-	pkt_flags |= rx_desc_error_to_pkt_flags(staterr);
+	pkt_flags |= rx_desc_error_to_pkt_flags(staterr, rxq);
 	pkt_flags |= txgbe_rxd_pkt_info_to_pkt_flags(pkt_info);
 	if (TXGBE_RXD_RSCCNT(desc->qw0.dw0))
@@ -2697,4 +2700,5 @@ txgbe_reset_rx_queue(struct txgbe_adapter *adapter, struct txgbe_rx_queue *rxq)
 	rxq->rx_tail = 0;
 	rxq->nb_rx_hold = 0;
+	rxq->csum_err = 0;
 	rte_pktmbuf_free(rxq->pkt_first_seg);
 	rxq->pkt_first_seg = NULL;
diff --git a/drivers/net/txgbe/txgbe_rxtx.h b/drivers/net/txgbe/txgbe_rxtx.h
index 622a0d3981..f90db9dde7 100644
--- a/drivers/net/txgbe/txgbe_rxtx.h
+++ b/drivers/net/txgbe/txgbe_rxtx.h
@@ -324,4 +324,5 @@ struct txgbe_rx_queue {
 	struct rte_mbuf *rx_stage[RTE_PMD_TXGBE_RX_MAX_BURST * 2];
 	const struct rte_memzone *mz;
+	uint64_t            csum_err;
 };
 
diff --git a/drivers/net/txgbe/txgbe_rxtx_vec_neon.c b/drivers/net/txgbe/txgbe_rxtx_vec_neon.c
index d4d647fab5..5c990f5712 100644
--- a/drivers/net/txgbe/txgbe_rxtx_vec_neon.c
+++ b/drivers/net/txgbe/txgbe_rxtx_vec_neon.c
@@ -223,5 +223,5 @@ _recv_raw_pkts_vec(struct txgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 	struct txgbe_rx_entry *sw_ring;
 	uint16_t nb_pkts_recd;
-	int pos;
+	int pos, i;
 	uint8x16_t shuf_msk = {
 		0xFF, 0xFF,
@@ -332,4 +332,11 @@ _recv_raw_pkts_vec(struct txgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 				  &rx_pkts[pos]);
 
+		for (i = 0; i < RTE_TXGBE_DESCS_PER_LOOP; i++) {
+			if (rx_pkts[pos + i]->ol_flags &
+			    (RTE_MBUF_F_RX_IP_CKSUM_BAD |
+			     RTE_MBUF_F_RX_L4_CKSUM_BAD))
+				rxq->csum_err++;
+		}
+
 		/* D.2 pkt 3,4 set in_port/nb_seg and remove crc */
 		tmp = vsubq_u16(vreinterpretq_u16_u8(pkt_mb4), crc_adjust);
diff --git a/drivers/net/txgbe/txgbe_rxtx_vec_sse.c b/drivers/net/txgbe/txgbe_rxtx_vec_sse.c
index 8ecce33471..03c2af43d5 100644
--- a/drivers/net/txgbe/txgbe_rxtx_vec_sse.c
+++ b/drivers/net/txgbe/txgbe_rxtx_vec_sse.c
@@ -284,5 +284,5 @@ _recv_raw_pkts_vec(struct txgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 	uint8_t use_ipsec = rxq->using_ipsec;
 #endif
-	int pos;
+	int pos, i;
 	uint64_t var;
 	__m128i shuf_msk;
@@ -452,4 +452,11 @@ _recv_raw_pkts_vec(struct txgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		desc_to_olflags_v(descs, mbuf_init, vlan_flags, &rx_pkts[pos]);
 
+		for (i = 0; i < RTE_TXGBE_DESCS_PER_LOOP; i++) {
+			if (rx_pkts[pos + i]->ol_flags &
+			    (RTE_MBUF_F_RX_IP_CKSUM_BAD |
+			     RTE_MBUF_F_RX_L4_CKSUM_BAD))
+				rxq->csum_err++;
+		}
+
 #ifdef RTE_LIB_SECURITY
 		if (unlikely(use_ipsec))
-- 
2.51.0

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2025-11-21 11:05:10.306708552 +0000
+++ 0022-net-txgbe-fix-checksum-error-counter.patch	2025-11-21 11:05:09.399200896 +0000
@@ -1 +1 @@
-From b9ad8a6e728aff2c6628f07d41d54f6ca89b936b Mon Sep 17 00:00:00 2001
+From a11c55a94f641b8eb25c92e57ba69079ef11b56e Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit b9ad8a6e728aff2c6628f07d41d54f6ca89b936b ]
+
@@ -11 +12,0 @@
-Cc: stable at dpdk.org
@@ -23 +24 @@
-index 7b040b08c5..cbb2ea815f 100644
+index ed4f1c1360..554d41aeee 100644
@@ -26 +27 @@
-@@ -2667,4 +2667,6 @@ txgbe_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
+@@ -2603,4 +2603,6 @@ txgbe_dev_xstats_get_(struct rte_eth_dev *dev, uint64_t *values,
@@ -33 +34 @@
-@@ -2680,4 +2682,11 @@ txgbe_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
+@@ -2616,4 +2618,11 @@ txgbe_dev_xstats_get_(struct rte_eth_dev *dev, uint64_t *values,
@@ -45 +46 @@
-@@ -2756,4 +2765,6 @@ txgbe_dev_xstats_reset(struct rte_eth_dev *dev)
+@@ -2658,4 +2667,6 @@ txgbe_dev_xstats_reset(struct rte_eth_dev *dev)
@@ -52 +53 @@
-@@ -2765,4 +2776,10 @@ txgbe_dev_xstats_reset(struct rte_eth_dev *dev)
+@@ -2667,4 +2678,10 @@ txgbe_dev_xstats_reset(struct rte_eth_dev *dev)
@@ -64 +65 @@
-index 167bda8019..c606180741 100644
+index 46e73a89cb..2f4690ec61 100644
@@ -67 +68 @@
-@@ -1291,5 +1291,5 @@ rx_desc_status_to_pkt_flags(uint32_t rx_status, uint64_t vlan_flags)
+@@ -1278,5 +1278,5 @@ rx_desc_status_to_pkt_flags(uint32_t rx_status, uint64_t vlan_flags)
@@ -74 +75 @@
-@@ -1299,4 +1299,5 @@ rx_desc_error_to_pkt_flags(uint32_t rx_status)
+@@ -1286,4 +1286,5 @@ rx_desc_error_to_pkt_flags(uint32_t rx_status)
@@ -80 +81 @@
-@@ -1304,4 +1305,5 @@ rx_desc_error_to_pkt_flags(uint32_t rx_status)
+@@ -1291,4 +1292,5 @@ rx_desc_error_to_pkt_flags(uint32_t rx_status)
@@ -86 +87 @@
-@@ -1309,4 +1311,5 @@ rx_desc_error_to_pkt_flags(uint32_t rx_status)
+@@ -1296,4 +1298,5 @@ rx_desc_error_to_pkt_flags(uint32_t rx_status)
@@ -92 +93 @@
-@@ -1390,5 +1393,5 @@ txgbe_rx_scan_hw_ring(struct txgbe_rx_queue *rxq)
+@@ -1377,5 +1380,5 @@ txgbe_rx_scan_hw_ring(struct txgbe_rx_queue *rxq)
@@ -99 +100 @@
-@@ -1729,5 +1732,5 @@ txgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
+@@ -1716,5 +1719,5 @@ txgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
@@ -106 +107 @@
-@@ -1805,5 +1808,5 @@ txgbe_fill_cluster_head_buf(struct rte_mbuf *head, struct txgbe_rx_desc *desc,
+@@ -1792,5 +1795,5 @@ txgbe_fill_cluster_head_buf(struct rte_mbuf *head, struct txgbe_rx_desc *desc,
@@ -113 +114 @@
-@@ -2754,4 +2757,5 @@ txgbe_reset_rx_queue(struct txgbe_adapter *adapter, struct txgbe_rx_queue *rxq)
+@@ -2697,4 +2700,5 @@ txgbe_reset_rx_queue(struct txgbe_adapter *adapter, struct txgbe_rx_queue *rxq)
@@ -120 +121 @@
-index b1ac03576f..02e2617cce 100644
+index 622a0d3981..f90db9dde7 100644
@@ -130 +131 @@
-index a56e2f4164..c408a65036 100644
+index d4d647fab5..5c990f5712 100644



More information about the stable mailing list