Re: [PATCH net-next 3/4] eth: mpnic: set Rx buffer minimums using page size and mtu

From: Harshitha Ramamurthy

Date: Fri Oct 02 2026 - 20:50:20 EST


On Thu, Oct 1, 2026 at 9:46 AM Daniel Zahka <daniel.zahka@xxxxxxxxx> wrote:
>
> Set buffer based drop thresholds in the Rx path based on page size and
> the max MTU supported. The device will drop packets if it does not have
> at least the minimum number of completely unused buffer descriptors
> available.
>
> These thresholds are currently set to 17 BDs for both HPQ and PPQ. These

nit: if there is a v2, it would be helpful for review if terms like
PPQ/HPQ were expanded here.

> are overly conservative. With our current max MTU of 9742B, the settings
> we should target are:
>
> 4KiB page size: 1 HPQ, 3 PPQ
> 64KiB page size: 1 HPQ, 1 PPQ
>
> The HPQ and PPQ rings are always given PAGE_SIZE sized buffers.
>
> The RDE_CTL register encodes the thresholds as one less than the number
> of BDs needed.
>
> Signed-off-by: Daniel Zahka <daniel.zahka@xxxxxxxxx>
> ---
> drivers/net/ethernet/meta/mpnic/mpnic_init.c | 13 +++++++++----
> drivers/net/ethernet/meta/mpnic/mpnic_txrx.h | 6 ++++++
> 2 files changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/ethernet/meta/mpnic/mpnic_init.c b/drivers/net/ethernet/meta/mpnic/mpnic_init.c
> index 2daed458f5fc..ace4124158fb 100644
> --- a/drivers/net/ethernet/meta/mpnic/mpnic_init.c
> +++ b/drivers/net/ethernet/meta/mpnic/mpnic_init.c
> @@ -10,6 +10,7 @@
> #include <linux/sizes.h>
>
> #include "mpnic.h"
> +#include "mpnic_txrx.h"
>
> #define MPNIC_MEM_INIT_POLL_US 500
> #define MPNIC_MEM_INIT_TO_US 5000
> @@ -272,10 +273,14 @@ static void mpnic_rxglb_init(struct mpnic_dev *mpd)
> * the per-queue prefetch FIFO.
> */
> mpnic_wr64(mpd, MPNIC_RDE_CTL,
> - FIELD_PREP(MPNIC_RDE_CTL_HPQ_DROP_THRESHOLD, 16) |
> - FIELD_PREP(MPNIC_RDE_CTL_PPQ_DROP_THRESHOLD, 16) |
> - FIELD_PREP(MPNIC_RDE_CTL_HPQ_LOCAL_DROP_THRESHOLD, 16) |
> - FIELD_PREP(MPNIC_RDE_CTL_PPQ_LOCAL_DROP_THRESHOLD, 16));
> + FIELD_PREP(MPNIC_RDE_CTL_HPQ_DROP_THRESHOLD,
> + MPNIC_RX_HPQ_DROP_THRS - 1) |
> + FIELD_PREP(MPNIC_RDE_CTL_PPQ_DROP_THRESHOLD,
> + MPNIC_RX_PPQ_DROP_THRS - 1) |
> + FIELD_PREP(MPNIC_RDE_CTL_HPQ_LOCAL_DROP_THRESHOLD,
> + MPNIC_RX_HPQ_DROP_THRS - 1) |
> + FIELD_PREP(MPNIC_RDE_CTL_PPQ_LOCAL_DROP_THRESHOLD,
> + MPNIC_RX_PPQ_DROP_THRS - 1));
>
> /* Receive side coalescing is not supported yet */
> mpnic_wr64(mpd, MPNIC_RSC_GLOBAL_CONF,
> diff --git a/drivers/net/ethernet/meta/mpnic/mpnic_txrx.h b/drivers/net/ethernet/meta/mpnic/mpnic_txrx.h
> index 834eb9bfffd1..9397010557eb 100644
> --- a/drivers/net/ethernet/meta/mpnic/mpnic_txrx.h
> +++ b/drivers/net/ethernet/meta/mpnic/mpnic_txrx.h
> @@ -58,6 +58,12 @@ struct mpnic_net;
>
> #define MPNIC_MAX_JUMBO_FRAME_SIZE 9742
>
> +#define MPNIC_RX_HPQ_DROP_THRS \
> + DIV_ROUND_UP(MPNIC_RX_HROOM + MPNIC_RX_MAX_HDR + MPNIC_RX_TROOM, \
> + PAGE_SIZE)
> +#define MPNIC_RX_PPQ_DROP_THRS \
> + DIV_ROUND_UP(MPNIC_MAX_JUMBO_FRAME_SIZE, PAGE_SIZE)
> +
> /* The page a buffer descriptor queue is currently handing out. Records
> * how many of the references taken on it are still unused.
> */
>
> --
> 2.52.0
>
>