RE: [PATCH net] ixgbevf: Require large buffers for build_skb on 82599VF

From: Jankowski, Konrad0
Date: Wed Feb 02 2022 - 14:34:40 EST




> -----Original Message-----
> From: Samuel Mendoza-Jonas <samjonas@xxxxxxxxxx>
> Sent: Thursday, January 13, 2022 12:33 AM
> To: netdev@xxxxxxxxxxxxxxx; intel-wired-lan@xxxxxxxxxxxxxxxx
> Cc: Samuel Mendoza-Jonas <samjonas@xxxxxxxxxx>; Brandeburg, Jesse
> <jesse.brandeburg@xxxxxxxxx>; David S . Miller <davem@xxxxxxxxxxxxx>;
> Nguyen, Anthony L <anthony.l.nguyen@xxxxxxxxx>; Jakub Kicinski
> <kuba@xxxxxxxxxx>; linux-kernel@xxxxxxxxxxxxxxx
> Subject: [PATCH net] ixgbevf: Require large buffers for build_skb on 82599VF
>
> From 4.17 onwards the ixgbevf driver uses build_skb() to build an skb around
> new data in the page buffer shared with the ixgbe PF.
> This uses either a 2K or 3K buffer, and offsets the DMA mapping by
> NET_SKB_PAD + NET_IP_ALIGN. When using a smaller buffer RXDCTL is set
> to ensure the PF does not write a full 2K bytes into the buffer, which is
> actually 2K minus the offset.
>
> However on the 82599 virtual function, the RXDCTL mechanism is not
> available. The driver attempts to work around this by using the SET_LPE
> mailbox method to lower the maximm frame size, but the ixgbe PF driver
> ignores this in order to keep the PF and all VFs in sync[0].
>
> This means the PF will write up to the full 2K set in SRRCTL, causing it to write
> NET_SKB_PAD + NET_IP_ALIGN bytes past the end of the buffer.
> With 4K pages split into two buffers, this means it either writes
> NET_SKB_PAD + NET_IP_ALIGN bytes past the first buffer (and into the
> second), or NET_SKB_PAD + NET_IP_ALIGN bytes past the end of the DMA
> mapping.
>
> Avoid this by only enabling build_skb when using "large" buffers (3K).
> These are placed in each half of an order-1 page, preventing the PF from
> writing past the end of the mapping.
>
> [0]: Technically it only ever raises the max frame size, see
> ixgbe_set_vf_lpe() in ixgbe_sriov.c
>
> Signed-off-by: Samuel Mendoza-Jonas <samjonas@xxxxxxxxxx>
> ---
> drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 13 +++++++------
> 1 file changed, 7 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
> b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
> index 0015fcf1df2b..0f293acd17e8 100644
> --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
> +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c

Tested-by: Konrad Jankowski <konrad0.jankowski@xxxxxxxxx>