RE: [PATCH net v3 2/2] igc: fix AF_XDP receive buffer size for 2K UMEM chunks

From: Loktionov, Aleksandr

Date: Thu Oct 29 2026 - 04:12:41 EST




> -----Original Message-----
> From: Paul Moses <p@xxxxxxx>
> Sent: Wednesday, October 28, 2026 9:35 AM
> To: intel-wired-lan@xxxxxxxxxxxxxxxx
> Cc: netdev@xxxxxxxxxxxxxxx; Nguyen, Anthony L
> <anthony.l.nguyen@xxxxxxxxx>; Kitszel, Przemyslaw
> <przemyslaw.kitszel@xxxxxxxxx>; andrew+netdev@xxxxxxx;
> davem@xxxxxxxxxxxxx; edumazet@xxxxxxxxxx; kuba@xxxxxxxxxx;
> pabeni@xxxxxxxxxx; ast@xxxxxxxxxx; daniel@xxxxxxxxxxxxx;
> hawk@xxxxxxxxxx; john.fastabend@xxxxxxxxx; sdf@xxxxxxxxxxx;
> vedang.patel@xxxxxxxxx; jithu.joseph@xxxxxxxxx; Fijalkowski, Maciej
> <maciej.fijalkowski@xxxxxxxxx>; andre.guedes@xxxxxxxxx; Loktionov,
> Aleksandr <aleksandr.loktionov@xxxxxxxxx>; Dahan, AvigailX
> <avigailx.dahan@xxxxxxxxx>; linux-kernel@xxxxxxxxxxxxxxx;
> bpf@xxxxxxxxxxxxxxx; stable@xxxxxxxxxxxxxxx
> 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 <maciej.fijalkowski@xxxxxxxxx>
>
> 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 <maciej.fijalkowski@xxxxxxxxx>
> Signed-off-by: Paul Moses <p@xxxxxxx>
> ---
> 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 <aleksandr.loktionov@xxxxxxxxx>