Commit 40afb3b1 authored by Dragos Tatulea's avatar Dragos Tatulea Committed by Saeed Mahameed
Browse files

net/mlx5e: RX, Fix XDP_TX page release for legacy rq nonlinear case



When the XDP handler marks the data for transmission (XDP_TX),
it is incorrect to release the page fragment. Instead, the
fragments should be marked as MLX5E_WQE_FRAG_SKIP_RELEASE
because XDP will release the page directly to the page_pool
(page_pool_put_defragged_page) after TX completion.

The linear case already does this. This patch fixes the
nonlinear part as well.

Also, the looping over the fragments was incorrect: When handling
pages after XDP_TX in the legacy rq nonlinear case, the loop was
skipping the first wqe fragment.

Fixes: 3f93f829 ("net/mlx5e: RX, Defer page release in legacy rq for better recycling")
Signed-off-by: default avatarDragos Tatulea <dtatulea@nvidia.com>
Reviewed-by: default avatarTariq Toukan <tariqt@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent c8e90902
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1746,10 +1746,10 @@ mlx5e_skb_from_cqe_nonlinear(struct mlx5e_rq *rq, struct mlx5e_wqe_frag_info *wi
	prog = rcu_dereference(rq->xdp_prog);
	if (prog && mlx5e_xdp_handle(rq, prog, &mxbuf)) {
		if (test_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) {
			int i;
			struct mlx5e_wqe_frag_info *pwi;

			for (i = wi - head_wi; i < rq->wqe.info.num_frags; i++)
				mlx5e_put_rx_frag(rq, &head_wi[i]);
			for (pwi = head_wi; pwi < wi; pwi++)
				pwi->flags |= BIT(MLX5E_WQE_FRAG_SKIP_RELEASE);
		}
		return NULL; /* page/packet was consumed by XDP */
	}