On Wed, Sep 10, 2025 at 12:24 PM Dragos Tatulea <dtatulea@xxxxxxxxxx> wrote: > > On Tue, Sep 09, 2025 at 08:41:02PM -0700, Amery Hung wrote: > > 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: ea5d49bdae8b ("net/mlx5e: Add XDP multi buffer support to the non-linear legacy RQ") > > Signed-off-by: Amery Hung <ameryhung@xxxxxxxxx> > > --- > > drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | 9 +++++++++ > > 1 file changed, 9 insertions(+) > > > > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c > > index b8c609d91d11..1d3eacfd0325 100644 > > --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c > > +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c > > @@ -1729,6 +1729,7 @@ mlx5e_skb_from_cqe_nonlinear(struct mlx5e_rq *rq, struct mlx5e_wqe_frag_info *wi > > struct mlx5e_wqe_frag_info *head_wi = wi; > > u16 rx_headroom = rq->buff.headroom; > > struct mlx5e_frag_page *frag_page; > > + u8 nr_frags_free, old_nr_frags; > > struct skb_shared_info *sinfo; > > u32 frag_consumed_bytes; > > struct bpf_prog *prog; > > @@ -1772,17 +1773,25 @@ mlx5e_skb_from_cqe_nonlinear(struct mlx5e_rq *rq, struct mlx5e_wqe_frag_info *wi > > wi++; > > } > > > > + old_nr_frags = sinfo->nr_frags; > > + > > prog = rcu_dereference(rq->xdp_prog); > > if (prog && mlx5e_xdp_handle(rq, prog, mxbuf)) { > > if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) { > > struct mlx5e_wqe_frag_info *pwi; > > > > + wi -= old_nr_frags - sinfo->nr_frags; > > + > > for (pwi = head_wi; pwi < wi; pwi++) > > pwi->frag_page->frags++; > > } > > return NULL; /* page/packet was consumed by XDP */ > > } > > > > + nr_frags_free = old_nr_frags - sinfo->nr_frags; > Just double checking that my understanding is correct: > bpf_xdp_adjust_tail() can increase the tail only up to fragment limit, > right? So this operation can always be >= 0. > Right, AFAIK bpf programs cannot add fragments to xdp_buff. > If yes: > Reviewed-by: Dragos Tatulea <dtatulea@xxxxxxxxxx> > > Thanks, > Dragos