patch 'net/ngbe: fix checksum error counter' has been queued to stable release 24.11.4
Kevin Traynor
ktraynor at redhat.com
Fri Nov 21 12:20:07 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/f9110ac3ce6716308bea981d6933095164adf472
Thanks.
Kevin
---
>From f9110ac3ce6716308bea981d6933095164adf472 Mon Sep 17 00:00:00 2001
From: Jiawen Wu <jiawenwu at trustnetic.com>
Date: Mon, 27 Oct 2025 11:15:25 +0800
Subject: [PATCH] net/ngbe: fix checksum error counter
[ upstream commit 6280a306079840301b2cd4eee472142964c2e9f6 ]
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: 8b433d04adc9 ("net/ngbe: support device xstats")
Signed-off-by: Jiawen Wu <jiawenwu at trustnetic.com>
---
drivers/net/ngbe/ngbe_ethdev.c | 17 +++++++++++++++++
drivers/net/ngbe/ngbe_rxtx.c | 21 ++++++++++++++-------
drivers/net/ngbe/ngbe_rxtx.h | 1 +
drivers/net/ngbe/ngbe_rxtx_vec_neon.c | 9 ++++++++-
drivers/net/ngbe/ngbe_rxtx_vec_sse.c | 9 ++++++++-
5 files changed, 48 insertions(+), 9 deletions(-)
diff --git a/drivers/net/ngbe/ngbe_ethdev.c b/drivers/net/ngbe/ngbe_ethdev.c
index d3ac40299f..65143f8fe2 100644
--- a/drivers/net/ngbe/ngbe_ethdev.c
+++ b/drivers/net/ngbe/ngbe_ethdev.c
@@ -1702,4 +1702,6 @@ ngbe_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
struct ngbe_hw *hw = ngbe_dev_hw(dev);
struct ngbe_hw_stats *hw_stats = NGBE_DEV_STATS(dev);
+ struct ngbe_rx_queue *rxq;
+ uint64_t rx_csum_err = 0;
unsigned int i, count;
@@ -1715,4 +1717,11 @@ ngbe_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
limit = min(limit, ngbe_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 ngbe_hw_stats */
for (i = 0; i < limit; i++) {
@@ -1791,4 +1800,6 @@ ngbe_dev_xstats_reset(struct rte_eth_dev *dev)
struct ngbe_hw *hw = ngbe_dev_hw(dev);
struct ngbe_hw_stats *hw_stats = NGBE_DEV_STATS(dev);
+ struct ngbe_rx_queue *rxq;
+ int i = 0;
/* HW registers are cleared on read */
@@ -1800,4 +1811,10 @@ ngbe_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/ngbe/ngbe_rxtx.c b/drivers/net/ngbe/ngbe_rxtx.c
index 8d31d47de9..42cb33dbfe 100644
--- a/drivers/net/ngbe/ngbe_rxtx.c
+++ b/drivers/net/ngbe/ngbe_rxtx.c
@@ -973,20 +973,26 @@ 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 ngbe_rx_queue *rxq)
{
uint64_t pkt_flags = 0;
/* checksum offload can't be disabled */
- if (rx_status & NGBE_RXD_STAT_IPCS)
+ if (rx_status & NGBE_RXD_STAT_IPCS) {
pkt_flags |= (rx_status & NGBE_RXD_ERR_IPCS
? RTE_MBUF_F_RX_IP_CKSUM_BAD : RTE_MBUF_F_RX_IP_CKSUM_GOOD);
+ rxq->csum_err += !!(rx_status & NGBE_RXD_ERR_IPCS);
+ }
- if (rx_status & NGBE_RXD_STAT_L4CS)
+ if (rx_status & NGBE_RXD_STAT_L4CS) {
pkt_flags |= (rx_status & NGBE_RXD_ERR_L4CS
? RTE_MBUF_F_RX_L4_CKSUM_BAD : RTE_MBUF_F_RX_L4_CKSUM_GOOD);
+ rxq->csum_err += !!(rx_status & NGBE_RXD_ERR_L4CS);
+ }
if (rx_status & NGBE_RXD_STAT_EIPCS &&
- rx_status & NGBE_RXD_ERR_EIPCS)
+ rx_status & NGBE_RXD_ERR_EIPCS) {
pkt_flags |= RTE_MBUF_F_RX_OUTER_IP_CKSUM_BAD;
+ rxq->csum_err += !!(rx_status & NGBE_RXD_ERR_EIPCS);
+ }
return pkt_flags;
@@ -1061,5 +1067,5 @@ ngbe_rx_scan_hw_ring(struct ngbe_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 |=
ngbe_rxd_pkt_info_to_pkt_flags(pkt_info[j]);
@@ -1394,5 +1400,5 @@ ngbe_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 |= ngbe_rxd_pkt_info_to_pkt_flags(pkt_info);
rxm->ol_flags = pkt_flags;
@@ -1465,5 +1471,5 @@ ngbe_fill_cluster_head_buf(struct rte_mbuf *head, struct ngbe_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 |= ngbe_rxd_pkt_info_to_pkt_flags(pkt_info);
head->ol_flags = pkt_flags;
@@ -2267,4 +2273,5 @@ ngbe_reset_rx_queue(struct ngbe_adapter *adapter, struct ngbe_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/ngbe/ngbe_rxtx.h b/drivers/net/ngbe/ngbe_rxtx.h
index 8534ec123a..7b96b837ca 100644
--- a/drivers/net/ngbe/ngbe_rxtx.h
+++ b/drivers/net/ngbe/ngbe_rxtx.h
@@ -293,4 +293,5 @@ struct ngbe_rx_queue {
struct rte_mbuf *rx_stage[RTE_PMD_NGBE_RX_MAX_BURST * 2];
const struct rte_memzone *mz;
+ uint64_t csum_err;
};
diff --git a/drivers/net/ngbe/ngbe_rxtx_vec_neon.c b/drivers/net/ngbe/ngbe_rxtx_vec_neon.c
index 37075ea5e7..55df0ad3a5 100644
--- a/drivers/net/ngbe/ngbe_rxtx_vec_neon.c
+++ b/drivers/net/ngbe/ngbe_rxtx_vec_neon.c
@@ -223,5 +223,5 @@ _recv_raw_pkts_vec(struct ngbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
struct ngbe_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 ngbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
&rx_pkts[pos]);
+ for (i = 0; i < RTE_NGBE_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/ngbe/ngbe_rxtx_vec_sse.c b/drivers/net/ngbe/ngbe_rxtx_vec_sse.c
index 19c69cdfa6..474101c600 100644
--- a/drivers/net/ngbe/ngbe_rxtx_vec_sse.c
+++ b/drivers/net/ngbe/ngbe_rxtx_vec_sse.c
@@ -245,5 +245,5 @@ _recv_raw_pkts_vec(struct ngbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
struct ngbe_rx_entry *sw_ring;
uint16_t nb_pkts_recd;
- int pos;
+ int pos, i;
uint64_t var;
__m128i shuf_msk;
@@ -413,4 +413,11 @@ _recv_raw_pkts_vec(struct ngbe_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_NGBE_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 */
pkt_mb4 = _mm_add_epi16(pkt_mb4, crc_adjust);
--
2.51.0
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2025-11-21 11:05:10.337953232 +0000
+++ 0023-net-ngbe-fix-checksum-error-counter.patch 2025-11-21 11:05:09.404200918 +0000
@@ -1 +1 @@
-From 6280a306079840301b2cd4eee472142964c2e9f6 Mon Sep 17 00:00:00 2001
+From f9110ac3ce6716308bea981d6933095164adf472 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 6280a306079840301b2cd4eee472142964c2e9f6 ]
+
@@ -11 +12,0 @@
-Cc: stable at dpdk.org
@@ -23 +24 @@
-index adb7785498..8b9d6371fb 100644
+index d3ac40299f..65143f8fe2 100644
@@ -26 +27 @@
-@@ -1705,4 +1705,6 @@ ngbe_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
+@@ -1702,4 +1702,6 @@ ngbe_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
@@ -33 +34 @@
-@@ -1718,4 +1720,11 @@ ngbe_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
+@@ -1715,4 +1717,11 @@ ngbe_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
@@ -45 +46 @@
-@@ -1794,4 +1803,6 @@ ngbe_dev_xstats_reset(struct rte_eth_dev *dev)
+@@ -1791,4 +1800,6 @@ ngbe_dev_xstats_reset(struct rte_eth_dev *dev)
@@ -52 +53 @@
-@@ -1803,4 +1814,10 @@ ngbe_dev_xstats_reset(struct rte_eth_dev *dev)
+@@ -1800,4 +1811,10 @@ ngbe_dev_xstats_reset(struct rte_eth_dev *dev)
@@ -64 +65 @@
-index 95e2172ee4..a60421293b 100644
+index 8d31d47de9..42cb33dbfe 100644
@@ -136 +137 @@
-index 46391c9400..79685de181 100644
+index 37075ea5e7..55df0ad3a5 100644
More information about the stable
mailing list