Skip to content

Commit 0049fd6

Browse files
ameryhunggregkh
authored andcommitted
net/mlx5e: RX, Fix generating skb from non-linear xdp_buff for legacy RQ
[ Upstream commit afd5ba5 ] XDP programs can release xdp_buff fragments when calling bpf_xdp_adjust_tail(). The driver currently assumes the number of fragments to be unchanged and may generate skb with wrong truesize or containing invalid frags. Fix the bug by generating skb according to xdp_buff after the XDP program runs. Fixes: ea5d49b ("net/mlx5e: Add XDP multi buffer support to the non-linear legacy RQ") Reviewed-by: Dragos Tatulea <dtatulea@nvidia.com> Signed-off-by: Amery Hung <ameryhung@gmail.com> Signed-off-by: Tariq Toukan <tariqt@nvidia.com> Link: https://patch.msgid.link/1760644540-899148-2-git-send-email-tariqt@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent ae71c16 commit 0049fd6

File tree

1 file changed

+19
-6
lines changed
  • drivers/net/ethernet/mellanox/mlx5/core

1 file changed

+19
-6
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en_rx.c

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1768,14 +1768,27 @@ mlx5e_skb_from_cqe_nonlinear(struct mlx5e_rq *rq, struct mlx5e_wqe_frag_info *wi
17681768
}
17691769

17701770
prog = rcu_dereference(rq->xdp_prog);
1771-
if (prog && mlx5e_xdp_handle(rq, prog, mxbuf)) {
1772-
if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) {
1773-
struct mlx5e_wqe_frag_info *pwi;
1771+
if (prog) {
1772+
u8 nr_frags_free, old_nr_frags = sinfo->nr_frags;
1773+
1774+
if (mlx5e_xdp_handle(rq, prog, mxbuf)) {
1775+
if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT,
1776+
rq->flags)) {
1777+
struct mlx5e_wqe_frag_info *pwi;
1778+
1779+
wi -= old_nr_frags - sinfo->nr_frags;
1780+
1781+
for (pwi = head_wi; pwi < wi; pwi++)
1782+
pwi->frag_page->frags++;
1783+
}
1784+
return NULL; /* page/packet was consumed by XDP */
1785+
}
17741786

1775-
for (pwi = head_wi; pwi < wi; pwi++)
1776-
pwi->frag_page->frags++;
1787+
nr_frags_free = old_nr_frags - sinfo->nr_frags;
1788+
if (unlikely(nr_frags_free)) {
1789+
wi -= nr_frags_free;
1790+
truesize -= nr_frags_free * frag_info->frag_stride;
17771791
}
1778-
return NULL; /* page/packet was consumed by XDP */
17791792
}
17801793

17811794
skb = mlx5e_build_linear_skb(

0 commit comments

Comments
 (0)