Re: [PATCH net-next v8 5/9] eth: bnxt: store rx buffer size per queue

2026-01-13 Thread Pavel Begunkov

On 1/13/26 10:19, Paolo Abeni wrote:

On 1/9/26 12:28 PM, Pavel Begunkov wrote:

@@ -4478,7 +4485,7 @@ static void bnxt_init_one_rx_agg_ring_rxbd(struct bnxt 
*bp,
ring = &rxr->rx_agg_ring_struct;
ring->fw_ring_id = INVALID_HW_RING_ID;
if ((bp->flags & BNXT_FLAG_AGG_RINGS)) {
-   type = ((u32)BNXT_RX_PAGE_SIZE << RX_BD_LEN_SHIFT) |
+   type = ((u32)(u32)rxr->rx_page_size << RX_BD_LEN_SHIFT) |


Minor nit: duplicate cast above.


oops, missed that, thanks




diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h 
b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index f5f07a7e6b29..4c880a9fba92 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -1107,6 +1107,7 @@ struct bnxt_rx_ring_info {
  
  	unsigned long		*rx_agg_bmap;

u16 rx_agg_bmap_size;
+   u16 rx_page_size;


Any special reason for using u16 above? AFAICS using u32 will not change
the struct size on 64 bit arches, and using u32 will likely yield better
code.


IIRC bnxt doesn't support more than 2^16-1, but it doesn't really
matter, I can convert it to u32.

--
Pavel Begunkov




Re: [PATCH net-next v8 5/9] eth: bnxt: store rx buffer size per queue

2026-01-13 Thread Paolo Abeni
On 1/9/26 12:28 PM, Pavel Begunkov wrote:
> @@ -4478,7 +4485,7 @@ static void bnxt_init_one_rx_agg_ring_rxbd(struct bnxt 
> *bp,
>   ring = &rxr->rx_agg_ring_struct;
>   ring->fw_ring_id = INVALID_HW_RING_ID;
>   if ((bp->flags & BNXT_FLAG_AGG_RINGS)) {
> - type = ((u32)BNXT_RX_PAGE_SIZE << RX_BD_LEN_SHIFT) |
> + type = ((u32)(u32)rxr->rx_page_size << RX_BD_LEN_SHIFT) |

Minor nit: duplicate cast above.

> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h 
> b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
> index f5f07a7e6b29..4c880a9fba92 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
> @@ -1107,6 +1107,7 @@ struct bnxt_rx_ring_info {
>  
>   unsigned long   *rx_agg_bmap;
>   u16 rx_agg_bmap_size;
> + u16 rx_page_size;

Any special reason for using u16 above? AFAICS using u32 will not change
the struct size on 64 bit arches, and using u32 will likely yield better
code.

/P




[PATCH net-next v8 5/9] eth: bnxt: store rx buffer size per queue

2026-01-09 Thread Pavel Begunkov
Instead of using a constant buffer length, allow configuring the size
for each queue separately. There is no way to change the length yet, and
it'll be passed from memory providers in a later patch.

Suggested-by: Jakub Kicinski 
Signed-off-by: Pavel Begunkov 
---
 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 56 +++
 drivers/net/ethernet/broadcom/bnxt/bnxt.h |  1 +
 drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c |  6 +-
 drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h |  2 +-
 4 files changed, 38 insertions(+), 27 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c 
b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 73f954da39b9..8f42885a7c86 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -905,7 +905,7 @@ static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi 
*bnapi, int budget)
 
 static bool bnxt_separate_head_pool(struct bnxt_rx_ring_info *rxr)
 {
-   return rxr->need_head_pool || PAGE_SIZE > BNXT_RX_PAGE_SIZE;
+   return rxr->need_head_pool || rxr->rx_page_size < PAGE_SIZE;
 }
 
 static struct page *__bnxt_alloc_rx_page(struct bnxt *bp, dma_addr_t *mapping,
@@ -915,9 +915,9 @@ static struct page *__bnxt_alloc_rx_page(struct bnxt *bp, 
dma_addr_t *mapping,
 {
struct page *page;
 
-   if (PAGE_SIZE > BNXT_RX_PAGE_SIZE) {
+   if (rxr->rx_page_size < PAGE_SIZE) {
page = page_pool_dev_alloc_frag(rxr->page_pool, offset,
-   BNXT_RX_PAGE_SIZE);
+   rxr->rx_page_size);
} else {
page = page_pool_dev_alloc_pages(rxr->page_pool);
*offset = 0;
@@ -936,8 +936,9 @@ static netmem_ref __bnxt_alloc_rx_netmem(struct bnxt *bp, 
dma_addr_t *mapping,
 {
netmem_ref netmem;
 
-   if (PAGE_SIZE > BNXT_RX_PAGE_SIZE) {
-   netmem = page_pool_alloc_frag_netmem(rxr->page_pool, offset, 
BNXT_RX_PAGE_SIZE, gfp);
+   if (rxr->rx_page_size < PAGE_SIZE) {
+   netmem = page_pool_alloc_frag_netmem(rxr->page_pool, offset,
+rxr->rx_page_size, gfp);
} else {
netmem = page_pool_alloc_netmems(rxr->page_pool, gfp);
*offset = 0;
@@ -1155,9 +1156,9 @@ static struct sk_buff *bnxt_rx_multi_page_skb(struct bnxt 
*bp,
return NULL;
}
dma_addr -= bp->rx_dma_offset;
-   dma_sync_single_for_cpu(&bp->pdev->dev, dma_addr, BNXT_RX_PAGE_SIZE,
+   dma_sync_single_for_cpu(&bp->pdev->dev, dma_addr, rxr->rx_page_size,
bp->rx_dir);
-   skb = napi_build_skb(data_ptr - bp->rx_offset, BNXT_RX_PAGE_SIZE);
+   skb = napi_build_skb(data_ptr - bp->rx_offset, rxr->rx_page_size);
if (!skb) {
page_pool_recycle_direct(rxr->page_pool, page);
return NULL;
@@ -1189,7 +1190,7 @@ static struct sk_buff *bnxt_rx_page_skb(struct bnxt *bp,
return NULL;
}
dma_addr -= bp->rx_dma_offset;
-   dma_sync_single_for_cpu(&bp->pdev->dev, dma_addr, BNXT_RX_PAGE_SIZE,
+   dma_sync_single_for_cpu(&bp->pdev->dev, dma_addr, rxr->rx_page_size,
bp->rx_dir);
 
if (unlikely(!payload))
@@ -1203,7 +1204,7 @@ static struct sk_buff *bnxt_rx_page_skb(struct bnxt *bp,
 
skb_mark_for_recycle(skb);
off = (void *)data_ptr - page_address(page);
-   skb_add_rx_frag(skb, 0, page, off, len, BNXT_RX_PAGE_SIZE);
+   skb_add_rx_frag(skb, 0, page, off, len, rxr->rx_page_size);
memcpy(skb->data - NET_IP_ALIGN, data_ptr - NET_IP_ALIGN,
   payload + NET_IP_ALIGN);
 
@@ -1288,7 +1289,7 @@ static u32 __bnxt_rx_agg_netmems(struct bnxt *bp,
if (skb) {
skb_add_rx_frag_netmem(skb, i, cons_rx_buf->netmem,
   cons_rx_buf->offset,
-  frag_len, BNXT_RX_PAGE_SIZE);
+  frag_len, rxr->rx_page_size);
} else {
skb_frag_t *frag = &shinfo->frags[i];
 
@@ -1313,7 +1314,7 @@ static u32 __bnxt_rx_agg_netmems(struct bnxt *bp,
if (skb) {
skb->len -= frag_len;
skb->data_len -= frag_len;
-   skb->truesize -= BNXT_RX_PAGE_SIZE;
+   skb->truesize -= rxr->rx_page_size;
}
 
--shinfo->nr_frags;
@@ -1328,7 +1329,7 @@ static u32 __bnxt_rx_agg_netmems(struct bnxt *bp,
}
 
page_pool_dma_sync_netmem_for_cpu(rxr->page_pool, netmem, 0,
- BNXT_RX_PAGE_SIZE);
+ rxr->rx_page_size);