[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <b017a553394430a33d721f32b8249a545c06f839.1753694913.git.asml.silence@gmail.com>
Date: Mon, 28 Jul 2025 12:04:12 +0100
From: Pavel Begunkov <asml.silence@...il.com>
To: Jakub Kicinski <kuba@...nel.org>,
netdev@...r.kernel.org
Cc: asml.silence@...il.com,
io-uring@...r.kernel.org,
Eric Dumazet <edumazet@...gle.com>,
Willem de Bruijn <willemb@...gle.com>,
Paolo Abeni <pabeni@...hat.com>,
andrew+netdev@...n.ch,
horms@...nel.org,
davem@...emloft.net,
sdf@...ichev.me,
almasrymina@...gle.com,
dw@...idwei.uk,
michael.chan@...adcom.com,
dtatulea@...dia.com,
ap420073@...il.com
Subject: [RFC v1 08/22] eth: bnxt: support setting size of agg buffers via ethtool
From: Jakub Kicinski <kuba@...nel.org>
bnxt seems to be able to aggregate data up to 32kB without any issue.
The driver is already capable of doing this for systems with higher
order pages. While for systems with 4k pages we historically preferred
to stick to small buffers because they are easier to allocate, the
zero-copy APIs remove the allocation problem. The ZC mem is
pre-allocated and fixed size.
Signed-off-by: Jakub Kicinski <kuba@...nel.org>
Signed-off-by: Pavel Begunkov <asml.silence@...il.com>
---
drivers/net/ethernet/broadcom/bnxt/bnxt.h | 3 ++-
.../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 21 ++++++++++++++++++-
2 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index ac841d02d7ad..56aafae568f8 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -758,7 +758,8 @@ struct nqe_cn {
#define BNXT_RX_PAGE_SHIFT PAGE_SHIFT
#endif
-#define BNXT_RX_PAGE_SIZE (1 << BNXT_RX_PAGE_SHIFT)
+#define BNXT_MAX_RX_PAGE_SIZE (1 << 15)
+#define BNXT_RX_PAGE_SIZE (1 << BNXT_RX_PAGE_SHIFT)
#define BNXT_MAX_MTU 9500
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
index f5d490bf997e..0e225414d463 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
@@ -835,6 +835,8 @@ static void bnxt_get_ringparam(struct net_device *dev,
ering->rx_jumbo_pending = bp->rx_agg_ring_size;
ering->tx_pending = bp->tx_ring_size;
+ kernel_ering->rx_buf_len_max = BNXT_MAX_RX_PAGE_SIZE;
+ kernel_ering->rx_buf_len = bp->rx_page_size;
kernel_ering->hds_thresh_max = BNXT_HDS_THRESHOLD_MAX;
}
@@ -862,6 +864,21 @@ static int bnxt_set_ringparam(struct net_device *dev,
return -EINVAL;
}
+ if (!kernel_ering->rx_buf_len) /* Zero means restore default */
+ kernel_ering->rx_buf_len = BNXT_RX_PAGE_SIZE;
+
+ if (kernel_ering->rx_buf_len != bp->rx_page_size &&
+ !(bp->flags & BNXT_FLAG_CHIP_P5_PLUS)) {
+ NL_SET_ERR_MSG_MOD(extack, "changing rx-buf-len not supported");
+ return -EINVAL;
+ }
+ if (!is_power_of_2(kernel_ering->rx_buf_len) ||
+ kernel_ering->rx_buf_len < BNXT_RX_PAGE_SIZE ||
+ kernel_ering->rx_buf_len > BNXT_MAX_RX_PAGE_SIZE) {
+ NL_SET_ERR_MSG_MOD(extack, "rx-buf-len out of range, or not power of 2");
+ return -ERANGE;
+ }
+
if (netif_running(dev))
bnxt_close_nic(bp, false, false);
@@ -874,6 +891,7 @@ static int bnxt_set_ringparam(struct net_device *dev,
bp->rx_ring_size = ering->rx_pending;
bp->tx_ring_size = ering->tx_pending;
+ bp->rx_page_size = kernel_ering->rx_buf_len;
bnxt_set_ring_params(bp);
if (netif_running(dev))
@@ -5489,7 +5507,8 @@ const struct ethtool_ops bnxt_ethtool_ops = {
ETHTOOL_COALESCE_STATS_BLOCK_USECS |
ETHTOOL_COALESCE_USE_ADAPTIVE_RX |
ETHTOOL_COALESCE_USE_CQE,
- .supported_ring_params = ETHTOOL_RING_USE_TCP_DATA_SPLIT |
+ .supported_ring_params = ETHTOOL_RING_USE_RX_BUF_LEN |
+ ETHTOOL_RING_USE_TCP_DATA_SPLIT |
ETHTOOL_RING_USE_HDS_THRS,
.get_link_ksettings = bnxt_get_link_ksettings,
.set_link_ksettings = bnxt_set_link_ksettings,
--
2.49.0
Powered by blists - more mailing lists