Skip to content

Commit aaecf2e

Browse files
ameryhungopsiff
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 <[email protected]> Signed-off-by: Amery Hung <[email protected]> Signed-off-by: Tariq Toukan <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]> Signed-off-by: Sasha Levin <[email protected]> (cherry picked from commit 0049fd63881505566824e88cfa624638f921c808)
1 parent 8cf6bb5 commit aaecf2e

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)