[PATCH net-next v3 08/23] eth: bnxt: set page pool page order based on rx_page_size

Pavel Begunkov posted 23 patches 1 month, 2 weeks ago
[PATCH net-next v3 08/23] eth: bnxt: set page pool page order based on rx_page_size
Posted by Pavel Begunkov 1 month, 2 weeks ago
From: Jakub Kicinski <kuba@kernel.org>

If user decides to increase the buffer size for agg ring
we need to ask the page pool for higher order pages.
There is no need to use larger pages for header frags,
if user increase the size of agg ring buffers switch
to separate header page automatically.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
[pavel: calculate adjust max_len]
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 5307b33ea1c7..d3d9b72ef313 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -3824,11 +3824,13 @@ static int bnxt_alloc_rx_page_pool(struct bnxt *bp,
 	pp.pool_size = bp->rx_agg_ring_size / agg_size_fac;
 	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.nid = numa_node;
 	pp.netdev = bp->dev;
 	pp.dev = &bp->pdev->dev;
 	pp.dma_dir = bp->rx_dir;
-	pp.max_len = PAGE_SIZE;
+	pp.max_len = PAGE_SIZE << pp.order;
 	pp.flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV |
 		   PP_FLAG_ALLOW_UNREADABLE_NETMEM;
 	pp.queue_idx = rxr->bnapi->index;
@@ -3839,7 +3841,10 @@ static int bnxt_alloc_rx_page_pool(struct bnxt *bp,
 	rxr->page_pool = pool;
 
 	rxr->need_head_pool = page_pool_is_unreadable(pool);
+	rxr->need_head_pool |= !!pp.order;
 	if (bnxt_separate_head_pool(rxr)) {
+		pp.order = 0;
+		pp.max_len = PAGE_SIZE;
 		pp.pool_size = min(bp->rx_ring_size / rx_size_fac, 1024);
 		pp.flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV;
 		pool = page_pool_create(&pp);
-- 
2.49.0
Re: [PATCH net-next v3 08/23] eth: bnxt: set page pool page order based on rx_page_size
Posted by Mina Almasry 1 month, 2 weeks ago
On Mon, Aug 18, 2025 at 6:56 AM Pavel Begunkov <asml.silence@gmail.com> wrote:
>
> From: Jakub Kicinski <kuba@kernel.org>
>
> If user decides to increase the buffer size for agg ring
> we need to ask the page pool for higher order pages.
> There is no need to use larger pages for header frags,
> if user increase the size of agg ring buffers switch
> to separate header page automatically.
>
> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> [pavel: calculate adjust max_len]
> Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
> ---
>  drivers/net/ethernet/broadcom/bnxt/bnxt.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> index 5307b33ea1c7..d3d9b72ef313 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> @@ -3824,11 +3824,13 @@ static int bnxt_alloc_rx_page_pool(struct bnxt *bp,
>         pp.pool_size = bp->rx_agg_ring_size / agg_size_fac;
>         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.nid = numa_node;
>         pp.netdev = bp->dev;
>         pp.dev = &bp->pdev->dev;
>         pp.dma_dir = bp->rx_dir;
> -       pp.max_len = PAGE_SIZE;
> +       pp.max_len = PAGE_SIZE << pp.order;

nit: I assume this could be `pp.max_len = bp->rx_ring_size;` if you
wanted, since bnxt is not actually using the full compound page in the
case that bp->rx_ring_size is not a power of 2. Though doesn't matter
much, either way:

Reviewed-by: Mina Almasry <almasrymina@google.com>

-- 
Thanks,
Mina
Re: [PATCH net-next v3 08/23] eth: bnxt: set page pool page order based on rx_page_size
Posted by Pavel Begunkov 1 month, 2 weeks ago
On 8/19/25 20:43, Mina Almasry wrote:
> On Mon, Aug 18, 2025 at 6:56 AM Pavel Begunkov <asml.silence@gmail.com> wrote:
>>
>> From: Jakub Kicinski <kuba@kernel.org>
>>
>> If user decides to increase the buffer size for agg ring
>> we need to ask the page pool for higher order pages.
>> There is no need to use larger pages for header frags,
>> if user increase the size of agg ring buffers switch
>> to separate header page automatically.
>>
>> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
>> [pavel: calculate adjust max_len]
>> Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
>> ---
>>   drivers/net/ethernet/broadcom/bnxt/bnxt.c | 7 ++++++-
>>   1 file changed, 6 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
>> index 5307b33ea1c7..d3d9b72ef313 100644
>> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
>> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
>> @@ -3824,11 +3824,13 @@ static int bnxt_alloc_rx_page_pool(struct bnxt *bp,
>>          pp.pool_size = bp->rx_agg_ring_size / agg_size_fac;
>>          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.nid = numa_node;
>>          pp.netdev = bp->dev;
>>          pp.dev = &bp->pdev->dev;
>>          pp.dma_dir = bp->rx_dir;
>> -       pp.max_len = PAGE_SIZE;
>> +       pp.max_len = PAGE_SIZE << pp.order;
> 
> nit: I assume this could be `pp.max_len = bp->rx_ring_size;` if you
> wanted, since bnxt is not actually using the full compound page in the
> case that bp->rx_ring_size is not a power of 2. Though doesn't matter
> much, either way:

Yeah, thought it's cleaner to derive it from order in case
sth about rx_page_size changes again and it was already
overlooked once, and it's pow2 anyway

-- 
Pavel Begunkov

Re: [PATCH net-next v3 08/23] eth: bnxt: set page pool page order based on rx_page_size
Posted by Somnath Kotur 1 month, 1 week ago
On Wed, Aug 20, 2025 at 7:23 PM Pavel Begunkov <asml.silence@gmail.com> wrote:
>
> On 8/19/25 20:43, Mina Almasry wrote:
> > On Mon, Aug 18, 2025 at 6:56 AM Pavel Begunkov <asml.silence@gmail.com> wrote:
> >>
> >> From: Jakub Kicinski <kuba@kernel.org>
> >>
> >> If user decides to increase the buffer size for agg ring
> >> we need to ask the page pool for higher order pages.
> >> There is no need to use larger pages for header frags,
> >> if user increase the size of agg ring buffers switch
> >> to separate header page automatically.
> >>
> >> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> >> [pavel: calculate adjust max_len]
> >> Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
> >> ---
> >>   drivers/net/ethernet/broadcom/bnxt/bnxt.c | 7 ++++++-
> >>   1 file changed, 6 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> >> index 5307b33ea1c7..d3d9b72ef313 100644
> >> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> >> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> >> @@ -3824,11 +3824,13 @@ static int bnxt_alloc_rx_page_pool(struct bnxt *bp,
> >>          pp.pool_size = bp->rx_agg_ring_size / agg_size_fac;
> >>          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.nid = numa_node;
> >>          pp.netdev = bp->dev;
> >>          pp.dev = &bp->pdev->dev;
> >>          pp.dma_dir = bp->rx_dir;
> >> -       pp.max_len = PAGE_SIZE;
> >> +       pp.max_len = PAGE_SIZE << pp.order;
> >
> > nit: I assume this could be `pp.max_len = bp->rx_ring_size;` if you
> > wanted, since bnxt is not actually using the full compound page in the
> > case that bp->rx_ring_size is not a power of 2. Though doesn't matter
> > much, either way:
>
> Yeah, thought it's cleaner to derive it from order in case
> sth about rx_page_size changes again and it was already
> overlooked once, and it's pow2 anyway
>
> --
> Pavel Begunkov
>
>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>