[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CAOBf=mt_3rJHztyncv=hF9nPhz8ZuOJscsyHgz_fapOQ9Twgrg@mail.gmail.com>
Date: Mon, 25 Aug 2025 11:54:35 +0530
From: Somnath Kotur <somnath.kotur@...adcom.com>
To: Pavel Begunkov <asml.silence@...il.com>
Cc: Jakub Kicinski <kuba@...nel.org>, netdev@...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,
linux-kernel@...r.kernel.org, io-uring@...r.kernel.org
Subject: Re: [PATCH net-next v3 16/23] eth: bnxt: store the rx buf size per queue
On Mon, Aug 18, 2025 at 7:45 PM Pavel Begunkov <asml.silence@...il.com> wrote:
>
> From: Jakub Kicinski <kuba@...nel.org>
>
> In normal operation only a subset of queues is configured for
> zero-copy. Since zero-copy is the main use for larger buffer
> sizes we need to configure the sizes per queue.
>
> Signed-off-by: Jakub Kicinski <kuba@...nel.org>
> Signed-off-by: Pavel Begunkov <asml.silence@...il.com>
> ---
> drivers/net/ethernet/broadcom/bnxt/bnxt.c | 46 ++++++++++---------
> 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, 30 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> index 467e8a0745e1..50f663777843 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> @@ -900,7 +900,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 > rxr->bnapi->bp->rx_page_size;
> + return rxr->need_head_pool || PAGE_SIZE > rxr->rx_page_size;
> }
>
> static struct page *__bnxt_alloc_rx_page(struct bnxt *bp, dma_addr_t *mapping,
> @@ -910,9 +910,9 @@ static struct page *__bnxt_alloc_rx_page(struct bnxt *bp, dma_addr_t *mapping,
> {
> struct page *page;
>
> - if (PAGE_SIZE > bp->rx_page_size) {
> + if (PAGE_SIZE > rxr->rx_page_size) {
> page = page_pool_dev_alloc_frag(rxr->page_pool, offset,
> - bp->rx_page_size);
> + rxr->rx_page_size);
> } else {
> page = page_pool_dev_alloc_pages(rxr->page_pool);
> *offset = 0;
> @@ -1150,9 +1150,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, bp->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, bp->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;
> @@ -1184,7 +1184,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, bp->rx_page_size,
> + dma_sync_single_for_cpu(&bp->pdev->dev, dma_addr, rxr->rx_page_size,
> bp->rx_dir);
>
> if (unlikely(!payload))
> @@ -1198,7 +1198,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, bp->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);
>
> @@ -1283,7 +1283,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, bp->rx_page_size);
> + frag_len, rxr->rx_page_size);
> } else {
> skb_frag_t *frag = &shinfo->frags[i];
>
> @@ -1308,7 +1308,7 @@ static u32 __bnxt_rx_agg_netmems(struct bnxt *bp,
> if (skb) {
> skb->len -= frag_len;
> skb->data_len -= frag_len;
> - skb->truesize -= bp->rx_page_size;
> + skb->truesize -= rxr->rx_page_size;
> }
>
> --shinfo->nr_frags;
> @@ -1323,7 +1323,7 @@ static u32 __bnxt_rx_agg_netmems(struct bnxt *bp,
> }
>
> page_pool_dma_sync_netmem_for_cpu(rxr->page_pool, netmem, 0,
> - bp->rx_page_size);
> + rxr->rx_page_size);
>
> total_frag_len += frag_len;
> prod = NEXT_RX_AGG(prod);
> @@ -2276,8 +2276,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
> if (!skb)
> goto oom_next_rx;
> } else {
> - skb = bnxt_xdp_build_skb(bp, skb, agg_bufs,
> - rxr->page_pool, &xdp);
> + skb = bnxt_xdp_build_skb(bp, skb, agg_bufs, rxr, &xdp);
> if (!skb) {
> /* we should be able to free the old skb here */
> bnxt_xdp_buff_frags_free(rxr, &xdp);
> @@ -3825,7 +3824,7 @@ static int bnxt_alloc_rx_page_pool(struct bnxt *bp,
> if (BNXT_RX_PAGE_MODE(bp))
> pp.pool_size += bp->rx_ring_size / rx_size_fac;
>
> - pp.order = get_order(bp->rx_page_size);
> + pp.order = get_order(rxr->rx_page_size);
> pp.nid = numa_node;
> pp.netdev = bp->dev;
> pp.dev = &bp->pdev->dev;
> @@ -4318,6 +4317,8 @@ static void bnxt_init_ring_struct(struct bnxt *bp)
> if (!rxr)
> goto skip_rx;
>
> + rxr->rx_page_size = bp->rx_page_size;
> +
> ring = &rxr->rx_ring_struct;
> rmem = &ring->ring_mem;
> rmem->nr_pages = bp->rx_nr_pages;
> @@ -4477,7 +4478,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)bp->rx_page_size << RX_BD_LEN_SHIFT) |
> + type = ((u32)rxr->rx_page_size << RX_BD_LEN_SHIFT) |
> RX_BD_TYPE_RX_AGG_BD | RX_BD_FLAGS_SOP;
>
> bnxt_init_rxbd_pages(ring, type);
> @@ -7042,6 +7043,7 @@ static void bnxt_hwrm_ring_grp_free(struct bnxt *bp)
>
> static void bnxt_set_rx_ring_params_p5(struct bnxt *bp, u32 ring_type,
> struct hwrm_ring_alloc_input *req,
> + struct bnxt_rx_ring_info *rxr,
> struct bnxt_ring_struct *ring)
> {
> struct bnxt_ring_grp_info *grp_info = &bp->grp_info[ring->grp_idx];
> @@ -7051,7 +7053,7 @@ static void bnxt_set_rx_ring_params_p5(struct bnxt *bp, u32 ring_type,
> if (ring_type == HWRM_RING_ALLOC_AGG) {
> req->ring_type = RING_ALLOC_REQ_RING_TYPE_RX_AGG;
> req->rx_ring_id = cpu_to_le16(grp_info->rx_fw_ring_id);
> - req->rx_buf_size = cpu_to_le16(bp->rx_page_size);
> + req->rx_buf_size = cpu_to_le16(rxr->rx_page_size);
> enables |= RING_ALLOC_REQ_ENABLES_RX_RING_ID_VALID;
> } else {
> req->rx_buf_size = cpu_to_le16(bp->rx_buf_use_size);
> @@ -7065,6 +7067,7 @@ static void bnxt_set_rx_ring_params_p5(struct bnxt *bp, u32 ring_type,
> }
>
> static int hwrm_ring_alloc_send_msg(struct bnxt *bp,
> + struct bnxt_rx_ring_info *rxr,
> struct bnxt_ring_struct *ring,
> u32 ring_type, u32 map_index)
> {
> @@ -7121,7 +7124,8 @@ static int hwrm_ring_alloc_send_msg(struct bnxt *bp,
> cpu_to_le32(bp->rx_ring_mask + 1) :
> cpu_to_le32(bp->rx_agg_ring_mask + 1);
> if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
> - bnxt_set_rx_ring_params_p5(bp, ring_type, req, ring);
> + bnxt_set_rx_ring_params_p5(bp, ring_type, req,
> + rxr, ring);
> break;
> case HWRM_RING_ALLOC_CMPL:
> req->ring_type = RING_ALLOC_REQ_RING_TYPE_L2_CMPL;
> @@ -7269,7 +7273,7 @@ static int bnxt_hwrm_rx_ring_alloc(struct bnxt *bp,
> u32 map_idx = bnapi->index;
> int rc;
>
> - rc = hwrm_ring_alloc_send_msg(bp, ring, type, map_idx);
> + rc = hwrm_ring_alloc_send_msg(bp, rxr, ring, type, map_idx);
> if (rc)
> return rc;
>
> @@ -7289,7 +7293,7 @@ static int bnxt_hwrm_rx_agg_ring_alloc(struct bnxt *bp,
> int rc;
>
> map_idx = grp_idx + bp->rx_nr_rings;
> - rc = hwrm_ring_alloc_send_msg(bp, ring, type, map_idx);
> + rc = hwrm_ring_alloc_send_msg(bp, rxr, ring, type, map_idx);
> if (rc)
> return rc;
>
> @@ -7313,7 +7317,7 @@ static int bnxt_hwrm_cp_ring_alloc_p5(struct bnxt *bp,
>
> ring = &cpr->cp_ring_struct;
> ring->handle = BNXT_SET_NQ_HDL(cpr);
> - rc = hwrm_ring_alloc_send_msg(bp, ring, type, map_idx);
> + rc = hwrm_ring_alloc_send_msg(bp, NULL, ring, type, map_idx);
> if (rc)
> return rc;
> bnxt_set_db(bp, &cpr->cp_db, type, map_idx, ring->fw_ring_id);
> @@ -7328,7 +7332,7 @@ static int bnxt_hwrm_tx_ring_alloc(struct bnxt *bp,
> const u32 type = HWRM_RING_ALLOC_TX;
> int rc;
>
> - rc = hwrm_ring_alloc_send_msg(bp, ring, type, tx_idx);
> + rc = hwrm_ring_alloc_send_msg(bp, NULL, ring, type, tx_idx);
> if (rc)
> return rc;
> bnxt_set_db(bp, &txr->tx_db, type, tx_idx, ring->fw_ring_id);
> @@ -7354,7 +7358,7 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp)
>
> vector = bp->irq_tbl[map_idx].vector;
> disable_irq_nosync(vector);
> - rc = hwrm_ring_alloc_send_msg(bp, ring, type, map_idx);
> + rc = hwrm_ring_alloc_send_msg(bp, NULL, ring, type, map_idx);
> if (rc) {
> enable_irq(vector);
> goto err_out;
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
> index 56aafae568f8..4f9d4c71c0e2 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;
> bool need_head_pool;
>
> dma_addr_t rx_desc_mapping[MAX_RX_PAGES];
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
> index 41d3ba56ba41..19dda0201c69 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
> @@ -183,7 +183,7 @@ void bnxt_xdp_buff_init(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,
> u16 cons, u8 *data_ptr, unsigned int len,
> struct xdp_buff *xdp)
> {
> - u32 buflen = bp->rx_page_size;
> + u32 buflen = rxr->rx_page_size;
> struct bnxt_sw_rx_bd *rx_buf;
> struct pci_dev *pdev;
> dma_addr_t mapping;
> @@ -461,7 +461,7 @@ int bnxt_xdp(struct net_device *dev, struct netdev_bpf *xdp)
>
> struct sk_buff *
> bnxt_xdp_build_skb(struct bnxt *bp, struct sk_buff *skb, u8 num_frags,
> - struct page_pool *pool, struct xdp_buff *xdp)
> + struct bnxt_rx_ring_info *rxr, struct xdp_buff *xdp)
> {
> struct skb_shared_info *sinfo = xdp_get_shared_info_from_buff(xdp);
>
> @@ -470,7 +470,7 @@ bnxt_xdp_build_skb(struct bnxt *bp, struct sk_buff *skb, u8 num_frags,
>
> xdp_update_skb_shared_info(skb, num_frags,
> sinfo->xdp_frags_size,
> - bp->rx_page_size * num_frags,
> + rxr->rx_page_size * num_frags,
> xdp_buff_is_frag_pfmemalloc(xdp));
> return skb;
> }
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h
> index 220285e190fc..8933a0dec09a 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h
> @@ -32,6 +32,6 @@ void bnxt_xdp_buff_init(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,
> void bnxt_xdp_buff_frags_free(struct bnxt_rx_ring_info *rxr,
> struct xdp_buff *xdp);
> struct sk_buff *bnxt_xdp_build_skb(struct bnxt *bp, struct sk_buff *skb,
> - u8 num_frags, struct page_pool *pool,
> + u8 num_frags, struct bnxt_rx_ring_info *rxr,
> struct xdp_buff *xdp);
> #endif
> --
> 2.49.0
>
>
Reviewed-by: Somnath Kotur <somnath.kotur@...adcom.com>
Download attachment "smime.p7s" of type "application/pkcs7-signature" (4199 bytes)
Powered by blists - more mailing lists