Skip to content

Commit afd5ba5

Browse files
ameryhungkuba-moo
authored andcommitted
net/mlx5e: RX, Fix generating skb from non-linear xdp_buff for legacy RQ
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>
1 parent a73ca04 commit afd5ba5

1 file changed

Lines changed: 19 additions & 6 deletions

File tree

  • drivers/net/ethernet/mellanox/mlx5/core

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

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

17961796
prog = rcu_dereference(rq->xdp_prog);
1797-
if (prog && mlx5e_xdp_handle(rq, prog, mxbuf)) {
1798-
if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) {
1799-
struct mlx5e_wqe_frag_info *pwi;
1797+
if (prog) {
1798+
u8 nr_frags_free, old_nr_frags = sinfo->nr_frags;
1799+
1800+
if (mlx5e_xdp_handle(rq, prog, mxbuf)) {
1801+
if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT,
1802+
rq->flags)) {
1803+
struct mlx5e_wqe_frag_info *pwi;
1804+
1805+
wi -= old_nr_frags - sinfo->nr_frags;
1806+
1807+
for (pwi = head_wi; pwi < wi; pwi++)
1808+
pwi->frag_page->frags++;
1809+
}
1810+
return NULL; /* page/packet was consumed by XDP */
1811+
}
18001812

1801-
for (pwi = head_wi; pwi < wi; pwi++)
1802-
pwi->frag_page->frags++;
1813+
nr_frags_free = old_nr_frags - sinfo->nr_frags;
1814+
if (unlikely(nr_frags_free)) {
1815+
wi -= nr_frags_free;
1816+
truesize -= nr_frags_free * frag_info->frag_stride;
18031817
}
1804-
return NULL; /* page/packet was consumed by XDP */
18051818
}
18061819

18071820
skb = mlx5e_build_linear_skb(

0 commit comments

Comments
 (0)