]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/mlx5e: SHAMPO, Fix skb size check for 64K pages
authorDragos Tatulea <dtatulea@nvidia.com>
Tue, 4 Nov 2025 06:48:34 +0000 (08:48 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 6 Nov 2025 01:48:36 +0000 (17:48 -0800)
mlx5e_hw_gro_skb_has_enough_space() uses a formula to check if there is
enough space in the skb frags to store more data. This formula is
incorrect for 64K page sizes and it triggers early GRO session
termination because the first fragment will blow up beyond
GRO_LEGACY_MAX_SIZE.

This patch adds a special case for page sizes >= GRO_LEGACY_MAX_SIZE
(64K) which uses the skb->len instead. Within this context,
the check is safe from fragment overflow because the hardware
will continuously fill the data up to the reservation size of 64K
and the driver will coalesce all data from the same page to the same
fragment. This means that the data will span one fragment or at most
two for such a large page size.

It is expected that the if statement will be optimized out as the
check is done with constants.

Fixes: 92552d3abd32 ("net/mlx5e: HW_GRO cqe handler implementation")
Signed-off-by: Dragos Tatulea <dtatulea@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/1762238915-1027590-3-git-send-email-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c

index 0c031954ca30a83e93e14b656808fb4319d6aee6..f2a06752ce37517278de9c340b39475ca6ff8ca2 100644 (file)
@@ -2354,7 +2354,10 @@ mlx5e_hw_gro_skb_has_enough_space(struct sk_buff *skb, u16 data_bcnt)
 {
        int nr_frags = skb_shinfo(skb)->nr_frags;
 
-       return PAGE_SIZE * nr_frags + data_bcnt <= GRO_LEGACY_MAX_SIZE;
+       if (PAGE_SIZE >= GRO_LEGACY_MAX_SIZE)
+               return skb->len + data_bcnt <= GRO_LEGACY_MAX_SIZE;
+       else
+               return PAGE_SIZE * nr_frags + data_bcnt <= GRO_LEGACY_MAX_SIZE;
 }
 
 static void mlx5e_handle_rx_cqe_mpwrq_shampo(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)