> -----Original Message-----
> From: Paul Moses <[email protected]>
> Sent: Wednesday, October 28, 2026 9:35 AM
> To: [email protected]
> Cc: [email protected]; Nguyen, Anthony L
> <[email protected]>; Kitszel, Przemyslaw
> <[email protected]>; [email protected];
> [email protected]; [email protected]; [email protected];
> [email protected]; [email protected]; [email protected];
> [email protected]; [email protected]; [email protected];
> [email protected]; [email protected]; Fijalkowski, Maciej
> <[email protected]>; [email protected]; Loktionov,
> Aleksandr <[email protected]>; Dahan, AvigailX
> <[email protected]>; [email protected];
> [email protected]; [email protected]
> Subject: [PATCH net v3 2/2] igc: fix AF_XDP receive buffer size for 2K
> UMEM chunks
> 
nit: Perhaps use "2 KiB" instead of "2K" here, as the latter does not
specify the unit.

> From: Maciej Fijalkowski <[email protected]>
> 
> SRRCTL.BSIZEPKT has a granularity of 1 KiB. With a 2 KiB UMEM chunk and
> the default XDP headroom, xsk_pool_get_rx_frame_size() returns 1792.
> Programming this value truncates the hardware receive buffer size to 1
> KiB, even though an MTU-sized frame fits in the usable UMEM area.
> 
> XDP on igc is limited to MTU 1500, so configure a 2 KiB receive buffer
> for XSK rings. Limit RLPML to the maximum supported Ethernet frame size
> while XDP is attached, regardless of PAGE_SIZE, to avoid oversized
> frames spanning descriptors or exceeding the usable UMEM space.
> 
> RLPML is currently programmed from igc_set_rx_mode(), which can run
> without RTNL, for example on an IPv6 multicast join, and could then use
> a stale XDP state. RLPML does not depend on the address lists.
> Program it from igc_setup_rctl() instead, next to RCTL.LPE, and from
> igc_xdp_set_prog() while the rings are disabled. This avoids
> netif_addr_lock_bh() usage.
> 
> Validate that the XSK frame size accommodates a maximum-size frame with
> two VLAN tags, FCS and the optional inline RX timestamp. Check against
> the maximum supported XDP MTU, rather than the current MTU, which can
> change after the socket is bound.
> 
> Fixes: fc9df2a0b520 ("igc: Enable RX via AF_XDP zero-copy")
> Signed-off-by: Maciej Fijalkowski <[email protected]>
> Signed-off-by: Paul Moses <[email protected]>
> ---
>  drivers/net/ethernet/intel/igc/igc.h      |  1 +
>  drivers/net/ethernet/intel/igc/igc_main.c | 33 +++++++++++++++++------
> drivers/net/ethernet/intel/igc/igc_xdp.c  | 11 +++++---
>  3 files changed, 33 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/igc/igc.h
> b/drivers/net/ethernet/intel/igc/igc.h
> index 17f213cc9..ad1062f85 100644
> --- a/drivers/net/ethernet/intel/igc/igc.h
> +++ b/drivers/net/ethernet/intel/igc/igc.h
> @@ -765,6 +765,7 @@ static inline s32 igc_read_phy_reg(struct igc_hw
> *hw, u32 offset, u16 *data)
>       return -EOPNOTSUPP;
>  }
> 
> +void igc_set_rlpml(struct igc_adapter *adapter);
>  void igc_reinit_locked(struct igc_adapter *);  struct igc_nfc_rule
> *igc_get_nfc_rule(struct igc_adapter *adapter,
>                                     u32 location);
> diff --git a/drivers/net/ethernet/intel/igc/igc_main.c
> b/drivers/net/ethernet/intel/igc/igc_main.c
> index 41b293dc1..6b418dc71 100644
> --- a/drivers/net/ethernet/intel/igc/igc_main.c
> +++ b/drivers/net/ethernet/intel/igc/igc_main.c
> @@ -674,8 +674,11 @@ static void igc_configure_rx_ring(struct
> igc_adapter *adapter,
>       ring->next_to_clean = 0;
>       ring->next_to_use = 0;
> 

Also, below:

> +     /* igc's XDP limits MTU to 1500; all XSK RX buffers can use 2kb;
> +      * RLPML limits the receive length to fit after UMEM headroom.
> +      */

"2kb" normally means 2 kilobits, whereas the buffer size here is
2048 bytes. I suggest using "2 KiB" consistently in the subject,
commit message, and comments.

...

Also, below:

> +     /* igc's XDP currently does not support jumbo frames. Limit the
> +      * accepted packet size regardless of PAGE_SIZE so it fits in a
> 2kb
> +      * XSK chunk.
> +      */
> +     if (igc_xdp_is_enabled(adapter))
> +             rlpml = ETH_FRAME_LEN + VLAN_HLEN * 2 + ETH_FCS_LEN;
> +
> +     wr32(IGC_RLPML, rlpml);
> +}
> +


Otherwise, looks fine for me
Reviewed-by: Aleksandr Loktionov <[email protected]>

Reply via email to