* [PATCH 0/2] bxnt fixes
@ 2025-03-10 21:01 Ajit Khaparde
2025-03-10 21:01 ` [PATCH 1/2] net/bnxt: configure burst threshold based on speed Ajit Khaparde
2025-03-10 21:01 ` [PATCH 2/2] net/bnxt: fix epoch bit calculation Ajit Khaparde
0 siblings, 2 replies; 3+ messages in thread
From: Ajit Khaparde @ 2025-03-10 21:01 UTC (permalink / raw)
To: dev; +Cc: thomas
These patches address a couple of issues in the BNXT PMD.
Please apply.
Ajit Khaparde (2):
net/bnxt: configure burst threshold based on speed
net/bnxt: fix epoch bit calculation
drivers/net/bnxt/bnxt_ethdev.c | 20 ++++++++++++++++++++
drivers/net/bnxt/bnxt_ring.h | 19 +++++++++++++++++++
drivers/net/bnxt/bnxt_rxq.c | 1 +
drivers/net/bnxt/bnxt_rxq.h | 2 ++
drivers/net/bnxt/bnxt_rxr.c | 4 ++++
drivers/net/bnxt/bnxt_rxtx_vec_avx2.c | 18 ++++++++++--------
drivers/net/bnxt/bnxt_rxtx_vec_common.h | 11 +++++------
drivers/net/bnxt/bnxt_rxtx_vec_neon.c | 9 +++++----
drivers/net/bnxt/bnxt_rxtx_vec_sse.c | 18 ++++++++++--------
9 files changed, 76 insertions(+), 26 deletions(-)
--
2.39.5 (Apple Git-154)
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] net/bnxt: configure burst threshold based on speed
2025-03-10 21:01 [PATCH 0/2] bxnt fixes Ajit Khaparde
@ 2025-03-10 21:01 ` Ajit Khaparde
2025-03-10 21:01 ` [PATCH 2/2] net/bnxt: fix epoch bit calculation Ajit Khaparde
1 sibling, 0 replies; 3+ messages in thread
From: Ajit Khaparde @ 2025-03-10 21:01 UTC (permalink / raw)
To: dev; +Cc: thomas, Kalesh AP, Somnath Kotur, Damodharam Ammepalli
The fixed value of Rx burst threshold may not be optimal
for all the NIC speeds. For high speed NIC ports, like 400G
configure a higher Rx burst value.
Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Damodharam Ammepalli <damodharam.ammepalli@broadcom.com>
---
drivers/net/bnxt/bnxt_ethdev.c | 20 ++++++++++++++++++++
drivers/net/bnxt/bnxt_rxq.h | 1 +
drivers/net/bnxt/bnxt_rxtx_vec_avx2.c | 18 ++++++++++--------
drivers/net/bnxt/bnxt_rxtx_vec_neon.c | 9 +++++----
drivers/net/bnxt/bnxt_rxtx_vec_sse.c | 18 ++++++++++--------
5 files changed, 46 insertions(+), 20 deletions(-)
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 144d4377bd..a0e3cd8bbe 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -1793,10 +1793,27 @@ int bnxt_dev_stop_op(struct rte_eth_dev *eth_dev)
return bnxt_dev_stop(eth_dev);
}
+static void bnxt_update_max_rx_burst(struct bnxt *bp, struct rte_eth_link *link)
+{
+ if (link->link_speed == RTE_ETH_SPEED_NUM_400G) {
+ uint32_t i;
+
+ /* Faster port speed. Update threshold. Else use default. */
+ for (i = 0; i < bp->rx_nr_rings; i++) {
+ struct bnxt_rx_queue *rxq = bp->rx_queues[i];
+
+ rxq->rx_free_thresh =
+ RTE_MIN(rte_align32pow2(rxq->nb_rx_desc) / 4,
+ RTE_BNXT_MAX_RX_BURST_TH2);
+ }
+ }
+}
+
int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)
{
struct bnxt *bp = eth_dev->data->dev_private;
uint64_t rx_offloads = eth_dev->data->dev_conf.rxmode.offloads;
+ struct rte_eth_link *link = ð_dev->data->dev_link;
int vlan_mask = 0;
int rc, retry_cnt = BNXT_IF_CHANGE_RETRY_COUNT;
@@ -1877,6 +1894,8 @@ int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)
eth_dev->rx_pkt_burst = bnxt_receive_function(eth_dev);
eth_dev->tx_pkt_burst = bnxt_transmit_function(eth_dev);
+ bnxt_update_max_rx_burst(bp, link);
+
bnxt_schedule_fw_health_check(bp);
if (BNXT_P5_PTP_TIMESYNC_ENABLED(bp))
@@ -2114,6 +2133,7 @@ int bnxt_link_update_op(struct rte_eth_dev *eth_dev, int wait_to_complete)
rte_eth_linkstatus_set(eth_dev, &new);
bnxt_print_link_info(eth_dev);
}
+ bnxt_update_max_rx_burst(bp, &new);
return rc;
}
diff --git a/drivers/net/bnxt/bnxt_rxq.h b/drivers/net/bnxt/bnxt_rxq.h
index 0b411a941a..cd49faf4cf 100644
--- a/drivers/net/bnxt/bnxt_rxq.h
+++ b/drivers/net/bnxt/bnxt_rxq.h
@@ -8,6 +8,7 @@
/* Maximum receive burst supported in vector mode. */
#define RTE_BNXT_MAX_RX_BURST 64U
+#define RTE_BNXT_MAX_RX_BURST_TH2 296U
/* Drop by default when receive desc is not available. */
#define BNXT_DEFAULT_RX_DROP_EN 1
diff --git a/drivers/net/bnxt/bnxt_rxtx_vec_avx2.c b/drivers/net/bnxt/bnxt_rxtx_vec_avx2.c
index 43d9528134..35550534de 100644
--- a/drivers/net/bnxt/bnxt_rxtx_vec_avx2.c
+++ b/drivers/net/bnxt/bnxt_rxtx_vec_avx2.c
@@ -660,18 +660,19 @@ uint16_t
bnxt_recv_pkts_vec_avx2(void *rx_queue, struct rte_mbuf **rx_pkts,
uint16_t nb_pkts)
{
+ struct bnxt_rx_queue *rxq = rx_queue;
+ uint32_t brst = rxq->rx_free_thresh;
uint16_t cnt = 0;
- while (nb_pkts > RTE_BNXT_MAX_RX_BURST) {
+ while (nb_pkts > brst) {
uint16_t burst;
- burst = recv_burst_vec_avx2(rx_queue, rx_pkts + cnt,
- RTE_BNXT_MAX_RX_BURST);
+ burst = recv_burst_vec_avx2(rx_queue, rx_pkts + cnt, brst);
cnt += burst;
nb_pkts -= burst;
- if (burst < RTE_BNXT_MAX_RX_BURST)
+ if (burst < brst)
return cnt;
}
return cnt + recv_burst_vec_avx2(rx_queue, rx_pkts + cnt, nb_pkts);
@@ -681,18 +682,19 @@ uint16_t
bnxt_crx_pkts_vec_avx2(void *rx_queue, struct rte_mbuf **rx_pkts,
uint16_t nb_pkts)
{
+ struct bnxt_rx_queue *rxq = rx_queue;
+ uint32_t brst = rxq->rx_free_thresh;
uint16_t cnt = 0;
- while (nb_pkts > RTE_BNXT_MAX_RX_BURST) {
+ while (nb_pkts > brst) {
uint16_t burst;
- burst = crx_burst_vec_avx2(rx_queue, rx_pkts + cnt,
- RTE_BNXT_MAX_RX_BURST);
+ burst = crx_burst_vec_avx2(rx_queue, rx_pkts + cnt, brst);
cnt += burst;
nb_pkts -= burst;
- if (burst < RTE_BNXT_MAX_RX_BURST)
+ if (burst < brst)
return cnt;
}
return cnt + crx_burst_vec_avx2(rx_queue, rx_pkts + cnt, nb_pkts);
diff --git a/drivers/net/bnxt/bnxt_rxtx_vec_neon.c b/drivers/net/bnxt/bnxt_rxtx_vec_neon.c
index 840b21cef9..03f39280e5 100644
--- a/drivers/net/bnxt/bnxt_rxtx_vec_neon.c
+++ b/drivers/net/bnxt/bnxt_rxtx_vec_neon.c
@@ -317,18 +317,19 @@ recv_burst_vec_neon(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
uint16_t
bnxt_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
{
+ struct bnxt_rx_queue *rxq = rx_queue;
+ uint32_t brst = rxq->rx_free_thresh;
uint16_t cnt = 0;
- while (nb_pkts > RTE_BNXT_MAX_RX_BURST) {
+ while (nb_pkts > brst) {
uint16_t burst;
- burst = recv_burst_vec_neon(rx_queue, rx_pkts + cnt,
- RTE_BNXT_MAX_RX_BURST);
+ burst = recv_burst_vec_neon(rx_queue, rx_pkts + cnt, brst);
cnt += burst;
nb_pkts -= burst;
- if (burst < RTE_BNXT_MAX_RX_BURST)
+ if (burst < brst)
return cnt;
}
diff --git a/drivers/net/bnxt/bnxt_rxtx_vec_sse.c b/drivers/net/bnxt/bnxt_rxtx_vec_sse.c
index c1c3e1ecaf..7d455b6f56 100644
--- a/drivers/net/bnxt/bnxt_rxtx_vec_sse.c
+++ b/drivers/net/bnxt/bnxt_rxtx_vec_sse.c
@@ -517,18 +517,19 @@ crx_burst_vec_sse(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
uint16_t
bnxt_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
{
+ struct bnxt_rx_queue *rxq = rx_queue;
+ uint32_t brst = rxq->rx_free_thresh;
uint16_t cnt = 0;
- while (nb_pkts > RTE_BNXT_MAX_RX_BURST) {
+ while (nb_pkts > brst) {
uint16_t burst;
- burst = recv_burst_vec_sse(rx_queue, rx_pkts + cnt,
- RTE_BNXT_MAX_RX_BURST);
+ burst = recv_burst_vec_sse(rx_queue, rx_pkts + cnt, brst);
cnt += burst;
nb_pkts -= burst;
- if (burst < RTE_BNXT_MAX_RX_BURST)
+ if (burst < brst)
return cnt;
}
@@ -538,18 +539,19 @@ bnxt_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
uint16_t
bnxt_crx_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
{
+ struct bnxt_rx_queue *rxq = rx_queue;
+ uint32_t brst = rxq->rx_free_thresh;
uint16_t cnt = 0;
- while (nb_pkts > RTE_BNXT_MAX_RX_BURST) {
+ while (nb_pkts > brst) {
uint16_t burst;
- burst = crx_burst_vec_sse(rx_queue, rx_pkts + cnt,
- RTE_BNXT_MAX_RX_BURST);
+ burst = crx_burst_vec_sse(rx_queue, rx_pkts + cnt, brst);
cnt += burst;
nb_pkts -= burst;
- if (burst < RTE_BNXT_MAX_RX_BURST)
+ if (burst < brst)
return cnt;
}
--
2.39.5 (Apple Git-154)
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 2/2] net/bnxt: fix epoch bit calculation
2025-03-10 21:01 [PATCH 0/2] bxnt fixes Ajit Khaparde
2025-03-10 21:01 ` [PATCH 1/2] net/bnxt: configure burst threshold based on speed Ajit Khaparde
@ 2025-03-10 21:01 ` Ajit Khaparde
1 sibling, 0 replies; 3+ messages in thread
From: Ajit Khaparde @ 2025-03-10 21:01 UTC (permalink / raw)
To: dev; +Cc: thomas, stable, Damodharam Ammepalli, Somnath Kotur
The epoch bit is a binary value which needs to be toggled with
every pass of the ring in the hardware.
The code was doing this prematurely in vector path.
Improve the ring wrap identification and fix epoch bit calculation
in the vector path.
Fixes: 30656a1cace8 ("net/bnxt: refactor epoch setting")
Cc: stable@dpdk.org
Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Damodharam Ammepalli <damodharam.ammepalli@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
---
drivers/net/bnxt/bnxt_ring.h | 19 +++++++++++++++++++
drivers/net/bnxt/bnxt_rxq.c | 1 +
drivers/net/bnxt/bnxt_rxq.h | 1 +
drivers/net/bnxt/bnxt_rxr.c | 4 ++++
drivers/net/bnxt/bnxt_rxtx_vec_common.h | 11 +++++------
5 files changed, 30 insertions(+), 6 deletions(-)
diff --git a/drivers/net/bnxt/bnxt_ring.h b/drivers/net/bnxt/bnxt_ring.h
index a7470a0e73..3e2bd634a8 100644
--- a/drivers/net/bnxt/bnxt_ring.h
+++ b/drivers/net/bnxt/bnxt_ring.h
@@ -108,6 +108,25 @@ static inline void bnxt_db_write(struct bnxt_db_info *db, uint32_t idx)
}
}
+static inline void bnxt_db_epoch_write(struct bnxt_db_info *db, uint32_t idx, uint32_t epoch)
+{
+ uint32_t db_idx = DB_RING_IDX(db, idx);
+ void *doorbell = db->doorbell;
+
+ if (db->db_64) {
+ uint64_t key_idx = db->db_key64 | db_idx;
+
+ key_idx |= epoch << DBR_EPOCH_SFT;
+
+ rte_compiler_barrier();
+ rte_write64_relaxed(key_idx, doorbell);
+ } else {
+ uint32_t key_idx = db->db_key32 | db_idx;
+
+ rte_write32(key_idx, doorbell);
+ }
+}
+
static inline void bnxt_db_mpc_write(struct bnxt_db_info *db, uint32_t idx, uint32_t epoch)
{
uint32_t db_idx = DB_RING_IDX(db, idx);
diff --git a/drivers/net/bnxt/bnxt_rxq.c b/drivers/net/bnxt/bnxt_rxq.c
index a1c3777f33..91b3555df6 100644
--- a/drivers/net/bnxt/bnxt_rxq.c
+++ b/drivers/net/bnxt/bnxt_rxq.c
@@ -425,6 +425,7 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev,
goto err;
}
rxq->rx_mbuf_alloc_fail = 0;
+ rxq->epoch = 0;
/* rxq 0 must not be stopped when used as async CPR */
if (!BNXT_NUM_ASYNC_CPR(bp) && queue_idx == 0)
diff --git a/drivers/net/bnxt/bnxt_rxq.h b/drivers/net/bnxt/bnxt_rxq.h
index cd49faf4cf..3385496e70 100644
--- a/drivers/net/bnxt/bnxt_rxq.h
+++ b/drivers/net/bnxt/bnxt_rxq.h
@@ -30,6 +30,7 @@ struct bnxt_rx_queue {
uint16_t rxrearm_nb; /* number of descs to reinit. */
uint16_t rxrearm_start; /* next desc index to reinit. */
#endif
+ uint32_t epoch;
uint16_t port_id; /* Device port identifier */
uint8_t crc_len; /* 0 if CRC stripped, 4 otherwise */
uint8_t rx_deferred_start; /* not in global dev start */
diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c
index b53d9a917a..c94abefa01 100644
--- a/drivers/net/bnxt/bnxt_rxr.c
+++ b/drivers/net/bnxt/bnxt_rxr.c
@@ -1366,6 +1366,10 @@ uint16_t bnxt_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
bnxt_db_write(&rxr->rx_db, rxr->rx_raw_prod);
rxq->rxrearm_start++;
rxq->rxrearm_nb--;
+ if (rxq->rxrearm_start >= rxq->nb_rx_desc) {
+ rxq->rxrearm_start = 0;
+ rxq->epoch = rxq->epoch == 0 ? 1 : 0;
+ }
} else {
/* Retry allocation on next call. */
break;
diff --git a/drivers/net/bnxt/bnxt_rxtx_vec_common.h b/drivers/net/bnxt/bnxt_rxtx_vec_common.h
index f608b5152e..e185005293 100644
--- a/drivers/net/bnxt/bnxt_rxtx_vec_common.h
+++ b/drivers/net/bnxt/bnxt_rxtx_vec_common.h
@@ -50,6 +50,7 @@ bnxt_rxq_vec_setup_common(struct bnxt_rx_queue *rxq)
rxq->mbuf_initializer = *(uint64_t *)p;
rxq->rxrearm_nb = 0;
rxq->rxrearm_start = 0;
+ rxq->epoch = 1;
return 0;
}
@@ -88,13 +89,11 @@ bnxt_rxq_rearm(struct bnxt_rx_queue *rxq, struct bnxt_rx_ring_info *rxr)
}
rxq->rxrearm_start += nb;
- /*
- * We can pass rxq->rxrearm_star - 1 as well, but then the epoch
- * bit calculation is messed up.
- */
- bnxt_db_write(&rxr->rx_db, rxr->rx_raw_prod);
- if (rxq->rxrearm_start >= rxq->nb_rx_desc)
+ bnxt_db_epoch_write(&rxr->rx_db, rxq->rxrearm_start - 1, rxq->epoch);
+ if (rxq->rxrearm_start >= rxq->nb_rx_desc) {
rxq->rxrearm_start = 0;
+ rxq->epoch = rxq->epoch == 0 ? 1 : 0;
+ }
rxq->rxrearm_nb -= nb;
}
--
2.39.5 (Apple Git-154)
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-03-10 21:01 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-03-10 21:01 [PATCH 0/2] bxnt fixes Ajit Khaparde
2025-03-10 21:01 ` [PATCH 1/2] net/bnxt: configure burst threshold based on speed Ajit Khaparde
2025-03-10 21:01 ` [PATCH 2/2] net/bnxt: fix epoch bit calculation Ajit Khaparde
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).